« Return to show page
Transcript for Episode #110:
Python Year in Review 2018 Edition
00:00 KENNEDY: Hey folks, Michael here, Brian and I have put together a special podcast episode for the top Python stories of 2018, we originally recorded this as a Talk Python To Me episode, that's my other podcast, since it's a perfect match for what we do every week here on the show, Brian and I decided to share it with all of you for our end of year countdown on PythonBytes. We hope you enjoy the episode, and thank you for making the show so successful in 2018, and promise we'll keep it going Strong into 2019. Brian and Dan, both of you welcome back to Talk Python.
00:56 GUESTS: Thank you. Hey, thanks, great to be back again.
00:59 KENNEDY: Yeah, it's great to have you back. As always, it's going to be so much fun, and it is time to look back on 2018. Can you believe it's the end of 2018? I just remembered how to write 2018 and not 2017 on all the stuff I have to sign.
01:12 GUESTS: Yeah, it's gone by fast. It's the worst.
01:15 KENNEDY: It definitely has, it definitely has. So, it's good to have you back. We're going to go through what the three of us have decided are some of the top stories in the Python space for 2018 and I just wanted to quickly throw out there for folks listening, this mostly does not include data science stories, there's a little bit here and there but it's mostly pure Python, and the reason is, I'm also doing a show on data science year in review so save those big stories for that one. Don't want to overlap, all right, well, we're going to start and do a top 10 countdown, and we're going to go from really interesting, to the absolute big news at the end, and you can see what story we have picked to be the number one story of 2018 for the Python space. Let's do a little warmup here, and Dan, I'll let you kick this off, what was our number 10 item?
02:07 GUESTS: Sounds good, so our Number 10 is the Python 3.7 release and more specifically, the performance optimizations in there, and I know you had a really good show on the podcast here with Anthony Shaw where you guys talked about some of the changes in 3.7, and I just thought that 3.7 should be on this list because it was a really, really good release, you know, it was a lot of free performance improvements, it's always nice to see that, and it's just been awesome to see Python 3 and CPython 3 specifically get so much love and that it's under active development and it's making this forward progress, and I think it's also the release, or I think it was either 3.6 or 3.7 where Python 3 is now faster, in all of the benchmarks, than legacy Python, except for startup time, so I thought that's kind of a nice milestone for Python 3.
02:57 KENNEDY: I think that's a huge milestone for Python 3. I mean, this is sort of the year that the tide has turned for Python 3, in a big way. I think it was starting to turn before, but really, this year, I think that's one of the themes, and this is a major aspect of it, right, that Python 3 is now faster. There were always these couple of reasons people say, I'm holding out to Python 2, you guys with your fancy Python 3 and your new keywords can just go play, because my code is faster, and faster beats everything, right? Well, maybe not.
03:28 GUESTS: Yeah, well, I mean, faster never really beats everything. It's faster development time, too, and when you have better data structures, you can sometimes develop faster. However, you're right that a lot of people were holding out because of some of the speed and, you know, for some applications, that makes sense, but yeah, I think 3.7 is definitely faster and the other thing is, a lot of people had already, some people for some of their projects had already switched to Python 3.6, and that was probably from 2.7 to 3.6 was not an easy switch. Having a switch from 3.6 to 3.7 be like, oh, I don't have to do anything, it's just better now, that was a nice thing to have.
04:09 KENNEDY: Yeah, that's super nice, and I think that's a really great point you raised, Brian, that, you know, careful what you're optimizing for, right? Like, if it was really all about speed, wouldn't we be just writing assembly code still? You know? I mean, I bet somebody good at writing assembly could crush the performance of Python or a lot of C++, but, you know, they would release an app, small app every 10 years, and it would be buggy, right? Like, there's just, it's not the most important thing, that's for sure.
04:41 GUESTS: One of my favorite examples there is, what's this game called, it's Rollercoaster Tycoon, which was written by one person, in Win32-x86 assembly. It's like 100% assembly code, and it's actually an amazing, amazing game, and it just blows my mind, like everything was written in assembly language.
05:04 KENNEDY: Wow, it probably runs, like, totally smooth on like a 286 or something, right?
05:09 GUESTS: Yeah, no, I think you needed a Pentium or something, but...
05:10 KENNEDY: Pentium.
05:13 GUESTS: Yeah, now somebody's working on, like, a Python remake, going to need to, I dunno, multi-core CPUs and whatnot to run at the same performance.
05:24 KENNEDY: Yeah, who knows, but you know, another, another interesting thing that's coming out is more and more talk about actually compiling Python, which I think didn't make the list, but it's definitely something that came up, like mypyc for example, and Cython and whatnot. So, if we're going to release a new library or an awesome game, like Roller Coaster Tycoon or something like that and we were going to do it in open source, probably the main full release after it's, like, totally stable and it's been out for a year would be, like, 0.01 or 0.03, maybe, like a 0.12, I dunno. Something really really small, right, like that, right? And that's been a theme that's gone through a lot of open source, so I think I'd like to highlight a little bit of shift in just the versioning that seems to be happening around projects. I want to kick off this part of the conversation with talking about Mahmoud Hashemi's project called ZeroVer. Brian, do you remember covering that on Python Bytes?
06:25 GUESTS: Yeah, he released it, like, as an April Fools thing, but it actually highlighted a lot of things about different projects that were zero ver, after like, you know, years.
06:36 KENNEDY: Yeah, so the idea is, kind of like I was describing at the beginning, and like, so many projects just never even reach version 1.0, and in some sense it doesn't matter. Is the version number smaller or bigger? That tells you whether you have an old or a new one, right? So, that's fine, but there's a lot of people, especially coming from the enterprise space or from the commercial software space, that sees things like 0.20 and go, oh, that thing's like a super alpha. We're going to stay away from that until that reaches 1.0. And I think it has a tangible effect on turning off a certain category of folks, especially people who are maybe unfamiliar with open source and things like that.
07:15 GUESTS: Yeah, I think definitely we, I mean, a lot of people do commercial software development like I do, and the zero versions always, or almost always mean the API is in flux, you can't trust it, you shouldn't program against it, because it can, the developers can change their mind at any time, and it isn't until the 1.0 version where we have a stable, a stable API that people can count on.
07:43 KENNEDY: Yeah, and so I think a lot of people perceive it that way, right?
07:46 GUESTS: It's interesting to consider the version number as part of the user interface, you know, for an open source project, which makes absolute sense because of those effects where people are like, yeah, you know, is this really ready to go here? Is this an early release or whatever? I mean, I'm wondering if it's really going to have a big impact and if people are moving to something like dating their releases, like, just calling them 2018 dot something something, and you sort of get the November release, but it's an interesting experiment for sure. I mean, it definitely looks a little bit nicer than, you know, having, I don't know, like somebody put Pandas here, which had like 83 releases and it's been running, or it's been active for eight years and it's sitting at 0.24 which is...
08:27 KENNEDY: 0.dev.0
08:29 GUESTS: .dev.0! Nothing wrong with dev.0.
08:33 KENNEDY: That's the production version, right?
08:35 GUESTS: It turns some people off, yeah.
08:36 KENNEDY: I don't know how dev zero means production, but, you know, to me, that just says like, dude, stay away from this, don't ship this.
08:43 GUESTS: It's a little scary.
08:44 KENNEDY: Yeah, I think the, you know, maybe the grandfather of zero ver might be Putty, you know, that little SSH tool you get for Windows 'cause it doesn't come built in, that little tray app, it's 20 years old, and it's 0.7.
08:58 GUESTS: One concern that I have with moving to the date-based or like year-based version numbers is how, like, if you have the semantic versions, you can do things like, okay, I want, give me all the minor patches for this package and all the security updates, but I don't want to jump to the next major version, which maybe has breaking changes in it, and I know that's not a perfect system generally, you want to pin your packages, but it's kind of nice to have the ability to do that, and with, you know, who knows what's going to happen in, like, July 2018 or something, '19.
09:26 KENNEDY: Yeah, absolutely, so if you look at some of the tools that I know you use and I use, for example, I use pyup.io and you use something slightly different, but they let you got to your requirements file or your pip file and say, I want you to keep this on the latest pinned version possible with this constraint, where you could say, like, 0.1.* or something like that right?
09:48 GUESTS: Right, yeah, but, like, how would that work with, you know, date-based formats?
09:52 KENNEDY: Exactly, so let's dig into that a little bit, so what are the two options? I guess the two options are just to, like, to start shipping, like, full versions, like Django is now Django 2, and the Django 2, the main change from one to two is we're dropping Python 2 support, which is kind of ironic, maybe it should be Django 3, but whatever, you know, it indicates a major change like you were saying there, right? So one of the projects that's switching to calendar-based version is Sanic, right, the async web framework? And what they're doing is they're trying to ship a version, a major release every quarter, so they might be 2018.07.0 then dot one, dot two for, like, incremental changes, but they're also doing LTS releases around their calendar version, so every December is an LTS version, so 2018.12.0 and so on would be supported for a year and would be the LTS equivalent, the long-term support equivalent, if you don't want to switch to something beyond that. That's how that group is handling it.
10:57 GUESTS: Interesting, yeah. I kind of like that. Then you can glance at a version and, I mean, if everybody sort of supports something like that, you can glance at all of your versions and go, oh, everything's within a year or so, so that's probably fine.
11:11 KENNEDY: Exactly, like, Brian, you know a lot about testing. If I told you I'm using WebTest .2.0.32, is that new, is it super old, is that a beta version? Like, what is that, right, you don't know. But if I told you I was using WebTest 2019.1.0, like, oh, you must be testing the new one that's coming out, you know, something, it's just, communicates it. Sanic is doing this, pip is doing this, and then you threw some others in there, Brian. What are these, I'm not familiar with them.
11:38 GUESTS: There's some descriptions of calendar version and semantic versioning, calver.org and semver.org.
11:43 KENNEDY: I love that those are domains.
11:47 GUESTS: I think Mahmoud released one of them, maybe both.
11:50 KENNEDY: He has this knack for creating these little sites, and these little projects that just pop out of nowhere.
11:54 GUESTS: But the, one of the things I want to point out is, I was talking with somebody about calendar versioning and that versus semantic versioning and one of the things is that the major number, whether it's two or three or it's a date-based, often means you're not going to, you're not going to remove features, so you promise not to break customer code within a major version. The date-based kind of says that we're at least going to stay, it's safe for a year, whereas semantic versioning, you know, a development team can go through major versions as fast as they want to if they feel like breaking things fast.
12:31 KENNEDY: That's true, that's true, it's just, when you get the feeling to switch the major version from 2 to 3 or 3 to 4, you just do it, right?
12:38 GUESTS: Yeah, but it has impact, so yeah, I think, there's some interest there, so.
12:43 KENNEDY: I think another thing that was really interesting about the calendar versioning that I learned talking to Adam Hopkins from the Sanic project was, that there's this sense of, you need to keep shipping, right, like, if you have a calendar version and it's from last year and that's the latest version, that sends a message in and of itself that this project is not getting a lot of activity, whereas without it, you kind of got to be more deeply familiar with the project to understand its rate of improvement.
13:10 GUESTS: Yeah, I think even, it'd be cool to have people, even if there's not really any changes needed, just to release and say, hey, we tested it, this has all been tested on the new versions and you're good to go, we updated, like, the readme file or something.
13:24 KENNEDY: Right, well, I'm, there's almost always like some minor little thing that can be improved and shipped, right? Another story of 2018, and maybe slightly before, but really was coming in strong in 2018 is, Python's kind of popular.
13:42 GUESTS: Yeah, so, Python's very popular, it's taking over the world. There was a neat Economist article that came out and I guess that's sort of related to the, they're highlighting a trend, and the article was that Python has brought computer programming, programming to a vast new audience, but some of the things they point out within there is that right now, according to a Stack Overflow survey, 40% of professional developers use Python and another 25% wish they did, which is interesting. Just go do it, man. Also, they interviewed Codecademy, which is an online training site, and their biggest increase in demand for 2018 is with Python.
14:24 KENNEDY: Yeah, that did surprise me. I mean, you think about a very fast growing technology that also has a lot of career possibilities, definitely people are going to be wanting to learn that, right, so, if you go to somewhere like Code Academy or any other online training place, like, there's going to be, unless they're doing something wrong, there should be a lot of demand for Python.
14:45 GUESTS: They noted that since 2014, at least from a survey in 2014 Python was the most popular intro language at American universities, but that was amongst people studying sciences or computer science or something, engineering, but what we're seeing now in 2018 is the growing movement of people that are not traditionally, think of themselves as programmers primarily, learning Python, and we'll see that in data sciences, embedded development is now moving towards Python in a lot of maker senses, and then also, the article also pointed out that more and more people are just sort of worried that all jobs will be taken over by automation, so they want to be part of that, so in order to learn some automation on your own, Python is a good way to be part of that.
15:32 KENNEDY: You either control the robots or you get replaced by the robots. Take your pick, right?
15:37 GUESTS: If you run Python. Yeah, also, to throw in there, I saw this on Nina Zakharenko's Twitter feed recently, so Python is becoming, or has been nominated as the official programming language for education in France, so I think it's going to be part of the high school curriculum there, which is, that's super cool. I think it's, we're seeing the snowball effect, you know, where people, it's really becoming the dominating language for beginners and educational language, and I think that's super cool.
16:03 KENNEDY: That is so cool, and when I saw that, on Nina's post, as well, I'm like, oh, that is amazing, and you know, I've been thinking a lot about this, like, why is Python both popular as a teaching language and popular as a professional programming language? Like, C++ is popular as a professional programming language but they don't suggest that kids start with it, right? Things like this. I think there's this special balance that when the language was created, it has this way to get started easily and to pull in just the aspects that you want, right? So you can start out with not even functions, and then, like, okay, I need some structure, I'm going to put some functions in here. Oh, let's start working with classes and things like generators, but none of that, you don't have to understand or use or care about that until you're ready. Python has a special ability to start easy and small but expand into professional type of apps, whereas a lot of them are either, you're always a beginner type of language, or you're always like, yeah, that's a void**, kids, let's talk about that.
17:03 GUESTS: Totally, yeah. Exactly. I actually, Mike, I think you called it a full spectrum language, way back when, when we did an interview on my blog with you, and that just really stuck with me, because I think that that's so true, you know, where it's not just, it's not like you're learning, you know, like the little like turtle, like Logo or something like that where it's like, you learn the basics of programming and you're sort of stuck and you have to move on and learn something else, but no, you can, all the skills you learn working with Python, they kind of scale and grow with you and that's just a beautiful thing.
17:33 KENNEDY: It's special, there's not many that are languages like that.
17:12 GUESTS: What a time to be alive.
17:12 KENNEDY: It really is an amazing time to be alive. Before we go to the next one, let me just tell you all about DigitalOcean, they're doing all sorts of cool stuff, our infrastructure runs on it, really, really nice and reliable, one of the things I Want to highlight this time, is their work with Kubernetes, Docker, and coordinating Docker, orchestrating Docker stuff with Kubernetes is a big deal these days, so they are launching a new Kubernetes cluster over at DigitalOcean, so a really nice way to manage and deploy your container workloads in the cloud, And if you go to PythonBytes.fm/digitalocean, and you're a new user, you get $100 credit, to Kubernetes all the way if you want, you can run a lot of Kubernetes for 100 bucks in the cloud. So that's pretty awesome.
17:57 GUESTS: That's very cool.
17:59 KENNEDY: So check them out, pythonbytes.fm/digitalocean, they're big supporters of the show, and they keep us going strong each week don't they?
18:05 GUESTS: Yeah, I'm very grateful for them.
18:04 KENNEDY: Brian, you touched on that a lot of the growth of Python was centered around people who are using Python as a tool, maybe not as their identity, right, like, Python developers are like, ah, I'm a Python developer, but other people are just using Python, maybe for data science or things like that, and so, number seven in our list is that, I'm going to declare 2018 as the year that the number of data scientists have come to equal the number of web developers in Python, for professional Python developers or users, let's say.
19:01 GUESTS: Okay, you're going to have to back that up a little bit.
19:04 KENNEDY: All right, so, so there was a really cool survey done by the PSF, in conjunction with JetBrains. JetBrains did the infrastructure for sort of analyzing it and hosting it and so on, but it was promoted just through the PSF and other public sources, so it's not like tied to JetBrains, but they did this really great survey, and it's called the Python Developers Survey 2017, which might sound like I'm wrong in my year, and sort of I am, but this is the very end, this is like, November, December, or something like that, of 2017, so it's pretty much there, and they did a bunch of interesting, they asked a bunch of interesting questions and they found out a lot of things. For example, four out of five Python developers use Python as their main language, so when you see people are using Python, mostly they're using that as their main language. It's not like, well, I write in C, but I also have this script that, like, compiles it in Python or some weird thing like that, right? So the majority of people using Python, use it as their main language, and that's pretty interesting. But, the thing that I want to point out is, they said, what do you use Python for? And if you pick where Python is main, versus where Python is secondary, you get slightly different answers, but, generally it says, for data analysis and data science, 50% of the people use it for that, and 49% of the people use it for web development. Then there's a whole bunch of other areas that, like, you know, it's a multiple answer type of thing, so, they've also checked those off. But, in this survey, basically they said, 50% of people said data analysis, 49, web development. Does that surprise you guys?
20:41 GUESTS: No, not really.
20:44 KENNEDY: I think it surprised me. I know there's a lot of data scientists. I feel like on a web development team, there's more participants than on a data analysis team. I feel like data analysis is often done by a smaller group of people than, like, the 30 people that maintain the website, or whatever, right? That was my conception, I don't know if it's accurate. But, apparently no, either there's even more data scientists than I guessed, or there's larger teams of data scientists and smaller teams of web developers. So this is all interesting, another thing that I thought was pretty interesting around this is, they asked people to guess that ratio, in the survey, and they gave them, like, five choices, four choices, something like that, and they said, what do you think the ratio is? Five times the number of web developers to every data scientist, one to one, maybe worse, like 10 to one, I can't remember, but, when they asked that question to the group, half of whom were data scientists and half of whom were web developers based on the original question, the responses they got, only 10% of the people got it right. 20%, and most thought that it was five to one, five times web developers to one data scientist.
21:59 GUESTS: Hm.
22:01 KENNEDY: So, I think the general perception is, there's more stuff happening on the web around Python than there are data scientists, but I think also what the most surprising thing to me when I saw that result was, half of the people that answered that question were data scientists you know? And so, to me, my interpretation is, that means that a lot of the data scientists feel like they're not as big of a representative group of the community as they are. They feel like, oh, we're like 20% of the community, but in fact, they're like half, and I don't know why that is but I think it's interesting.
22:32 GUESTS: It is interesting. While there's definitely, like, if you look at the hype around different packages, for instance, there's more packages that are web-related than there are data science-related. Mostly, I think because a lot of the data science tools have been bundled into these large groups of tools, even though...
22:51 KENNEDY: Right, like scikit.
22:52 GUESTS: Yeah, so they have like a common set of things that they work, like, data scientists like to all use sort of a handful of different tool chains, whereas web developers like to go off and create their own asynchronous library.
23:20 GUESTS: This sort of reminds me of, who coined that term, Scott Hanselman, I think. The concept of the dark matter developers.
23:27 KENNEDY: Yes, so I was thinking that, too.
23:28 GUESTS: Yeah, yeah, I think you actually told me about it, so I guess the idea is that, there's a large segment of the programming population, are people who program for, even for a living sometimes, that are just not visible, in the community, they get their work done, and it's just not, maybe they don't identify as a programmer or it's not just something, it's just not something that they do publicly or have, like, side projects and stuff like that.
23:52 KENNEDY: It's a job.
23:53 GUESTS: Nothing wrong with that.
23:53 KENNEDY: Yeah, and most people, like, they don't go to conferences or go on social media and go crazy about their job, like, like, if I was a barista, nothing wrong with that, but like, I probably wouldn't go to barista conferences and go to barista meetups, and like, you know, talk about being a barista on social media very much, right, like, it just, it's just...
24:11 GUESTS: Start a podcast about...
24:13 KENNEDY: Yeah, you'd actually probably have some awesome stories if you did that.
24:15 GUESTS: Make coffee for me, dot FM.
24:20 KENNEDY: Hey, anyone out there listening, go for it. That's it, it's all you.
24:22 GUESTS: I'm going to get that domain. I would listen to that. I think there's a lot, a huge number of companies that have one data scientist, or data analyst, in their company, and so they feel outnumbered because they're the only one in their company, or there's, like, the ratio is very much skewed within their company, but they're kind of all over the place.
24:41 KENNEDY: Yeah, I totally agree, I do think there's a little bit of this dark matter stuff possibly happening here. Maybe you're not allowed to talk about your analysis that you're doing, so you just don't. Maybe you've backed into becoming this data scientist business sort of analyst type person. You started as, like, a trader, and then you kind of were the person that had enough code to, like, figure out how to do the overall reporting and analysis and whatnot, and you still don't think of yourself as a developer, but you effectively are, right? So, I don't know, I think there's a lot of interesting angles here.
25:10 GUESTS: Yeah, yeah, also, I was just thinking, a lot more secrecy, maybe, in those areas, like if you're working on some, a state-of-the-art, like, machine learning thing, I dunno, self driving cars or whatever, maybe you don't necessarily want to go out there and share with the world what you just did, whereas in the web development work, I feel like we're sort of, you know, we figured most of it out, and so people are more willing, I think, to share what they're working on, at least that's the impression that I got.
25:37 KENNEDY: And often, it's, I agree, and it's on the web already, whereas if you're working on the Apple self-driving car, like, you can't even acknowledge its existence, right? You're like, working for the CIA. Yeah, I work for the State Department, okay. So, anyway, if you want to dig into more of this, I had Ewa Jodlowska and Dmitry Filippov on. They're the two folks who did this, and they presented at PyCon, so on Talk Python 176. All right, item number six, Brian, what've we got?
26:06 GUESTS: We have a darkening of the community. This is a very dark topic.
26:08 KENNEDY: It is a little dark. But kind of in a good way.
26:13 GUESTS: Black is taking over, Black is, there's, not in a bad way. The Project Black is a code formatter that just sort of formats all your code for you and did, like, PEP 8 and some of those Flake8 and stuff tools where to tell you where, places where you might want to look at your code and change it, whereas Black is, yeah, I can tell you, if you want me to tell you, but I'll just go ahead and change it.
26:39 KENNEDY: That's awesome.
26:40 GUESTS: Sort of taking, there's a lot of projects around the web around Python that are picking it up, and using it as their standard, and I think it's been definitely very interesting in 2018 watching this happen. I love that tool. So, it's so good, like especially if you, if it's a community project, you're working on a project with several developers, and it's just so easy to standardize everything and you don't have to have the back and forth conversations of defining your own code style and, I mean, assuming you like the output that Black produces, which, I personally really like, and it's been super helpful for Real Python, we have, like, a materials repository with some sample projects, so like, every single folder in there was created by a different person, by a different author, and so I went down that route of like, okay, we're going to define, like, a beautiful code style and then tell people how to format everything to make sure it's adhered to, and that's really hard to do, and so I just ran Black on the whole thing, set it up on CI so it'll check the formatting, problem solved, and it took 15, 20 minutes to do that, so, yeah, what a lifesaver, such a great tool. So a couple things about it, it's taken, it's one of the things that takes things like style and format and stuff like that and takes those out of code reviews and so code reviews can just be focused on algorithm and design, and not on whether you used single quotes versus double quotes or something. The other thing is, Black shows an example. It has part of it is a pre-commit hook, so that you can add a Black pre-commit, a hook to your code so everybody just, as they're checking it in, will have Black run on their code, and that highlighted the pre-commit tool for me, and I think pre-commit is being used more and more because of Black using it.
28:21 KENNEDY: Yeah, I've heard that more than once, that's pretty awesome. If you're like, wait, what's a pre-commit hook? That thing exists in Git?
28:28 GUESTS: Yeah, definitely.
28:28 KENNEDY: Nice. I like it, the slogan, like, you can have it in any color you like, as long as you want it in black.
28:35 GUESTS: Yeah, I didn't know that that was from Henry Ford until somebody told me about Henry Ford saying that about the Model T.
28:40 KENNEDY: Does it have, like, a theme song, or what's going on here?
28:43 GUESTS: Oh, well, every time I use Black, I hear Black Hole Sun, from Soundgarden, so, I went ahead and just mentioned that in our notes.
28:49 KENNEDY: Black Hole Sun is, Soundgarden was such a good band. They really came from, like, a special era of music. We had them, Pearl Jam, Alice In Chains, Dinosaur Jr., like, there's a lot of good stuff back there, but this is the only one that seems to be making it to a Python package, so, way to go, Soundgarden. All right, Dan, for item number five, I feel like, for a really long time, it was like, well, pypi.python.org/pypi is a little bit out of date, and a little bit crummy but we're working on it, and it just, it seemed to be in this, like, stasis of, like, half improved, forever, but not anymore, right?
29:28 GUESTS: Yeah, the new, new PyPI, the new Python packaging index, went live this year and what an amazing improvement. I mean, like, you know, throughout the whole project and I know you had a really, really great show where you interviewed, you know, a bunch of people working on that transition and launching the new and improved PyPI, and it's just crazy, you know, like throughout the whole thing, it's been, like, rewritten from the ground up the way I understand it. It's new hosting infrastructure, and it's much more friendly now, for new contributors. Beforehand, I think it was sort of like a homegrown web framework, because, well, it was, old PyPI was created before web frameworks really were a thing in Python.
30:04 KENNEDY: It was like, here's the socket. Let's start with that, like, wait wait wait wait, what?
30:33 KENNEDY: I think it is super nice as well, and it's silly to say that it matters that it looks good, because it's just pip install a thing, but I think it really communicates a message to people who come into Python, or who are using Python, but especially people who are new and they don't, they're like, oh, what is this stuff? Oh, there's a package injection, like, whoa, that thing is, like, from the '90s, what is that, right? Like, that, I mean, that communicates something about how much the community cares for that kind of stuff, right?
31:01 GUESTS: Yeah, they also rolled that over with, like, everybody in the world using it, and very little hiccups.
31:08 KENNEDY: Yeah, it definitely is. It's super impressive, so a couple of interesting notes here when they rolled it out first, it was pypi.io, and I thought, oh, they're just being part of this hip new .io, you know, it's like, it's like the .ly of yesteryear, you know? It's like Libia all of a sudden became a super awesome place to have your domain name 'cause it had ly on the end, and so io, right, is super popular now, but now it's pypi.org, and the story is, the pypi.org was owned by somebody else, and it took a long time for the PSF to get it from them, whereas they could go and buy pypi.io, so that was like an intermediate step in the whole rollout.
31:50 GUESTS: Yeah, some of the nasty details of web development.
31:53 KENNEDY: Exactly, and then the other one is, this is a pretty interesting example of a popular Pyramid web app, right, they started it out in Flask and actually said, now we'd rather go with Pyramid, which I thought was a pretty interesting choice, being a fan of Pyramid myself, and then Brian, finally markdown, right?
32:09 GUESTS: Yeah, so the old PyPI was, did not support readme.md, it would only, was readme dot, what is that, RSL or something, or...
32:17 KENNEDY: Yeah, RST.
32:19 GUESTS: Restructured.
32:19 KENNEDY: Restructured.
32:20 GUESTS: RST, yeah. So, I try to avoid restructured text as much as I can, no offense to everybody that loves it, I don't.
32:26 KENNEDY: Yeah, I hear you, it's like markdown but it's broken. The stuff you put in there doesn't quite work, just kidding.
32:34 GUESTS: No comment.
32:34 KENNEDY: Just kidding. Just kidding, I'm just saying the markdown stuff doesn't always work either. All right, number four, item number four, Brian, what've we got? You touched on this a little bit before.
32:45 GUESTS: Yeah, I think it's been fun to watch, it was unexpected, the rise of Python in the embedded world. We actually did a segment on this in, on Python Bytes, but there's so many in, partly from the maker movement, and a lot of people trying to get into controlling their, not just their computers, but their world, with internet of things and also just playing with, you know, adding lights to your bicycle and things like that with microcontrollers and hardware hacking. Adafruit's been a big part of that, of pushing it, but there's a lot of projects around Python and embedded, and MicroPython is one of those and MicroPython's being used by both hobbyists and serious developers. Hobbyists are serious developers too, but I think some companies are using MicroPython as well. Adafruit has its own version of this called CircuitPython. Actually, I don't know if it's related to MicroPython or not, but AdaFruit has CircuitPython, and then Microbit is code, Python-based, for the Microbit processor, and then we even have Mu, which is the editor that directly interacts with microcontrollers running Python. It's been pretty fun to watch this year.
33:58 KENNEDY: I really think the rise of IoT and Python is just taking root now and MicroPython is so interesting to me. I mean, the fact that it can take a Lambda expression and tie it to a hardware interrupt, just, like, never ceases to amaze me, you know?
34:13 GUESTS: Yeah, that's really cool, and so, and a lot of this is because somebody wants to learn electronics or something, but they also want to make it do things, so you have to learn a programming language and it used to be, we taught people C, and like, the barrier to entry for C is huge. Having Python be able to do that is wonderful.
34:32 KENNEDY: Yeah, it is, so you talk of the IOT stuff. I learned of something from Matt Makai recently on an episode, and I want to share this with you and just see what you think, so you guys, click on this link here. Here's an IOT device using Python, and the idea is, the title of the article, this is on the Twilio blog, it's How I Potty Trained My Kids Using Twilio and an AWS IoT Button, so, so, it's a little button like those Amazon Dash buttons, and he put it near his son's bed, and apparently there're kids sharing the room and wanting to make sure he didn't wake up and make a lot of noise and wake up the other kids, so he put this button that basically has, like, a poop emoji, and you click it, and it says, "I got to go!" and the parents would come in and, like, help out the kid while he was learning, and this is written using, like, the Python API on, like, AWS Lambda and stuff like that, so, yeah, the rise of Python in IoT.
35:24 GUESTS: So cue forward 10 years, and his kids are, like, Dad, did you have to put that on the internet? This is awesome, I love this.
35:32 KENNEDY: Exactly, yeah.
35:34 GUESTS: This is great.
35:34 KENNEDY: Isn't this funny? So, yeah, I mean, funny and, like, in amusing, but also, like, actually, that's kind of helpful. I can see how that would be helpful as a parent, 'cause you definitely don't want your kids waking up and you have to be up for a few hours in the middle of the night, so if a IoT button can help that, then, get the IoT button. All right, item number three, and it's packed full of goodness here, you guys, so, legacy Python's days are fading, what do you think?
36:01 GUESTS: Well, I haven't used it for ages, so.
36:05 KENNEDY: Yeah, I haven't either, Dan? Is Real Python running on, like, what, 2.6?
36:09 GUESTS: Yeah, not a lot of legacy Python for me anymore, thankfully.
36:12 KENNEDY: That's awesome.
36:13 GUESTS: And, yeah, I mean, it's kind of crazy that it's, you know, it's sort of crept on us, the Python 2 end-of-life, and now we're not that far away anymore from it, so.
36:23 KENNEDY: Yeah, we're actually super close, and the official item that I'm linking to, as this piece of news, is Guido van Rossum's official statement. I don't know, four years ago or something, it said, yeah, Python 2, it'll be done in 2020. Whatever, right, like, that's like a broad range for a period where a thing stops, a whole year, so, we needed a more clear date, people were speculating maybe the date of PyCon might be a cool one, maybe the end, maybe the beginning, so he came out and said, let's not play games with semantics, the way I see it, the situation for Python 2.7 is that end-of-life is January 1st, 2020, and there will be no updates, not even source, only security patches after that date, period. That sounds like the end.
37:05 GUESTS: Yeah, it's a good end, though, because the, and some people might complain about the whole security patches, but this is volunteer-driven, so, it's volunteers' time and I think that to let them work on new things is good.
37:17 KENNEDY: Yeah, absolutely, and it's not like people are surprised, right, it's, it's not like, wait, last month they didn't, nobody told us there was going to be a new Python, like, it's been going on for 10 years. This will make it 12, it's time.
37:32 GUESTS: Yeah, and there's a couple loudmouths that do a podcast that have been talking about it for a couple years, so.
37:37 KENNEDY: Yeah, I think we're actually making a dent with this referring to Python 2 as legacy Python. I think it's making a difference. Not everybody loves it, but I know some people, it's been working for them.
37:46 GUESTS: Do you guys know, you know, with the no more official security patches after the end-of-life date, I mean, obviously this is a big business opportunity for other companies to come in and offer long-term Python 2 updates and stuff. Does anybody know who's doing that right now? Like, some Linux distributions, I would guess, but I don't really know what's going on in that space.
38:08 KENNEDY: Yeah, possibly, the big news that I just heard is, so, you know there's Red Hat Enterprise Linux, right? They do a lot of that kind of stuff, and the versions that they have live on for a long period of time, but they just announced that they're dropping Python 2 support from Red Hat Enterprise Linux, which, to me, sounds like, okay, even the laggards are stepping forward, so I think that that's pretty big, but I suspect that there's still a lot of support on the backend, there's been a few people who've, like, talked about forking Python 2 and just supporting it themselves, as a single individual, but it seems, I'm sure there's going to be some of that, but, like, as a company, like, let's say, I don't know, you're Bank of America, you know, like, dude, we don't need to upgrade, there's this guy. He forked it, we're good, you know? I mean, like, that just doesn't seem realistic. It's also not just the CPython runtime anymore, it's like so much more than that, so, Django no longer supports Python 2. Like, the scientific stack, like NumPy and stuff, are dropping support for Python 2, so even if you still have the older stuff, you know, you're like, well, we could just keep running, it's not just about what's running your code. It's also what you can use in your code, and you know, that's going to start looking like, it's just zooming off into the distance, so, not good.
39:20 GUESTS: Well, I mean, I think Python 2 will actually live on forever in some situations where, like, for instance, you've got something that doesn't need a security patch because it doesn't touch the internet at all, and as long as it will run on whatever CPU you're sticking it on, for some people will have, like, a huge program that they never touch because the requirements never change, and they use it every day, but it doesn't need to be flexible, it doesn't need to be worked on that much. They'll probably upgrade when they have to change the program, so. - Yeah. I'm wondering if that also means that Apple is finally moving to Python 3, and making that the default for MacOS, because the latest release...
40:00 KENNEDY: That would be so sweet.
40:02 GUESTS: It still ships with 2.7.10, I think, yeah.
40:06 KENNEDY: Yeah, that would actually be really really nice. You know, it's starting to shift in Ubuntu and just different Linux distributions, but also on MacOS, yeah, that would be super cool. This portion of Talk Python To Me is brought to you by us. Have you heard that Python is not good for concurrent programming problems? Whoever told you that is living in the past, because it's prime time for Python's asynchronous features. With the widespread adoption of async methods and the async and await keywords, Python's ecosystem has a ton of new and exciting frameworks based on async and await. That's why we created a course for anyone who wants to learn all of Python's async capabilities, Async Techniques and Examples in Python. Just visit talkpython.fm/async and watch the intro video to see if this course is for you. It's only $49 and you own it forever, no subscriptions, and there are discounts for teams as well. Brian, you're talking about things that don't require security patches. I just saw a video from NASA talking about their trip to the moon and setting up a base there, which is just awesome, so they have, like, all this sort of quick different scenes of people doing stuff, and one of the scenes was them working, they had Sublime open, like editing a bunch of Python code, controlling, like, something about the moon mission, which was pretty cool, but I didn't catch whether it was two or three, I couldn't tell.
41:32 GUESTS: That's pretty cool.
41:33 KENNEDY: Yeah, someone else on Reddit did catch that Sublime was unregistered, by the way, okay. So... I guess a final thought here is, we've also talked about this on PythonBytes, is that there's the pythonclock.org, the Python 2 death clock, and it has been updated for this new end-of-life statement, and it reads, one year, one month, two days, so when people are out there and they got to start upgrading like, the death clock is ticking. All right, I also got item Number 2, and that, I would categorize as the end of innocence for PyPI and pip, so we've heard about a couple of issues, one, like, right before 2018, like late 2017, and then another one again this year, about people posting or taking over control and posting some form of evil PyPI package, and primarily, they look like they're kind of either a research project, a prank, or some kind of, like, Bitcoin theft, so, one of them installed, like, a clipboard monitor that would watch for Bitcoin addresses and as soon as it saw one, it would, like, ship that off to, like, the mothership or something to that effect, but I don't know of anything super bad that's happened, but I guess until, you know, 2016, 2017, PyPI as a place was just, it's incredible to me. It's a place on the internet that was entirely unprotected and yet, safe, okay, imagine that. If you had, like, an open FTP server and you just put it on the internet like, all sorts of badness would happen to that thing, in a day. It would be full of all sorts of things you don't want it to be full of, and here, PyPI was going along, and it was just, you know, the community sort of policed itself and took care of itself.
43:21 GUESTS: Plus, it used to be really hard to become a person that could push things to PyPI.
43:26 KENNEDY: Yeah, maybe it correlates to the shipping of pypi.org.
44:02 KENNEDY: That is so bad.
44:02 GUESTS: I don't know if it was a payload, but it was really exploding quickly, and I guess the same thing could happen with PyPI, like, I don't see why not.
44:08 KENNEDY: Yeah, it definitely could, but it hasn't, and let's not give any people ideas. So, the two, the two main...
44:18 GUESTS: We're going to cut that out. Security by obscurity, come on.
44:24 KENNEDY: Exactly, right? Security by lack of creativity, okay. So, the two main problems were, basically, like that you pointed out, Dan, typo squatting, which is like, we're going to upload a package that takes a copy of Django, and then slightly modifies its setup.py, and publish it under Djengo, or Jango or whatever, like how you pronounce it without the J, right? So, if people pip install and they misspell, they get your bad thing, right, so that's one, and the other was to take advantage of folks who didn't understand why something wasn't available to them so like, if you tried to use regular expressions and you say re., and there's like, it says, well, re is not defined, you're like, well, maybe I need to pip install re. No, you just need to import it, right, it's built in. So they were targeting the built-in libraries, and I believe all the built-ins are not patched, and Brian, didn't we cover something on Python Bytes that would help guard against typo squatting, it would, like, try to grab packages that also had misspellings around your package name? I think there was something like that.
45:29 GUESTS: Yeah, I think so.
45:29 KENNEDY: I don't remember what it was called, but I think that exists, and people could find it.
45:32 GUESTS: Oh yeah, I remember listening to that episode and you guys were talking. I forgot what it's called, too, but it, like, it generates different variations of your own package names you can try and, like, register all of those.
45:42 KENNEDY: Yeah, exactly.
45:42 GUESTS: It's very work-intensive.
45:45 KENNEDY: Yeah, so it's interesting on what is the fix, and I don't know what the fix is. The PSF is trying to get more resources to support PyPI and the Python packaging infrastructure in general, but like, largely that's been improve it, do things like you talked about previously, Dan, and just shipping pypi.org, right, but this validation, if you have so many releases of so many packages, how do you even verify it? I dunno, it's tricky.
46:07 GUESTS: It's not necessarily something that can be solved with a straightforward, technology fix, right? Essentially, you're, it's a problem that all of these, let's call them online marketplaces for code repositories or whatever you want to call them, you know, if you look at the Android app store, Apple app store, I mean, the Apple app store, they have these, like, crazy intensive review processes, considering that there're millions of apps in this app store and they're reviewing every single one, and I think there's even some manual steps involved there, and even there, we've had malicious apps that were trying to steal people's private information, and it's a really locked-down platform, so I think it's really, it's a challenge that we're facing now, because we're all connected over the internet, and you know, people are really relying on these package platforms, so, it seems like it's something we'll have to try out a bunch of solutions and see what will work there. I think we should get some, all of these new machine learning Python people to get involved and take a look at it, because, conceptually, the normal updates for a package are little tweaks on what it's doing, and if suddenly, it starts connecting to different servers all over the world, or even just one, where it used to not connect to anything, that would be a change, it would be a different behavior than it was ever doing before. That should be something that a machine could catch.
47:26 KENNEDY: Yeah, actually, I think you're right, I mean, there's almost no scenario where pip install a thing should create outbound connections, besides to download the package.
47:34 GUESTS: Or, you know, even a package that doesn't normally use any connections, or use requests, suddenly adds a, you know, socket connecting or something, that's something to take a, you know, at least we can filter down to things people could take a look at and say, is something weird going on here? It would actually be sweet to have, like, a CPython interpreter that is fully sand boxed, that, you know, can't, like, you could just run code that people send you, you can run it safely and it wouldn't be able to write to any folder on your disk or open sockets and whatnot. That would actually be kind of sweet, and it's all interpreted, so it seems like that should be possible, I mean, it's going to take a lot of work, I guess, but.
48:13 KENNEDY: I think it's possible as well. You know, Dan, you mentioned the online app store as maybe something, I wonder if there's something like that in terms of packaging that we could add, and what I'm thinking is, like, if I go build an iOS app, I have to declare the things it's going to ask for, like it has to ask for access to contacts. It has to ask for access to GPS, so, you know, you declare it needs the GPS feature, it needs these other features, right? So what about a package that declares, like, I don't declare any network capability, so I don't talk on the network and things like, you know. I can't depend upon packages that do, for example.
48:50 GUESTS: And the flip side, none of these have caused a huge amount of damage, and I don't want to go to the point of overreacting so that everybody has to take off their shoes to travel.
48:59 KENNEDY: Yes, I know, I know.
48:59 GUESTS: Things like that.
49:01 KENNEDY: We don't want feelgood security that doesn't actually make any difference, but makes life hard for everybody. Yeah, I agree.
49:06 GUESTS: It's a good point.
49:06 KENNEDY: I don't know what the answer is, I don't know what the fix is or if there is a fix, but I would definitely declare the end of innocence for PyPI. That's my declaration as Item 2 for 2018. Dan, you have the honor of kicking off what is the Number 1 story in the Python space for 2018. What happened?
49:23 GUESTS: Oh, man. What a sad honor, though!
49:26 KENNEDY: Well, yeah, I know. It's not about the messenger, right?
49:30 GUESTS: Well, yeah, I mean, Guido van Rossum stepped down as the BDFL, which is both sad and ironic, because I guess BDFL stands for benevolent dictator for life which, I think he still is now, technically, but he's just going to be less involved with the, you know, the stewardship and leadership of CPython.
49:50 KENNEDY: Yeah, he's a little more like the Queen of England now, in a sense, right, still, still representing Python, he's still very active in the community, but he just said, I'm going to let other people deal with the decisions around it, and basically, went so far as saying, like, I'm not going to decide for you how you decide. Like, it was even a meta-non-decision, so he said, all right, you all have to figure out how to govern yourselves, and it looks like he's coming back in a little bit more, in terms of participating.
50:21 GUESTS: Well, right, I mean, I think that's one of the reasons is because he was, that his involvement with Python was just the stuff that wasn't fun, and now he gets to be involved with some of the things that are fun, like speaking and mentoring and things like that.
50:38 KENNEDY: You know, I think that's a really interesting point. I'm not sure I would want his job, the way it kind of looked a year ago, right? Just, you know, arguing over PEPs and stuff like that. And you know that if you do stuff on the internet, that it's, there's definitely a very small minority of people that are abrasive, unfriendly, it just sucks your, but even just a few people like that, will suck your energy for sure.
51:05 GUESTS: Yeah, and we still don't know what's going to happen, so we'll, maybe that'll be the story for 2019, is, what happens now?
51:11 KENNEDY: I think you're right. I think 2018 is the year Guido stepped back, 2019 will be the year that whatever, whatever takes place, going forward, is going to be that year.
51:23 GUESTS: So regarding the new governance structure for CPython which obviously, you know, for any Python developer, that should be really dear to our heart, because it's going to have such a big impact on the future of Python and the CPython project, and so the last update that I saw, and basically, we have PEP 8000 now, which is a PEP that discusses the various new proposals that have been put forward regarding the Python language governance, and I just recently saw, it was like two, three days ago, Victor Stinner's post on, discussed on python.org where he's comparing the seven Python governance PEPs, I guess like actually that the different proposals, they're separate PEPs, but are all sort of listed under PEP 8000, so there's different models that have been put forward, like, for example, leading the project with a trio of three coleaders, there could also be a community governance model, where there's no central authority, so like a total 1080 from, you know, a dictatorship to no central authority. I don't know how that would look like, in concrete terms, but there's, like, different models that are being discussed right now, and I think it's going to be very interesting to see what the CPython team ends up with there.
52:37 KENNEDY: I agree, and it's, it's pretty important, like, even simple stuff like, Lucas Lenga, also, creator of Black that we spoke about earlier, he's doing the release management for CPython for the next couple of releases, and he was thinking, like, hey, it would be great to release this yearly, but we can't even discuss having it released yearly instead of every 18 months, because we don't even know how to decide, whether we, how would we, who decides, how do we vote? We don't know, so, so many things like that are just like, on hold, until this gets figured out, so, there's a lot of pressure to make it happen.
53:10 GUESTS: Definitely, yeah, it's like, it's a total bottleneck I guess, for, yeah, like you were saying, you know, just to put out a new release, you would have to, they would have to figure that out first, and so, I'm pretty sure that also means it's going to be, a decision's going to be made relatively quickly there, so we can all move on.
53:24 KENNEDY: Yeah, absolutely, one thing you did note, though, is that Guido's starting to come back and be more active in the community again, just not in his BDFL, decision-maker way, right?
53:32 GUESTS: Yeah, I thought that was kind of cool, you know, I don't know, it might be coincidence, but I don't think it was, so as I was putting together, you know, a recent PyCoder's Weekly issue, I saw there were a couple of interviews with Guido out there, articles that had, like, little soundbites from him, so he did a really long, like, video-based interview on the MIT AI podcast, so this was actually on YouTube. It's more like a video-based show, but I think it's also podcast, that I thought was really interesting and, he also started blogging again so he has this personal blog at, I think it's neopythonic.blogspot.com or something like that and he put out a new post there and it's, I think it's, it was kind of nice to see some activity there. Again, because I'm sure it's also a sign that, you know, now he maybe feels like he has more time to do that or feels inspired to do things like that again and I think that's a really really positive sign just for his personal wellbeing, I think.
54:28 KENNEDY: I think it's a positive sign as well, and just like Brian and I were talking about earlier, a lot of his energy had previously gone into, like, debating PEP 572, and just dealing with all the, the, decision-making, and now he can focus back on, you know, what most people would want to focus on, coding, software, cool stuff like that and it sounds like he's getting back into it, so that's awesome.
54:51 GUESTS: Yeah, and I mean, you know, what a crazy responsibility to be at the center, like at the focus of it all, you know, and to be the one person that needs to make all of these decisions, and sure, you know, like, he was delegating a lot of these decisions and everything, but, the way the CPython governance was set up before, it was like, all focused on one person and yeah, I mean, it's tough to do that for several decades, right?
55:15 KENNEDY: Yeah, honestly, I was surprised that he had kept going in that role for that long, I mean, it's sad to see him step down, but at the same time, that was 25 years. Like, how many other people have a job that goes 25 years, that's high-pressure, right?
55:31 GUESTS: Yeah, it's incredible, I mean, thank you so much, Guido!
55:34 KENNEDY: Yeah, absolutely, it's, Python's a special place, and it has a lot to do with him. All right, guys, that's it. Those are our top 10 for 2018. It's been a fun year, hasn't it?
55:43 GUESTS: Yeah, absolutely. It sure has, yeah.
55:44 KENNEDY: Yeah, I think 2018 just has more good stuff to come, so, it doesn't seem like anything is slowing down, then, and that's pretty awesome. And now, before we round out the show, you have to answer the two questions, both of you, so, Brian, let's start with you. If you're going to write some Python code, maybe test a little something or other, what editor would you use?
56:03 GUESTS: PyCharm.
56:05 KENNEDY: Right on.
56:05 GUESTS: Hands down.
56:06 KENNEDY: Yeah, good one, Dan?
56:06 GUESTS: I'm still a Sublime guy, although I have been experimenting with Visual Studio Code, and it's pretty sweet, actually.
56:13 KENNEDY: Yeah, I would say, like, the Sublime, Visual Studio Code, there's probably a lot of bleed-over between those and with all the activity around Visual Studio Code, it's got to be eating into the Sublime world.
56:23 GUESTS: Yeah, definitely, probably. I like what VS Code, I like watching what VS Code's doing. They're just not quite there with the testing yet, and I'll take a look again when they get that up to speed.
56:34 KENNEDY: Yeah, I agree, I think they're doing really sweet stuff. Okay, Brian, notable PyPI package? One, preferably, that doesn't have any badness in it.
56:41 GUESTS: PyTest.
56:41 KENNEDY: PyTest, right on, Dan?
56:43 GUESTS: Sweet, so I was going to say Black again, but we talked about this at length, so, I'm going to say pytest-icdiff. It's a PyTest plugin that gives you better error messages for your PyTest assertions, in some cases, so it'll basically do, like, a more extensive, like, diff on, let's say when it's comparing two dictionaries and it'll tell you, now, those keys were added, those keys were removed, and it has, like, color highlighting, and I just found that this is like a really, really sweet little tool and I've started installing it in all of my projects that have tests, and I highly recommend it.
57:17 KENNEDY: Ah, that sounds great. I may have to go check this out.
57:20 GUESTS: Cool.
57:20 KENNEDY: All right, so, that's straight sweet for PyTest there, that's great. All right, guys, thanks so much for being on the show, and being part of this, it's so many cool things to talk about and I really appreciate.
57:30 GUESTS: Thank you. Yeah, thanks for having us. Thanks.
57:31 KENNEDY: Yep, bye.
57:32 GUESTS: Bye-bye.
56:28 KENNEDY: Thank you for listening to PythonBytes, follow the show on Twitter via @pythonbytes, that's PythonBytes as in B-Y-T-E-S, and get the full show notes at pythonbytes.fm. If you have a news item you want featured, just visit pythonbytes.fm, and send it our way, we are always on the lookout for sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy, thank you for listening and sharing this podcast with your friends and colleagues.