Transcript #114: What should be in the Python standard library?
Return to episode page view on github00:00 Hello and welcome to Python Bytes where we deliver Python news and headlines directly to your earbuds.
00:06 This is episode 114 recorded January 23rd, 2019. I'm Michael Kennedy.
00:11 And I'm Brian Aiken.
00:12 And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm/digitalocean.
00:17 Brian, how are you doing?
00:18 I am doing good.
00:19 That's great to hear. I am as well.
00:21 and I hear often people praise Python because it is a batteries included language or technology and I think that's really important but it's not a subtle debate is it? No, this was an interesting we actually there's a article we're going to link to called what should be in the Python standard library so with the batteries included we often think of that as well I don't know I used to think of it as the standard library now I kind of think of it as the standard library plus some of the recommended PyPI packages and stuff.
00:54 Exactly, like there's it's almost like an onion. You have the language, you have the standard library, and you have pip install, anti-gravity, like wrapping around it. And I agree when I think of batteries included, I think of it as like that whole spectrum. Then there's even stuff that you couldn't, can't easily install even through PyPI. Things like that are in distributions like the scientific packages and stuff. Yep, indeed. We were gonna talk about it last week, but I couldn't find an article that didn't say stuff like, this is internal.
01:20 But now I found an article on lwn.net, and I'm probably not the first one to say that this is a really ugly website.
01:30 This is technically true.
01:31 It could certainly use a little bootstrap action theme or something.
01:35 But it's by Jake Edge, and Jake Edge does a lot of good coverage of the core developer meeting.
01:41 So well done, Jake.
01:42 No, yeah, definitely great information.
01:45 This will be hard to summarize, but it But anyway, we've got somebody, I think Jonathan Underwood proposed adding LZ4 compression to the standard library because there's already some other compression.
01:57 Right.
01:58 You can do zip files and tar files.
02:00 Why not LZ4 or RAR or some random other type of compression?
02:05 Right.
02:06 And then Brett Cannon proposed making something similar to HashLib if there's a whole bunch of other kinds of compression algorithms.
02:13 maybe we could have like a compressed lib or something that had a bunch of different algorithms in it, then can of worms opens. So there's an argument against it. Basically, we don't actually, standard lib doesn't need LZ4, maybe people do, but standard lib doesn't. It already has BZ2 there, which I'm not sure what BZ2 is, I think it's a zip thing. But it's kind of late to remove it, since people rely on it.
02:41 And then kind of a discussion ensued, like if standard lib is the batteries included, shouldn't we have some way to add new batteries?
02:50 Even things that aren't needed by standard library, but other people might need?
02:54 And then there's a discussion as well of, you can't just rely on PyPI because some people don't have easy access to it or can't install things.
03:02 - Right, maybe it's like REPL, some kind of online REPL, and you can type whatever they've installed, but that's it.
03:08 That's true. There's online REPL stuff. Then there's also things like people working behind a firewall that have to have proxies to get out and use PyPI, and you have to apply for a proxy password and stuff like that.
03:23 So there's issues. And then it gets bigger as to like, well, if we're not going to add a whole bunch of other stuff, maybe we should look at the stuff we already have and maybe kick some of it out.
03:33 who would decide what gets kicked out?
03:35 And it falls along with the discussion of, well, maybe we don't really think of it as just the standard libraries, or is there batteries included, but maybe we could have a standard distribution that had some set of recommended PyPI packages.
03:51 - Right, because the initial discussion was, can we make standard lib bigger?
03:55 And some of the responses were, actually, can we make it smaller?
04:00 Can we have less stuff, not more?
04:02 which I thought was pretty interesting.
04:04 One of the, which has led to, let's make it a lot smaller, but let's make much of what is standard lib, like a standard distribution, like Anaconda versus Miniconda type of thing.
04:15 - Right. - With more or less, but you can choose that sort of thing, right?
04:18 - Yep, there really isn't a solution here, it's just an interesting discussion going on, so I thought I'd bring it up.
04:23 Anything that would happen would end up happening through PEPs, and the PEP process is sort of stalled right now, so.
04:31 We gotta figure out that first.
04:33 - Yeah, it's interesting.
04:34 I certainly see some of the drawbacks, right?
04:37 Like one of the complaints or one of the cautionary flags that was raised when they said, "Oh, could we add this?" It was like, "You're trying to give us more puppies.
04:45 "We have a kennel full of puppies "and we're really busy taking care of them.
04:48 "Like, you're trying to give us more of these modules "that we have to care for indefinitely, right?
04:54 "It's almost impossible to take something "out of the standard lid, "so maybe we shouldn't do that so much." because releasing the next version of Python means all the standard lib modules are up to date, got all their patches and any additional features.
05:09 You know, it's just a bigger software project to corral.
05:12 And so Steve Dower suggested maybe like a smaller standard library that has a standard distribution that comes with the stuff that kind of got pushed out or something to that effect.
05:20 And maybe those comes with even more batteries, like a bunch of PyPI modules curated by core developers.
05:27 And I thought that's a pretty cool idea.
05:28 Like you have a mini Python and then you've got, oh, and it comes with requests and it comes with, I don't know, pandas or like whatever, you name it, right?
05:36 It comes with some web framework included, I don't know.
05:40 Right, but it's a cool idea.
05:42 And then you could update it independently.
05:44 - One of the interesting arguments for taking things out is that there are things that are in the standard library that once you get into Python a little bit, you realize that's not the right way to do it.
05:57 The standard way to do certain things is to use requests, and requests isn't in there.
06:03 Yeah, almost nobody uses the built-in ACP library unless they are explicitly trying to go without dependencies.
06:09 Yeah, and there are people that try to do things just without dependencies.
06:15 It's an interesting thing.
06:16 For instance, unit test, one of the reasons why a lot of people recommend or say they'd rather use unit test over pytest is because unit test is in the standard library and pytest is not. And why is the unit test in the standard library? Because the standard library needs something to test itself with. Right, and that predates everything.
06:35 I mean it's very like JUnit-esque, right? It's got some old old-school style to it, but you know, that's the way it was. It can't come out. Like for instance, if we had the standard distribution, we could possibly put like unit test out and into the standard distribution. Right, and then pytest could be one of those curated modules that comes with the distribution, right?
06:56 - And those are just a couple examples.
06:57 I kind of like this idea of a standard distribution thing.
07:00 - I do too, I mean, because if there's an improvement to one of the modules there, you can pip install, upgrade it, whereas you gotta wait 18 months for it to come out with part of CPython.
07:10 - Yeah, and making, another thing is if we make the standard distribution smaller, it makes the process for releasing new versions of Python a little easier because there's less stuff to test.
07:21 - Yeah, I'm not sure if this is a good idea or not.
07:23 My first impression is I see a lot of benefits to it.
07:26 I can certainly see some drawbacks, right?
07:28 Like, oh, you got the wrong distribution.
07:30 Not only did you have to have Python 3.6 and not 3.5, but you also need to have the super duper core.
07:36 But at the same time, there's a lot of benefits to it, right?
07:38 Like the standard Python experience could get better if it came with a bunch of awesome curated PyPI packages.
07:45 - Yeah, so I'll just leave this as I, anybody, everybody involved with this, I'd like to have people just remember to listen to each other and not talk past each other, talk at each other and listen.
07:55 - Yeah, yeah, yeah.
07:56 And finally, I guess maybe just a data point.
07:58 If people look at what Microsoft did with .NET, they had a huge, huge distribution and base class library and they decided that this is not, doesn't make sense to maintain all this stuff if we're gonna have a cross platform .NET, which they created.
08:11 So they made a lot of the .NET standard library, base class library, basically pip installable, right?
08:18 Like you get this core thing and then you install the little other bits.
08:21 So it's not that different than what Steve is proposing.
08:23 - How is that received by the .NET community?
08:26 - I think it's mixed, honestly.
08:28 Like it makes life a little bit more hard, right?
08:30 'Cause you can't just use the stuff.
08:31 You're like, oh, you gotta have these dependencies and install it.
08:34 But it did make it possible for them to have a Linux and macOS version that they can now use when before it was stuck in Windows.
08:41 So they're like, this part only belongs in Windows, it can't go somewhere else.
08:44 So now it's gonna be part of this external thing that you can only get by installing that dependency on Windows.
08:49 So I don't know, there's some benefits, but also, you know, packaging is already challenging in Python, so I'm not sure I want to poke the bear.
08:55 Yeah, OK.
08:56 Cool.
08:56 It's pretty cool.
08:58 Speaking of pretty cool, something I've wanted to install but I don't have enough devices to justify is this thing called Home Assistant.
09:05 Do you know this?
09:06 Well, we've talked about it a couple times, but I haven't tried it yet.
09:09 Neither have I, because I think I might have one smart light bulb I bought on accident.
09:15 Technically, I have a Nest.
09:18 My car is electric, so it has a charger, but the charger doesn't integrate with Home Assistant, so that doesn't help me.
09:23 So I would really love to have it, but I just don't have enough.
09:26 My home is too old school and too analog for it.
09:29 Anyway, Home Assistant is this cool web server that integrates all your smart home appliances and things and collects data about them.
09:37 Can run as a web server on a Raspberry Pi, and you just leave that in your house, and it does magic, which is cool.
09:42 - Very cool.
09:43 - So Paul Cutler, one of our listeners, let us know that they have now launched a data science portal to process and work with your data that comes from your home backed by Home Assistant.
09:53 That's pretty cool, right?
09:54 - Oh yeah, nice.
09:55 You can have like temperature sensors and stuff.
09:56 - Yeah, exactly.
09:57 And it's already collecting all that data on just because what Home Assistant is, but now they've set up a special way to work with it.
10:05 So they said, look, one of the core ideas of Home Assistant is all of your data lives on your Raspberry Pi on an SD card, not somewhere else.
10:12 So they set up this Home Assistant data science website to help you work with that data and analyze it.
10:18 And then they went so far to create a new add-on for their iOS that runs Home Assistant called JupyterLab Lite.
10:27 This runs JupyterLab right on your Raspberry Pi hosting Home Assistant.
10:31 So on the same thing that is your Home Assistant, now you have a JupyterLab running there to analyze your data in place.
10:37 - All right, cool.
10:38 - Yeah, and they also created a Python library called the Haas, that's their operating system, data detective that's based on things like pandas that lets you start get going quick.
10:48 So anyway, it's pretty cool.
10:49 - Yeah, very nice.
10:50 - So if people have a smart home and they wanna do some data science-y stuff about it, or maybe even build a product for other people so that they have more data control over their home.
10:59 - Yeah.
11:00 - Yeah, so that's pretty cool.
11:01 And then finally, I think I finally decided my first IoT project.
11:06 We'll see if I can actually make it happen, but I've always wanted to build an IoT thing and I'm always like, "But I don't really have any use for one." But I think I have a use for one now.
11:13 - Oh, tell me about it.
11:14 - Yeah, so you might sympathize with this.
11:15 I know a lot of people who do things like we do would.
11:19 So I have a separate office of my garage where I can record quietly away from the kids, but especially in the summer, kids are home, they come over, they wanna talk to me, or my wife's like, "Hey, I gotta ask you something." And I might be in the middle of recording a course or talking to you, recording a podcast.
11:35 So I'm gonna get a big fat button and I can press the button, recording, not recording, and then down by the door before people even get to here, it's gonna say recording, not recording.
11:45 - Oh, that'd be cool.
11:46 - Wouldn't that be fun?
11:47 That's super easy.
11:48 - Yeah, what if you could hook it up to the Skype connection status?
11:51 - Oh, yeah, maybe so.
11:52 Do you have Camtasia running?
11:54 Are you on a Skype call?
11:55 Yeah, oh, if it could be automatic, that'd be sweet.
11:58 Yeah, why not, right?
11:58 Zoom, couple of those things?
12:00 - Yeah. - Yeah, all right, though.
12:01 There we go, it just went up a notch.
12:02 (laughing)
12:04 Pretty cool.
12:05 - It started easy, now it's hard.
12:07 - Now all of a sudden I have a machine learning problem.
12:09 No, just kidding.
12:10 Bunch of APIs I gotta learn.
12:12 That's cool.
12:13 All right, speaking of machine learning in the future, what do you got next?
12:16 - Kevin Markham over at Dataschool.io, I don't know if we've talked about him before, but Dataschool.io is pretty cool.
12:23 - Yeah, Kevin's doing cool stuff.
12:24 - This isn't a lab for him.
12:25 - Yeah.
12:26 - It's just he's got a lot of cool resources.
12:28 But he wrote an article called, "What is the future of the Pandas library?" And I didn't realize, Pandas is one of those zero-virt projects, which is odd considering everybody uses it.
12:39 - Yeah.
12:40 - But they're considering going to a 1.0 release early this year.
12:44 And there's an article describing some of the stuff that is coming new and coming with some of the new versions of Pandas.
12:51 One of the things is, we already know method chaining is becoming more popular with functional programming and people used to that.
12:58 You can already do that with a lot of stuff in Pandas.
13:00 What's new really is just that they're going to try to take that further and make more methods that support chaining.
13:07 All you have to do to support chaining is to return the object that you're operating on as a return for a function call so that you can chain a bunch of function calls.
13:15 - And a lot of times they probably return nothing, so they might as well just return the thing again so you can have this fluent API, which would be nice, right?
13:22 - Yeah, there's also people in the know might know what Apache Arrow is.
13:26 I really don't know what Apache Arrow is, but apparently it's something that can help the back end of Pandas become a little bit more efficient, and so they're gonna try to push that out.
13:36 It'll probably be after 1.0 'cause it doesn't change the interface at all.
13:39 - Yeah, it's cool.
13:40 I don't know much about Apache Arrow, but it sounds cool.
13:42 They talk about things like working with data that's larger than what you can fit into memory and things like that.
13:48 So instead of loading everything just into kind of data frame or something, it's like it'll stream the data off disk and all sorts of stuff.
13:55 It's pretty cool.
13:56 - Yep, and I know a lot of people listening to this use pandas every day.
13:59 I'm starting to use it more.
14:01 So the rest of my spiel will be stuff that I don't really know about, but you might.
14:06 One of the things is apparently it's hard to do custom data types because of some of the limitations.
14:12 So you can kind of have to jump through hoops, but there is going to be extension arrays that make it easier to create custom data types for using with pandas, which that sounds neat.
14:22 And then some things that are going away.
14:24 So some deprecations that have been proposed in place parameter, it doesn't really work as it's supposed to, and it mucks up chaining.
14:31 So they're going to try to deprecate that.
14:33 The IX accessor, which is going away or it's deprecating, use LOC or ILOC instead.
14:41 The panel data structure, apparently you should use multi-indexing instead.
14:45 And the sparse data frame never really worked as it was supposed to, so they're gonna just support data frame.
14:50 And last but not least, in the 1.0 release, they will stop support for 2.7.
14:57 - Woohoo!
14:58 Viva modern Python, right?
15:00 - Yeah.
15:01 - That's right.
15:02 Living on, so no more legacy Python, super.
15:04 Okay, I think these things are all great.
15:06 I don't use pandas enough to really say a whole lot, but I do think--
15:11 Kevin talks a little bit about the zero-ver impression of it not being ready and so on.
15:16 And it feels like these deprecations are kind of like, all right, these are a few of the rough edges of the API that we wish we could get rid of, and we're going to call it 1.0, and we're going to drop the few things that we don't really like, including Python 2.
15:29 Yeah.
15:29 Pretty sweet.
15:30 All right, also sweet is DigitalOcean.
15:33 So if you want to do anything with containers, you got to orchestrate them, you got to get them to talk together.
15:37 So check out Kubernetes and DigitalOcean just launched their public Kubernetes service, DOK8.
15:45 Super simple, managed Kubernetes service.
15:48 So you can deploy faster, configure your Kubernetes cluster in seconds and provision access your cluster in a few minutes.
15:55 You can scale reliably based on incoming traffic and everything stored in block storage and behind load balancers, stuff like that.
16:01 and people are seeing a 2.4 times better price to performance ratio compared to other providers.
16:08 So if you wanna do all that cool stuff or more with a free $100 credit for new users, check them out at pythonbytes.fm/digitalocean.
16:16 Now, I'd love to talk about something that we haven't, I don't think we've touched on it very much, but maybe packaging up Python apps, have we talked about that?
16:24 - Yes, we have.
16:25 - I do remember that now, that three week stint.
16:27 - And we will more.
16:28 - We will more.
16:30 This one is, at least it promises to be pretty excellent.
16:33 So let us count the ways there's more than this.
16:36 We have pex, which is a way to make a zip file of Python code executable with its dependencies.
16:43 We have pyinstaller, which will take a Python environment plus its dependencies and turn it into kind of an embedded Python interpreter plus like a zip file or something to that effect of its dependencies and its source files.
16:59 and then run that as like an exe or a .app.
17:03 There's py2app, there's cxfreeze, there's many of these, right?
17:06 - Yes.
17:07 - The new kid on the block is PyOxidizer.
17:10 - Okay.
17:11 - So when you take the py element and you combine it with iron and oxygen through the Rust compiler, you get the PyOxidizer outcome.
17:20 Now, so PyOxidizer is a set of Rust crates, libraries I'm guessing, maybe is the way to put it, that facilitate building libraries and binaries containing Python interpreters.
17:31 - Interesting.
17:32 - So CXFreeze, PyInstaller, you're like, okay, great, well, somebody loves Rust, and they're just like doing it again, but this time with Rust, because amazing.
17:40 But this one has some special capabilities that maybe are better.
17:43 So it makes a single executable file, an exe, or .app, or something, and all the dependencies and all the resources, like pyc files, are embedded inside the executable.
17:54 So like with PyInstaller, you get an exe, and then a bunch of loose files and like zip files and directories and somehow all that stuff gets like put back together to run.
18:03 Here you get a single AXE or executable that takes those and puts them inside the binary as a resource and then runs it.
18:10 - That's cool.
18:11 - That's cool, right?
18:12 So this is of course the oxidizer part comes from a Rust and these are compiled from Rust and basically the Rust, it becomes like a Rust executable, right?
18:22 And the Rust executable code is responsible for managing and running the embedded Python interpreter in all of its operations.
18:30 So it's like totally self-contained.
18:32 - Okay, this is kind of cool.
18:33 - It's pretty cool, right?
18:34 So it says it's like all these others that I mentioned, except for the produced executables contain embedded, statically linked Python interpreters, so no dependencies.
18:43 They have very little runtime dependencies unlike the OS it runs on.
18:47 And everything is run from memory rather than extracting temporary Python files to a directory and trying to run them from there with weird paths and stuff.
18:54 So I'm pretty excited about this.
18:55 I haven't got a chance to try it, but I want to.
18:58 - Yeah, me too.
18:58 - Yeah, it looks really promising.
18:59 It looks like this is the way it probably should be.
19:02 So I'm pretty excited if it works the way they're promising.
19:05 And you have to work with no files on the operating system.
19:08 You get one file, so it's simple.
19:09 But not all file systems are simple, right?
19:12 - Right, and actually, I love it when I can program, work on a project where I don't have to deal with the file system at all, because sometimes it's just kind of a pain.
19:21 But anybody that's using tools can go, hey, I can automate, I want to automate some part of my job.
19:27 And often that involves dealing with the file system.
19:31 And RealPython just recently put out an article called Working with Files in Python.
19:37 And at first I'm like, oh cool, another file system thing.
19:41 But it's a pretty nice article.
19:44 It's a very comprehensive write-up.
19:45 And my first, they cover both legacy ways, like the OS and sys versions to do some of these things that I'll cover in just a second, but they also use Pathlib.
19:56 I'm trying to use Pathlib more and more, but Pathlib is for more recent versions of Python, and you might not be there.
20:03 However, it might be that you're used to doing, you've done file system stuff in the past, and you wanna try Pathlib also.
20:09 So having the examples right next to each other is kinda nice to be able to say, "Hey, I used to do this in OS, "and now I'm gonna use the Pathlib version here." So that's cool.
20:19 - Yeah, yeah, quite cool.
20:20 - I'm not gonna read the article, but a lot of the stuff they might have to do is get a directory listing, what all's in a directory, looking at file attributes, creating directories, doing pattern matching on file names, traversing directories and doing stuff with the files that are there, creating temporary directories and files, deleting, copying, moving, renaming.
20:41 They include in this article how to deal with zip and tar files, including reading the contents of those.
20:47 So there's quite a bit of stuff here.
20:48 - Yeah, it's really, really nice standard comprehensive real Python article. So well done on that. One of the things that I like about this is it doesn't go here's a way to read zip files.
20:59 Here's a way to create directories. It goes here are the ways, all the ways in the standard library to do this and when you would choose this over that and why that's better and so on. So for example like with path from pathlib you can say I want to create the directories but normally there'd be an exception if it already exists, you can say, it's okay if it exists.
21:19 I just need it to be there.
21:20 Like this is a idempotent type of thing I'm trying to do.
21:24 Stuff like that, right?
21:25 Or if I want to create multiple directories in a chain, like how do I create the intermediate ones without loops and other annoying checks?
21:33 So yeah, pretty nice.
21:34 - Yeah, it's good to have all that stuff in one place too.
21:37 - Yeah, it's definitely a good reference thing, right?
21:38 Like you probably don't need, if you've got to do all the things listed here at once, I don't know what you're doing.
21:44 You've got something going on that's a little crazy.
21:46 Like I got to zip and tar stuff and create directories and get the file attributes, right?
21:51 But it's certainly good to have as a reference for when you've got to do one of them.
21:56 Yeah, but you usually have to do one or two of these things.
21:59 You might have to create multiple directories and then read the file in there or something.
22:04 Yeah, for sure.
22:05 All right, so this last one that I picked for us, Brian, this is a little bit motivated by a conversation we had before.
22:11 We had talked about having Python, the command you type on a terminal or a command prompt, being converted from meaning Python 2 to meaning Python 3 as part of this whole transition, right?
22:23 - Yes.
22:23 - I think what Red Hat was doing was basically saying there shall be no Python, you have to type Python 2 or type Python 3 on the new Red Hat Enterprise Linux.
22:31 And there was some debate about that.
22:33 So David Furfice sent a really cool thread from pep394, and it says, "Look, this thing that you sensibly suggested," or at least debated on the show recently.
22:47 It's been tried and it didn't go super well.
22:49 So Homebrew tried it.
22:50 Homebrew said, you know what, Python equals Python 3, yes.
22:54 And there was a bunch of knock-on effects and they said, we're really sorry, we kind of broke some stuff, we'll put it back.
22:59 So Homebrew tried it and they had to actually roll it back and there's a link to that conversation.
23:04 Also on the PEP 394, there's some interesting conversation over on GitHub around it.
23:11 so this PEP three nine four is allow the python command not to be installed basically uh... other minor changes so basically requiring you to type python two or to type python three so there's no way to decide python which to me doesn't feel like a great fix like we want to move to the next version of python so we're when python four comes out it's gonna be like well everyone's using python three in their tutorials and they keep breaking and it would it doesn't seem very scalable but uh...
23:40 Nonetheless, that's what the thing says.
23:42 So I want to read you a couple of thoughts that Gideon Van Rossum had about this.
23:46 So somebody said, Python doesn't exist as a command on macOS, so it's solved.
23:52 Right, so he's like, no, no, no.
23:54 Python 2 doesn't exist as a built-in command, but Python definitely does.
23:59 So however, I'm still unhappy with, basically people are saying, like, if you type Python and that means Python 2, what that is saying is the core developers prefer Python 2 over Python 3, because if you typed a simplest statement to run Python, it does old Python, not new Python.
24:17 So there's an endorsement to say, let's not encourage Python 2, legacy Python, let's have Python point to Python 3, it's what we've been saying.
24:25 So Guido said, I'm still unhappy with any kind of endorsement of Python pointing to Python 3.
24:30 When the user gets bitten by this, they're going to be really unhappy.
24:33 Regardless of what macOS does, I think I would be happier in the future if Python as a command does not exist.
24:39 And you have to say Python 2 or Python 3.
24:42 Right, so anyway, that's just a bit of a follow-up to this Python equals Python 3 discussion we had.
24:50 Yeah.
24:51 Yeah, I'm not super happy with it because I feel like, well, what happens when the next version of Python comes out?
24:55 Then it just gets complicated in the same way, but still, it's okay.
24:59 I think that's our children's problem.
25:01 That's right.
25:02 It's like global warming.
25:03 That's someone else's problem.
25:04 We're just going to kick that down the road.
25:05 Let them deal with what happens when you type Python and it goes to Python 3, not 4.
25:10 And how many other tools have like, which grep do you want?
25:14 Do you want grep 2 or grep 4?
25:16 Exactly. You want to run homebrew? There are seven choices.
25:19 Which version of homebrew you have installed do you want to run?
25:22 Like, no, I just want to run homebrew. Preferably the latest.
25:25 Anyway, yeah. I guess that summarizes our thoughts, doesn't it?
25:29 Yeah.
25:31 Cool. Well, I do have one quick extra thing. Do you have any?
25:34 - No, not right now.
25:35 - So I'll just throw this thing out here because it wouldn't be a show if we didn't mention Anthony Shaw somehow, right?
25:40 - Yeah, he's a good friend of the show.
25:43 - That's right.
25:44 So he wrote a letter to the Python community in Africa, which is a pretty interesting summation of the state of the Python community throughout the different regions of Africa and really highlighting a lot of cool stuff that's happening over there.
25:57 - Oh, that's cool.
25:58 - Yeah, so he says, look, if you look at what they're doing, there's actually a lot of stuff that the broader Python community can learn for what people are doing there.
26:06 And I'll let you all read the article, it's really long, and it's just, this is an extra, right?
26:10 Not a deep analysis or whatever, but just to give you a sense, like the attendance in terms of gender of PyCon NA was 50% male and 50% female.
26:21 Like think of other tech conferences where that's the case.
26:23 - Yeah, I've never been to one.
26:25 - Neither have I.
26:26 Neither have I.
26:27 It wouldn't be terrible, would it?
26:28 Like that looks like the population.
26:29 Hey, wouldn't it be cool if your tech community look like the population in general.
26:34 Anyway, he covers a bunch of stuff like that and there's a lot of interesting things going on.
26:37 So I thought I'd give him a shout out there.
26:40 I know we've laughed a lot on the show, Brian, but I don't think we're done.
26:43 - No, we're not.
26:44 This is what I was waiting for, actually.
26:45 No, it was all good content, but it was good.
26:48 So we have our joke.
26:49 - Are you telling it or am I telling it?
26:51 - You can tell it.
26:51 - Okay, so this comes to us from Luke Russell, who sent in a joke, which is great because it helps us to have jokes if people send them to us.
26:59 - Yeah.
27:00 So this is a knock-knock joke.
27:02 You ready?
27:03 Yeah.
27:04 Knock-knock.
27:05 Who's there?
27:06 Java.
27:07 Takes a while to get started.
27:08 Hold on.
27:09 We're good now.
27:10 We're running.
27:11 I love that.
27:12 I told this a couple times at work and instead of like the pause, I counted on my fingers.
27:16 Well, as long as they can't see you, it's fine.
27:21 So, actually, this has brought back memories of a really funny, doesn't directly involve Python, but it involves open source and if it were made in a later date, it probably would be involving Python, but instead it involves Java.
27:33 Video, which is really funny.
27:35 - Yeah.
27:35 - Called Java Forever.
27:37 - This is an amazing video.
27:38 So people watch this.
27:40 It's like high production value.
27:41 I hadn't seen this before.
27:43 And it's really, really hilarious.
27:45 - Yeah, so there's this family.
27:47 They love .NET, Microsoft, and they will never stray from them.
27:51 Like a very authoritative father.
27:52 But there's a rebellious 18-year-old who loves open source and Java.
27:57 And all sorts of crazy mayhem ensues.
27:59 and we can't do it justice here, so I'll just link to the YouTube.
28:02 It's pretty funny, check it out.
28:04 - Yeah.
28:05 - All right. - All right.
28:06 - Thanks for the joke, Brian.
28:07 - Thank you. - Yeah, catch you later.
28:08 - Bye.
28:09 - Thank you for listening to Python Bytes.
28:10 Follow the show on Twitter via @pythonbytes.
28:13 That's Python Bytes as in B-Y-T-E-S.
28:16 And get the full show notes at pythonbytes.fm.
28:19 If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
28:23 We're always on the lookout for sharing something cool.
28:26 On behalf of myself and Brian Okken, This is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.