WEBVTT

00:00:00.001 --> 00:00:05.620
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:05.620 --> 00:00:11.360
This is episode 114, recorded January 23rd, 2019. I'm Michael Kennedy.

00:00:11.360 --> 00:00:12.300
And I'm Brian Okken.

00:00:12.300 --> 00:00:16.160
And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm.

00:00:16.160 --> 00:00:18.400
Brian, how are you doing?

00:00:18.400 --> 00:00:19.340
I am doing good.

00:00:19.340 --> 00:00:21.160
That's great to hear. I am as well.

00:00:21.160 --> 00:00:29.880
And I hear often people praise Python because it is a batteries included language or technology.

00:00:29.880 --> 00:00:33.940
And I think that's really important, but it's not a subtle debate, is it?

00:00:33.940 --> 00:00:35.900
No, this was interesting.

00:00:35.900 --> 00:00:41.300
We actually, there's an article we're going to link to called What Should Be in the Python Standard Library.

00:00:41.300 --> 00:00:45.540
So with the batteries included, we often think of that as, well, I don't know.

00:00:45.540 --> 00:00:47.560
I used to think of it as the standard library.

00:00:47.720 --> 00:00:54.180
Now I kind of think of it as the standard library plus some of the recommended PyPI packages and stuff.

00:00:54.180 --> 00:00:56.340
Exactly. Like there's, it's almost like an onion.

00:00:56.340 --> 00:01:02.160
You have the language, you have the standard library, and you have pip install, anti-gravity, like wrapping around it.

00:01:02.160 --> 00:01:05.940
And I agree when I think of batteries included, I think of it as like that whole spectrum.

00:01:05.940 --> 00:01:10.000
Then there's even stuff that you couldn't, can't easily install even through PyPI.

00:01:10.000 --> 00:01:14.260
Things like that are in distributions, like the scientific packages and stuff.

00:01:14.260 --> 00:01:15.000
Yep, indeed.

00:01:15.000 --> 00:01:20.100
We were going to talk about it last week, but I couldn't find an article that didn't say stuff like, this is internal.

00:01:20.100 --> 00:01:29.200
But now I found an article on lwn.net, and I just can, I'm probably not the first one to say that this is a really ugly website.

00:01:29.200 --> 00:01:31.380
This is technically true.

00:01:31.380 --> 00:01:34.740
It could certainly use a little bootstrap action theme or something.

00:01:35.160 --> 00:01:41.260
But it's by Jake Edge, and Jake Edge does a lot of good coverage of the core developer meeting.

00:01:41.260 --> 00:01:42.680
So well done, Jake.

00:01:42.680 --> 00:01:44.660
No, yeah, definitely great information.

00:01:44.660 --> 00:01:46.320
This will be hard to summarize.

00:01:46.320 --> 00:01:55.820
But anyway, we've got somebody, I think Jonathan Underwood proposed adding LZ4 compression to the standard library.

00:01:55.820 --> 00:01:57.780
Because there's already some other compression.

00:01:57.780 --> 00:01:58.240
Right.

00:01:58.240 --> 00:02:00.820
You can do zip files and tar files.

00:02:00.820 --> 00:02:05.240
Why not LZ4 or RAR or some random other type of compression?

00:02:05.240 --> 00:02:05.840
Right.

00:02:05.840 --> 00:02:10.640
So, and then Brett Cannon proposed making something similar to hashlib.

00:02:10.640 --> 00:02:16.000
If there's a whole bunch of other kinds of compression algorithms, maybe we could have like a compresslib or something.

00:02:16.000 --> 00:02:18.940
That had a bunch of different algorithms in it.

00:02:18.940 --> 00:02:20.800
Then Can of Worms opens.

00:02:20.800 --> 00:02:23.660
So there's an argument against it.

00:02:23.660 --> 00:02:28.140
Basically, we don't actually, standard lib doesn't need LZ4.

00:02:28.140 --> 00:02:31.060
Maybe people do, but standard lib doesn't.

00:02:31.060 --> 00:02:35.700
It already has BZ2 there, which I'm not sure what BZ2 is.

00:02:35.700 --> 00:02:36.880
I think it's a zip thing.

00:02:36.880 --> 00:02:40.900
But it's kind of late to remove it since people rely on it.

00:02:40.900 --> 00:02:49.860
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?

00:02:49.860 --> 00:02:54.260
Even things that aren't needed by standard library, but other people might need.

00:02:54.260 --> 00:03:02.640
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.

00:03:02.640 --> 00:03:03.020
Right.

00:03:03.020 --> 00:03:08.640
Maybe it's like REPL, some kind of online REPL, and you can type whatever they've installed, but that's it.

00:03:08.640 --> 00:03:09.380
That's true.

00:03:09.380 --> 00:03:10.800
There's online REPL stuff.

00:03:10.800 --> 00:03:23.060
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.

00:03:23.060 --> 00:03:24.260
So there's issues.

00:03:24.260 --> 00:03:33.480
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.

00:03:33.540 --> 00:03:35.220
Who would decide what gets kicked out?

00:03:35.220 --> 00:03:51.320
And, you know, it falls along with a discussion of, well, maybe we don't really think of it as just the standard library as our batteries included, but maybe we could have a standard distribution that had like some set of recommended PyPI packages.

00:03:51.400 --> 00:03:51.860
Right.

00:03:51.860 --> 00:03:55.200
Because the initial discussion was, can we make standard lib bigger?

00:03:55.200 --> 00:03:59.480
And some of the responses were, actually, can we make it smaller?

00:03:59.480 --> 00:04:01.700
Can we have less stuff, not more?

00:04:01.700 --> 00:04:03.560
Which I thought was pretty interesting.

00:04:04.560 --> 00:04:14.520
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.

00:04:14.520 --> 00:04:15.320
Right.

00:04:15.320 --> 00:04:18.100
With more or less, but you can choose that sort of thing, right?

00:04:18.100 --> 00:04:18.480
Yep.

00:04:18.480 --> 00:04:20.060
There really isn't a solution here.

00:04:20.060 --> 00:04:23.460
It's just an interesting discussion going on, so I thought I'd bring it up.

00:04:23.460 --> 00:04:31.100
Anything that would happen would end up happening through PEPs, and the PEP process is sort of stalled right now.

00:04:31.100 --> 00:04:33.440
So we've got to figure out that first.

00:04:33.440 --> 00:04:33.660
Yeah.

00:04:33.660 --> 00:04:34.620
It's interesting.

00:04:34.620 --> 00:04:37.760
I certainly see some of the drawbacks, right?

00:04:37.760 --> 00:04:43.400
Like one of the complaints or one of the cautionary flags that was raised when they said, oh, could we add this?

00:04:43.400 --> 00:04:45.640
It was like, you're trying to give us more puppies.

00:04:45.640 --> 00:04:48.480
We have a kennel full of puppies, and we're really busy taking care of them.

00:04:48.480 --> 00:04:54.040
Like, you're trying to give us more of these modules that we have to care for indefinitely, right?

00:04:54.040 --> 00:04:56.240
It's almost impossible to take something out of the standard lib.

00:04:56.900 --> 00:05:08.980
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.

00:05:08.980 --> 00:05:12.320
It was just a bigger software project to corral.

00:05:12.360 --> 00:05:20.600
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.

00:05:20.600 --> 00:05:27.080
And maybe those comes with even more batteries, like a bunch of PyPI modules curated by core developers.

00:05:27.080 --> 00:05:28.760
And I thought that's a pretty cool idea.

00:05:28.760 --> 00:05:36.660
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?

00:05:36.720 --> 00:05:41.000
It comes with some web framework included, I don't know, right?

00:05:41.000 --> 00:05:41.980
But it's a cool idea.

00:05:41.980 --> 00:05:43.760
And then you could update it independently.

00:05:43.760 --> 00:05:56.920
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.

00:05:56.920 --> 00:06:02.920
The standard way to do certain things is to use, like, requests, and requests isn't in there.

00:06:03.000 --> 00:06:09.500
Yeah, almost nobody uses the built-in ACP library unless they are explicitly trying to go without dependencies.

00:06:09.500 --> 00:06:13.420
Yeah, and there are people that try to do things just without dependencies.

00:06:13.420 --> 00:06:15.860
And, yeah, it's an interesting thing.

00:06:15.860 --> 00:06:17.100
Like, for instance, unit test.

00:06:17.100 --> 00:06:27.540
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.

00:06:28.380 --> 00:06:31.020
And why is the unit test in the standard library?

00:06:31.020 --> 00:06:33.940
Because the standard library needs something to test itself with.

00:06:33.940 --> 00:06:34.160
Right.

00:06:34.160 --> 00:06:35.500
And that predates everything.

00:06:35.500 --> 00:06:38.660
I mean, it's very, like, JUnit-esque, right?

00:06:38.660 --> 00:06:41.400
It's got some old school style to it.

00:06:41.400 --> 00:06:43.540
But, you know, that's the way it was.

00:06:43.540 --> 00:06:44.480
It can't come out.

00:06:44.480 --> 00:06:51.300
Like, for instance, if we had the standard distribution, we could possibly put, like, unit test out and into the standard distribution.

00:06:51.300 --> 00:06:51.800
Right.

00:06:52.140 --> 00:06:56.180
And then pytest could be one of those curated modules that comes with the distribution, right?

00:06:56.180 --> 00:06:57.660
And those are just a couple examples.

00:06:57.660 --> 00:07:00.220
I kind of like this idea of a standard distribution thing.

00:07:00.220 --> 00:07:00.880
I do, too.

00:07:00.880 --> 00:07:10.060
I mean, because if there's an improvement to one of the modules there, you can pip install upgrade it, whereas you've got to wait 18 months for it to come out with part of CPython.

00:07:10.060 --> 00:07:21.340
Yeah, and 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.

00:07:21.340 --> 00:07:23.060
Yeah, I'm not sure if this is a good idea or not.

00:07:23.060 --> 00:07:26.160
My first impression is I see a lot of benefits to it.

00:07:26.160 --> 00:07:27.960
I can certainly see some drawbacks, right?

00:07:27.960 --> 00:07:29.760
Like, oh, you got the wrong distribution.

00:07:29.760 --> 00:07:34.900
Not only did you have to have Python 3.6 and not 3.5, but you also need to have the super-duper core.

00:07:34.900 --> 00:07:35.620
Yeah, that's true.

00:07:35.620 --> 00:07:38.880
But at the same time, there's a lot of benefits to it, right?

00:07:38.880 --> 00:07:45.360
Like, the standard Python experience could get better if it came with a bunch of awesome curated PyPI packages.

00:07:45.360 --> 00:07:55.060
Yeah, so I'll just leave this as 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.

00:07:55.060 --> 00:07:55.880
Yeah, yeah, yeah.

00:07:55.880 --> 00:07:58.260
And finally, I guess maybe just a data point.

00:07:58.260 --> 00:08:08.860
If people look at what Microsoft did with .NET, they had a huge, huge distribution and base class library, and they decided that this doesn't make sense to maintain all the stuff.

00:08:08.860 --> 00:08:11.440
If we're going to have a cross-platform .NET, which they created.

00:08:11.440 --> 00:08:18.260
So they made a lot of the .NET standard library or base class library basically pip installable, right?

00:08:18.260 --> 00:08:20.920
Like, you get this core thing, and then you install the little other bits.

00:08:20.920 --> 00:08:23.680
So it's not that different than what Steve is proposing.

00:08:23.680 --> 00:08:26.380
How is that received by the .NET community?

00:08:26.380 --> 00:08:27.740
I think it's mixed, honestly.

00:08:27.740 --> 00:08:30.300
Like, it makes life a little bit more hard, right?

00:08:30.300 --> 00:08:31.420
Because you can't just use the stuff.

00:08:31.420 --> 00:08:33.720
You're like, oh, you've got to have these dependencies and install it.

00:08:33.720 --> 00:08:40.940
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.

00:08:40.940 --> 00:08:43.100
So they're like, this part only belongs in Windows.

00:08:43.100 --> 00:08:44.060
It can't go somewhere else.

00:08:44.060 --> 00:08:48.640
So now it's going to be part of this external thing that you can only get by installing that dependency on Windows.

00:08:49.160 --> 00:08:55.680
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.

00:08:55.680 --> 00:08:56.220
Yeah, okay.

00:08:56.220 --> 00:08:57.400
But it's pretty cool.

00:08:57.400 --> 00:09:05.620
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.

00:09:05.620 --> 00:09:06.160
Do you know this?

00:09:06.160 --> 00:09:09.400
Well, we've talked about it a couple times, but I haven't tried it yet.

00:09:09.400 --> 00:09:13.720
Yeah, neither have I because I think I might have one smart light bulb I bought on accident.

00:09:13.720 --> 00:09:17.100
I technically have a Nest.

00:09:18.200 --> 00:09:23.280
My car is electric, so it has a charger, but the charger doesn't integrate with Home Assistant, so that doesn't help me.

00:09:23.280 --> 00:09:26.520
So I would really love to have it, but I just don't have enough.

00:09:26.520 --> 00:09:29.460
My home is too old school and too analog for it.

00:09:29.460 --> 00:09:36.840
Anyway, Home Assistant is this cool web server that integrates all your smart home appliances and things and collects data about them.

00:09:36.840 --> 00:09:42.300
It 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.

00:09:42.300 --> 00:09:43.060
Very cool.

00:09:43.060 --> 00:09:53.180
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.

00:09:53.180 --> 00:09:53.920
That's pretty cool, right?

00:09:53.920 --> 00:09:54.520
Oh, yeah.

00:09:54.520 --> 00:09:55.100
Nice.

00:09:55.100 --> 00:09:56.800
You can have like temperature sensors and stuff.

00:09:56.800 --> 00:09:57.320
Yeah, exactly.

00:09:57.420 --> 00:10:04.500
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.

00:10:04.500 --> 00:10:12.340
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.

00:10:12.580 --> 00:10:18.340
So they set up this Home Assistant data science website to help you work with that data and analyze it.

00:10:18.340 --> 00:10:26.060
And then they went so far to create a new add-on for their IO that runs home, their OS that runs Home Assistant called JupyterLab Lite.

00:10:26.060 --> 00:10:31.040
This runs JupyterLab, right on your Raspberry Pi hosting Home Assistant.

00:10:31.040 --> 00:10:37.160
So on the same thing that is your Home Assistant, now you have a JupyterLab running there to analyze your data in place.

00:10:37.160 --> 00:10:37.800
Oh, cool.

00:10:37.800 --> 00:10:45.700
Yeah, and they also created a Python library called the HASS, that's their operating system, Data Detective, that's based on things like Pandas.

00:10:45.700 --> 00:10:48.280
It lets you like start get going quick.

00:10:48.280 --> 00:10:49.260
So anyway, it's pretty cool.

00:10:49.260 --> 00:10:50.040
Yeah, very nice.

00:10:50.040 --> 00:10:59.500
So if people have a smart home and they want to do some data science-y stuff about it or maybe even build a product for other people so that they have like more data control over their home.

00:10:59.500 --> 00:11:00.000
Yeah.

00:11:00.000 --> 00:11:01.480
Yeah, so that's pretty cool.

00:11:01.480 --> 00:11:06.020
And then finally, I think I finally decided my first IoT project.

00:11:06.180 --> 00:11:07.560
We'll see if I can actually make it happen.

00:11:07.560 --> 00:11:11.700
But I've always wanted to build an IoT thing and I'm always like, but I don't really have any useful one.

00:11:11.700 --> 00:11:13.060
But I think I have a useful one now.

00:11:13.060 --> 00:11:13.940
Oh, tell me about it.

00:11:13.940 --> 00:11:14.160
Yeah.

00:11:14.160 --> 00:11:15.640
So you might sympathize with this.

00:11:15.640 --> 00:11:18.060
I know a lot of people who do things like we do would.

00:11:18.900 --> 00:11:26.000
So I have a separate office of my garage where I can record quietly away from the kids.

00:11:26.000 --> 00:11:27.940
But especially in the summer, kids are home.

00:11:27.940 --> 00:11:28.560
They come over.

00:11:28.560 --> 00:11:31.160
They want to talk to me or my wife's like, hey, I got to ask you something.

00:11:31.160 --> 00:11:35.120
And I might be in the middle of recording a course or talking to you, right, recording a podcast.

00:11:35.520 --> 00:11:41.160
So I'm going to get a big fat button and I can press the button recording, not recording.

00:11:41.160 --> 00:11:45.540
And then down by the door before people even get to here, it's going to say recording, not recording.

00:11:45.540 --> 00:11:46.580
Oh, that'd be cool.

00:11:46.580 --> 00:11:47.120
Wouldn't that be fun?

00:11:47.120 --> 00:11:47.660
It's super easy.

00:11:47.660 --> 00:11:48.020
Yeah.

00:11:48.020 --> 00:11:50.840
What if you could hook it up to the Skype connection status?

00:11:50.840 --> 00:11:51.860
Oh, yeah.

00:11:51.860 --> 00:11:52.800
Maybe so.

00:11:52.800 --> 00:11:54.200
Do you have Camtasia running?

00:11:54.200 --> 00:11:55.620
Are you on a Skype call?

00:11:55.620 --> 00:11:56.000
Yeah.

00:11:56.000 --> 00:11:57.820
Oh, if it could be automatic, that'd be sweet.

00:11:57.820 --> 00:11:58.280
Yeah.

00:11:58.280 --> 00:11:58.700
Why not?

00:11:58.700 --> 00:11:58.900
Right.

00:11:58.900 --> 00:11:59.220
Zoom.

00:11:59.220 --> 00:12:00.200
A couple of those things.

00:12:00.200 --> 00:12:00.460
Yeah.

00:12:00.520 --> 00:12:00.720
Yeah.

00:12:00.720 --> 00:12:01.280
All right, though.

00:12:01.280 --> 00:12:01.800
There we go.

00:12:01.800 --> 00:12:02.800
It just went up a notch.

00:12:02.800 --> 00:12:04.720
Pretty cool.

00:12:04.720 --> 00:12:06.120
It started easy.

00:12:06.120 --> 00:12:07.000
Now it's hard.

00:12:07.000 --> 00:12:09.220
Now all of a sudden I have like a machine learning problem.

00:12:09.220 --> 00:12:10.080
No, just kidding.

00:12:10.080 --> 00:12:11.920
A bunch of APIs I got to learn.

00:12:11.920 --> 00:12:12.660
That's cool.

00:12:12.660 --> 00:12:13.400
All right.

00:12:13.400 --> 00:12:16.420
Speaking of machine learning in the future, what do you got next?

00:12:16.420 --> 00:12:19.420
Kevin Markham over at Dataschool.io.

00:12:19.420 --> 00:12:23.680
I don't know if we've talked about him before, but Dataschool.io is pretty cool.

00:12:23.680 --> 00:12:24.040
Yeah.

00:12:24.040 --> 00:12:24.840
Kevin's doing cool stuff.

00:12:24.840 --> 00:12:25.260
This isn't that for him.

00:12:25.260 --> 00:12:25.720
Yeah.

00:12:25.720 --> 00:12:27.400
It's just he's got a lot of cool resources.

00:12:28.040 --> 00:12:31.400
But he wrote an article called What is the Future of the Pandas Library?

00:12:31.400 --> 00:12:38.200
And I didn't realize Pandas is one of those zero-ver projects, which is odd considering

00:12:38.200 --> 00:12:39.240
everybody uses it.

00:12:39.240 --> 00:12:39.560
Yeah.

00:12:39.560 --> 00:12:43.460
But they're considering going to a 1.0 release early this year.

00:12:43.460 --> 00:12:49.700
And there's an article describing some of the stuff that is coming new and coming with some

00:12:49.700 --> 00:12:50.920
of the new versions of Pandas.

00:12:50.920 --> 00:12:56.140
One of the things is we already know method chaining is becoming more popular with functional

00:12:56.140 --> 00:12:57.580
programming and people used to that.

00:12:57.580 --> 00:13:00.640
But you can already do that with a lot of stuff in Pandas.

00:13:00.640 --> 00:13:05.600
What's new really is just that they're going to try to take that further and make more methods

00:13:05.600 --> 00:13:07.440
that support chaining.

00:13:07.440 --> 00:13:12.080
All you have to do to support chaining is to return the object that you're operating on

00:13:12.080 --> 00:13:15.760
as a return for a function call so that you can chain a bunch of function calls.

00:13:15.760 --> 00:13:17.520
And a lot of times they probably return nothing.

00:13:17.520 --> 00:13:21.360
So they might as well just return the thing again so you can have this fluent API, which

00:13:21.360 --> 00:13:21.960
would be nice, right?

00:13:22.120 --> 00:13:22.240
Yeah.

00:13:22.240 --> 00:13:26.580
There's also people in the know might know what Apache Arrow is.

00:13:26.580 --> 00:13:28.760
I really don't know what Apache Arrow is.

00:13:28.760 --> 00:13:33.620
But apparently it's something that can help the back end of Pandas become a little bit more

00:13:33.620 --> 00:13:33.940
efficient.

00:13:33.940 --> 00:13:35.800
And so they're going to try to push that out.

00:13:35.800 --> 00:13:39.580
It'll probably be after 1.0 because it doesn't change the interface at all.

00:13:39.580 --> 00:13:40.000
Yeah, it's cool.

00:13:40.000 --> 00:13:42.100
I don't know much about Apache Arrow, but it sounds cool.

00:13:42.100 --> 00:13:47.240
They talk about things like working with data that's larger than what you can fit into memory

00:13:47.240 --> 00:13:48.180
and things like that.

00:13:48.180 --> 00:13:52.860
So instead of loading everything just into kind of data frame or something, it's like

00:13:52.860 --> 00:13:55.340
it'll stream the data off disk and all sorts of stuff.

00:13:55.340 --> 00:13:55.880
It's pretty cool.

00:13:55.880 --> 00:13:56.180
Yep.

00:13:56.180 --> 00:13:59.740
And I know a lot of people listening to this use Pandas every day.

00:13:59.740 --> 00:14:01.360
I'm starting to use it more.

00:14:01.360 --> 00:14:06.200
So the rest of my spiel will be stuff that I don't really know about, but you might.

00:14:06.200 --> 00:14:11.200
One of the things is apparently it's hard to do custom data types because of some of the

00:14:11.200 --> 00:14:11.720
limitations.

00:14:11.720 --> 00:14:14.180
So you kind of have to jump through hoops.

00:14:14.180 --> 00:14:19.520
But there is going to be extension arrays that make it easier to create custom data types

00:14:19.520 --> 00:14:22.440
for using with Pandas, which that sounds neat.

00:14:22.440 --> 00:14:24.520
And then some things that are going away.

00:14:24.520 --> 00:14:27.740
So some deprecations that have been proposed in place parameter.

00:14:27.740 --> 00:14:31.140
It doesn't really work as it's supposed to, and it mucks up chaining.

00:14:31.140 --> 00:14:32.920
So they're going to try to deprecate that.

00:14:32.920 --> 00:14:40.560
The IX accessor, which is going away or it's deprecating, use loc or iloc instead.

00:14:40.760 --> 00:14:44.940
The panel data structure, apparently you should use multi-index instead.

00:14:44.940 --> 00:14:48.480
And the sparse data frame never really worked as it was supposed to.

00:14:48.480 --> 00:14:50.140
So they're going to just support data frame.

00:14:50.140 --> 00:14:56.900
And last but not least, in the 1.0 release, they will stop support for 2.7.

00:14:56.900 --> 00:14:57.780
Woohoo!

00:14:57.780 --> 00:15:00.160
Viva modern Python, right?

00:15:00.160 --> 00:15:00.780
Yeah.

00:15:00.780 --> 00:15:01.580
That's right.

00:15:01.580 --> 00:15:02.740
Living on.

00:15:02.740 --> 00:15:03.840
So no more legacy Python.

00:15:03.840 --> 00:15:04.160
Super.

00:15:04.160 --> 00:15:05.000
Okay.

00:15:05.400 --> 00:15:06.800
I think these things are all great.

00:15:06.800 --> 00:15:10.980
I don't use Pandas enough to really say a whole lot, but I do think, you know, they talk,

00:15:10.980 --> 00:15:16.720
Kevin talks a little bit about, like, the zero-over impression of it not being ready and so on.

00:15:16.720 --> 00:15:21.840
And it feels like these deprecations are kind of like, all right, these are a few of the rough edges of the API

00:15:21.840 --> 00:15:25.620
that we wish we could get rid of, and we're going to call it 1.0,

00:15:25.620 --> 00:15:28.900
and we're going to drop the few things that we don't really like, including Python 2.

00:15:28.900 --> 00:15:29.280
Yeah.

00:15:29.400 --> 00:15:29.940
Yeah, pretty sweet.

00:15:29.940 --> 00:15:30.580
All right.

00:15:30.580 --> 00:15:32.440
Also, sweet is DigitalOcean.

00:15:32.440 --> 00:15:36.720
So if you want to do anything with containers, you've got to orchestrate them.

00:15:36.720 --> 00:15:37.820
You've got to get them to talk together.

00:15:37.820 --> 00:15:39.160
So check out Kubernetes.

00:15:39.160 --> 00:15:44.280
And DigitalOcean just launched their public Kubernetes service, DOK8.

00:15:44.280 --> 00:15:47.320
Super simple, managed Kubernetes service.

00:15:47.320 --> 00:15:48.920
So you can deploy faster.

00:15:48.920 --> 00:15:54.500
You can configure your Kubernetes cluster in seconds and provision and access your cluster in a few minutes.

00:15:55.080 --> 00:16:01.320
You can scale reliably based on incoming traffic and everything stored in block storage and behind load balancers, stuff like that.

00:16:01.320 --> 00:16:08.200
And people are seeing a 2.4 times better price-to-performance ratio compared to other providers.

00:16:08.200 --> 00:16:13.140
So if you want to do all that cool stuff or more with a free $100 credit for new users,

00:16:13.140 --> 00:16:15.820
check them out at pythonbytes.fm/DigitalOcean.

00:16:15.820 --> 00:16:19.260
Now, I'd love to talk about something that we haven't.

00:16:19.260 --> 00:16:22.920
I don't think we've touched on it very much, but maybe packaging up Python apps.

00:16:22.920 --> 00:16:23.660
Have we talked about that?

00:16:23.660 --> 00:16:24.980
Yes, we have.

00:16:25.020 --> 00:16:27.760
I do remember that now, that three-week stint.

00:16:27.760 --> 00:16:27.960
And we will more.

00:16:27.960 --> 00:16:29.240
We will more.

00:16:29.240 --> 00:16:33.420
This one is, at least it promises to be pretty excellent.

00:16:33.420 --> 00:16:36.400
So let us count the ways there's more than this.

00:16:36.400 --> 00:16:42.260
We have pecs, which is a way to make a zip file of Python code executable with its dependencies.

00:16:42.820 --> 00:16:59.160
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.

00:16:59.380 --> 00:17:04.120
And then run that as an exe.

00:17:04.120 --> 00:17:04.440
There's pyto.com.

00:17:04.440 --> 00:17:04.720
There's pyto.com.

00:17:04.720 --> 00:17:05.700
There's cxfreeze.

00:17:05.700 --> 00:17:06.560
There's many of these, right?

00:17:06.560 --> 00:17:06.920
Yes.

00:17:06.920 --> 00:17:10.220
The new kid on the block is pyoxidizer.

00:17:10.220 --> 00:17:10.800
Okay.

00:17:10.940 --> 00:17:19.820
So when you take the py element and you combine it with iron and oxygen through the Rust compiler, you get the pyoxidizer outcome.

00:17:19.820 --> 00:17:24.980
Now, so pyoxidizer is a set of rust crates, libraries, I'm guessing.

00:17:24.980 --> 00:17:26.440
Maybe the way to put it.

00:17:26.500 --> 00:17:30.860
That facilitate building libraries and binaries containing Python interpreters.

00:17:30.860 --> 00:17:31.520
Interesting.

00:17:31.520 --> 00:17:34.160
So cxfreeze, pyinstaller.

00:17:34.160 --> 00:17:35.700
You're like, okay, great.

00:17:35.700 --> 00:17:39.920
Well, somebody loves Rust and they're just like doing it again, but this time with Rust because it's amazing.

00:17:39.920 --> 00:17:43.000
But this one has some special capabilities that maybe are better.

00:17:43.000 --> 00:17:46.660
So it makes a single executable file, an exe or .app or something.

00:17:46.660 --> 00:17:53.620
And all the dependencies and all the resources like pyc files are embedded inside the executable.

00:17:54.080 --> 00:18:00.280
So like with pyinstaller, you get an exe and then a bunch of loose files and like zip files and directories.

00:18:00.280 --> 00:18:02.900
And somehow all that stuff gets like put back together to run.

00:18:02.900 --> 00:18:10.580
Here you get a single exe or executable that takes those and puts them inside the binary as a resource and then runs it.

00:18:10.580 --> 00:18:11.060
That's cool.

00:18:11.060 --> 00:18:11.640
That's cool, right?

00:18:11.640 --> 00:18:11.880
Yeah.

00:18:11.880 --> 00:18:14.740
So it says, of course, the oxidizer part comes from a Rust.

00:18:14.740 --> 00:18:18.340
And these are compiled from Rust.

00:18:18.340 --> 00:18:22.360
And basically the Rust, it becomes like a Rust executable, right?

00:18:22.360 --> 00:18:30.020
And the Rust executable code is responsible for managing and running the embedded Python interpreter in all of its operations.

00:18:30.020 --> 00:18:31.940
So it's like totally self-contained.

00:18:31.940 --> 00:18:32.560
Okay.

00:18:32.560 --> 00:18:33.400
That's kind of cool.

00:18:33.400 --> 00:18:34.160
It's pretty cool, right?

00:18:34.160 --> 00:18:41.300
So it says it's like all these others that I mentioned, except for the produced executables contain embedded statically linked Python interpreters.

00:18:41.500 --> 00:18:42.560
So no dependencies.

00:18:42.560 --> 00:18:46.700
They have very little runtime dependencies on like the OS it runs on.

00:18:46.700 --> 00:18:54.260
And everything is run from memory rather than extracting temporary Python files to a directory and trying to run them from there with weird pass and stuff.

00:18:54.260 --> 00:18:54.660
Yeah.

00:18:54.660 --> 00:18:55.860
So I'm pretty excited about this.

00:18:55.860 --> 00:18:57.920
I haven't got a chance to try it, but I want to.

00:18:57.920 --> 00:18:58.640
Yeah, me too.

00:18:58.640 --> 00:18:58.880
Yeah.

00:18:58.880 --> 00:18:59.860
It looks really promising.

00:18:59.860 --> 00:19:02.500
It looks like this is the way it probably should be.

00:19:02.560 --> 00:19:05.100
So I'm pretty excited if it works the way they're promising.

00:19:05.100 --> 00:19:07.940
And you have to work with no files on the operating system.

00:19:07.940 --> 00:19:09.240
You get one file, so it's simple.

00:19:09.240 --> 00:19:11.900
But not all file systems are simple, right?

00:19:11.900 --> 00:19:12.600
Right.

00:19:12.740 --> 00:19:20.480
And actually, I love it when I can 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.

00:19:20.480 --> 00:19:27.340
But anybody that's using tools can go, hey, I want to automate some part of my job.

00:19:27.340 --> 00:19:30.700
And often that involves dealing with the file system.

00:19:30.700 --> 00:19:30.940
Yeah.

00:19:30.940 --> 00:19:36.620
And RealPython just recently put out an article called Working with Files in Python.

00:19:37.440 --> 00:19:41.480
And at first, I'm like, oh, cool, another file system thing.

00:19:41.480 --> 00:19:43.260
But it's a pretty nice article.

00:19:43.260 --> 00:19:45.840
It's a very comprehensive write-up.

00:19:45.840 --> 00:19:54.460
And 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.

00:19:54.460 --> 00:19:56.140
But they also use Pathlib.

00:19:56.140 --> 00:19:57.860
I'm trying to use Pathlib more and more.

00:19:57.860 --> 00:20:01.020
But Pathlib is for more recent versions of Python.

00:20:01.020 --> 00:20:02.980
And you might not be there.

00:20:03.520 --> 00:20:09.820
However, it might be that you're used to doing, you've done file system stuff in the past, and you want to try Pathlib also.

00:20:09.820 --> 00:20:18.300
So having the examples right next to each other is kind of nice to be able to say, hey, I used to do this in OS, and now I'm going to use the Pathlib version here.

00:20:18.300 --> 00:20:19.180
So that's cool.

00:20:19.180 --> 00:20:19.480
Yeah.

00:20:19.480 --> 00:20:20.320
Yeah, quite cool.

00:20:20.320 --> 00:20:40.760
I'm not going to read the article, but a lot of the stuff you might have to do is get a directory listing, what all is 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.

00:20:41.400 --> 00:20:46.460
They include in this article how to deal with zip and tar files, including reading the contents of those.

00:20:46.460 --> 00:20:48.820
So there's quite a bit of stuff here.

00:20:48.820 --> 00:20:52.840
Yeah, it's really a really nice and standard comprehensive real Python article.

00:20:52.840 --> 00:20:54.580
So well done on that.

00:20:54.580 --> 00:21:00.020
One of the things that I like about this is it doesn't go, here's a way to read zip files.

00:21:00.020 --> 00:21:01.960
Here's a way to create directories.

00:21:01.960 --> 00:21:10.080
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.

00:21:10.080 --> 00:21:18.100
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.

00:21:18.100 --> 00:21:19.760
You can say, it's okay if it exists.

00:21:19.760 --> 00:21:20.820
I just need it to be there.

00:21:20.820 --> 00:21:24.100
Like, this is an idempotent type of thing I'm trying to do.

00:21:24.100 --> 00:21:25.540
Stuff like that, right?

00:21:25.540 --> 00:21:33.020
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?

00:21:33.020 --> 00:21:34.240
So yeah, pretty nice.

00:21:34.240 --> 00:21:36.800
Yeah, it's good to have all that stuff in one place, too.

00:21:36.800 --> 00:21:38.920
Yeah, it's definitely a good reference thing, right?

00:21:38.920 --> 00:21:44.360
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.

00:21:44.360 --> 00:21:46.420
You've got something going on that's a little crazy.

00:21:46.420 --> 00:21:51.880
Like, I've got to zip and tar stuff and create directors and get the file attributes, right?

00:21:51.880 --> 00:21:56.460
But it's certainly good to, like, have as a reference for when you've got to do one of them.

00:21:56.460 --> 00:21:59.380
Yeah, but you usually have to do, like, one or, like, two of these things.

00:21:59.380 --> 00:22:04.320
You might have to, like, create multiple directories and then read the file in there or something.

00:22:04.320 --> 00:22:05.080
Yeah, for sure.

00:22:05.080 --> 00:22:11.940
All right, so this last one that I picked first, Brian, this is a little bit motivated by a conversation we had before, right?

00:22:11.940 --> 00:22:21.320
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.

00:22:21.320 --> 00:22:22.860
That's part of this whole transition, right?

00:22:22.860 --> 00:22:23.260
Yes.

00:22:23.260 --> 00:22:26.600
I think what Red Hat was doing was basically saying there shall be no Python.

00:22:26.600 --> 00:22:31.480
You have to type Python 2 or type Python 3 on, like, the new Red Hat Enterprise Linux.

00:22:31.880 --> 00:22:33.420
And there was some debate about that.

00:22:33.420 --> 00:22:40.340
So David Furfees sent a really cool thread from PEP394.

00:22:40.340 --> 00:22:49.700
And it says, look, this thing that you sensibly suggested or at least debated on the show recently, it's been tried and it didn't go super well.

00:22:49.700 --> 00:22:50.780
So Homebrew tried it.

00:22:50.780 --> 00:22:51.780
Homebrew said, you know what?

00:22:51.780 --> 00:22:53.160
Python equals Python 3.

00:22:53.160 --> 00:22:53.520
Yes.

00:22:53.980 --> 00:22:55.740
And there was a bunch of knock-on effects.

00:22:55.740 --> 00:22:57.100
And they said, we're really sorry.

00:22:57.100 --> 00:22:58.400
We kind of broke some stuff.

00:22:58.400 --> 00:22:59.460
We'll put it back.

00:22:59.460 --> 00:23:02.980
So Homebrew tried it and they had to actually roll it back.

00:23:02.980 --> 00:23:04.500
And there's a link to that conversation.

00:23:04.500 --> 00:23:11.020
Also, on the PEP394, there's some interesting conversation over on GitHub.

00:23:11.020 --> 00:23:19.140
So this PEP394 is allow the Python command not to be installed, basically, other minor changes.

00:23:19.140 --> 00:23:23.160
So basically requiring you to type Python 2 or to type Python 3.

00:23:23.800 --> 00:23:27.740
So there is no way to just type Python, which to me doesn't feel like a great fix.

00:23:27.740 --> 00:23:30.060
Like we want to move to the next version of Python.

00:23:30.060 --> 00:23:35.860
So when Python 4 comes out, it's going to be like, well, everyone's using Python 3 in their tutorials.

00:23:35.860 --> 00:23:36.720
And they keep breaking.

00:23:36.720 --> 00:23:39.280
It doesn't seem very scalable.

00:23:39.280 --> 00:23:41.760
But nonetheless, that's what the thing says.

00:23:41.760 --> 00:23:46.200
So I want to read you a couple of thoughts that Gita Van Rossum had about this.

00:23:46.200 --> 00:23:46.500
OK.

00:23:46.500 --> 00:23:51.120
So somebody said, Python doesn't exist as a command on macOS.

00:23:51.120 --> 00:23:52.100
So it's solved.

00:23:52.740 --> 00:23:54.040
And so he's like, no, no, no.

00:23:54.040 --> 00:23:56.760
Python 2 doesn't exist as a built-in command.

00:23:56.760 --> 00:23:59.080
But Python definitely does.

00:23:59.080 --> 00:24:11.640
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.

00:24:11.680 --> 00:24:16.020
Because if you type the simplest statement to run Python, it does old Python, not new Python.

00:24:16.020 --> 00:24:22.140
So there's an endorsement to say, let's not encourage Python 2, legacy Python.

00:24:22.140 --> 00:24:24.460
Let's have Python point to Python 3, as we've been saying.

00:24:24.460 --> 00:24:29.860
So Gita said, I'm still unhappy with any kind of endorsement of Python pointing at Python 3.

00:24:29.860 --> 00:24:33.300
When the user gets bitten by this, they're going to be really unhappy.

00:24:33.700 --> 00:24:39.780
Regardless of what macOS does, I think I would be happier in the future if Python as a command does not exist.

00:24:39.780 --> 00:24:42.000
And you have to say Python 2 or Python 3.

00:24:42.000 --> 00:24:42.840
Right.

00:24:42.840 --> 00:24:49.500
So anyway, that's just a bit of a follow up to this Python equals Python 3 discussion we had.

00:24:49.500 --> 00:24:49.840
Hmm.

00:24:49.840 --> 00:24:50.520
Yeah.

00:24:50.720 --> 00:24:50.920
Yeah.

00:24:50.920 --> 00:24:55.940
I'm not super happy with it because I feel like, well, what happens when the next version of Python comes out?

00:24:55.940 --> 00:24:58.020
Then it just gets complicated in the same way.

00:24:58.020 --> 00:24:59.200
But still, it's okay.

00:24:59.200 --> 00:25:00.860
I think that's our children's problem.

00:25:00.860 --> 00:25:02.000
That's right.

00:25:02.000 --> 00:25:03.000
It's like global warming.

00:25:03.000 --> 00:25:04.000
That's someone else's problem.

00:25:04.000 --> 00:25:05.240
We're just going to kick that down the road.

00:25:05.240 --> 00:25:10.200
Let them deal with what happens when you type Python and it goes to Python 3, not 4.

00:25:10.200 --> 00:25:14.740
Well, and how many other tools have, like, which grep do you want?

00:25:14.740 --> 00:25:16.800
Do you want a grep 2 or a grep 4?

00:25:16.800 --> 00:25:17.140
I mean.

00:25:17.140 --> 00:25:17.820
Exactly.

00:25:17.820 --> 00:25:19.340
You want to run Homebrew?

00:25:19.340 --> 00:25:20.380
There are seven choices.

00:25:20.540 --> 00:25:22.980
Which version of Homebrew you have installed do you want to run?

00:25:22.980 --> 00:25:24.440
Like, no, I just want to run Homebrew.

00:25:24.440 --> 00:25:25.800
Preferably the latest.

00:25:25.800 --> 00:25:26.940
Yeah.

00:25:26.940 --> 00:25:27.380
Anyway.

00:25:27.380 --> 00:25:27.800
Yeah.

00:25:27.800 --> 00:25:28.360
Anyway.

00:25:28.360 --> 00:25:30.000
I guess that summarizes our thoughts, doesn't it?

00:25:30.000 --> 00:25:30.360
Yeah.

00:25:30.360 --> 00:25:31.960
Cool.

00:25:31.960 --> 00:25:34.440
Well, I do have one quick extra thing.

00:25:34.440 --> 00:25:34.860
You got any?

00:25:34.860 --> 00:25:35.800
No, not right now.

00:25:35.800 --> 00:25:40.580
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?

00:25:40.580 --> 00:25:41.020
Yeah.

00:25:41.020 --> 00:25:43.040
He's a good friend of the show.

00:25:43.040 --> 00:25:43.500
That's right.

00:25:43.500 --> 00:25:50.500
So he wrote a letter to the Python community in Africa, which is a pretty interesting summation of,

00:25:50.500 --> 00:25:57.220
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.

00:25:57.220 --> 00:25:57.800
Oh, that's cool.

00:25:57.800 --> 00:25:58.100
Yeah.

00:25:58.240 --> 00:26:05.840
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.

00:26:05.840 --> 00:26:07.880
And I'll let you all read the article.

00:26:07.880 --> 00:26:08.760
It's really long.

00:26:08.760 --> 00:26:10.700
And it's just, this is an extra, right?

00:26:10.700 --> 00:26:12.220
Not a deep analysis or whatever.

00:26:12.220 --> 00:26:20.920
But just to give you a sense, like the attendance in terms of gender of PyCon NA was 50% male and 50% female.

00:26:20.920 --> 00:26:23.500
Like think of other tech conferences where that's the case.

00:26:23.500 --> 00:26:23.780
Yeah.

00:26:23.780 --> 00:26:24.840
I've never been to one.

00:26:24.840 --> 00:26:25.700
Neither have I.

00:26:25.700 --> 00:26:26.980
Neither have I.

00:26:26.980 --> 00:26:28.280
It wouldn't be terrible, would it?

00:26:28.280 --> 00:26:29.660
Like that looks like the population.

00:26:29.660 --> 00:26:33.640
Hey, wouldn't it be cool if your tech community looked like the population in general?

00:26:34.200 --> 00:26:35.960
Anyway, he covers a bunch of stuff like that.

00:26:35.960 --> 00:26:37.360
And there's a lot of interesting things going on.

00:26:37.360 --> 00:26:39.560
So I thought I'd give him a shot out there.

00:26:39.560 --> 00:26:43.140
I know we've laughed a lot on the show, Brian, but I don't think we're done.

00:26:43.140 --> 00:26:44.020
No, we're not.

00:26:44.020 --> 00:26:45.500
This is what I was waiting for, actually.

00:26:45.500 --> 00:26:48.200
No, it was all good content, but it was good.

00:26:48.200 --> 00:26:49.600
So we have our joke.

00:26:49.600 --> 00:26:51.000
Are you telling it or am I telling it?

00:26:51.000 --> 00:26:51.640
You can tell it.

00:26:51.640 --> 00:26:51.920
Okay.

00:26:51.920 --> 00:26:59.260
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.

00:26:59.260 --> 00:26:59.680
Yeah.

00:26:59.680 --> 00:27:00.060
All right.

00:27:00.060 --> 00:27:02.220
So this is a knock, knock joke.

00:27:02.220 --> 00:27:02.920
You ready?

00:27:02.920 --> 00:27:03.460
Yeah.

00:27:03.460 --> 00:27:04.020
Knock, knock.

00:27:04.020 --> 00:27:04.560
Who's there?

00:27:04.560 --> 00:27:04.920
Java.

00:27:04.920 --> 00:27:06.560
Takes a while to get started.

00:27:06.560 --> 00:27:07.040
Hold on.

00:27:07.040 --> 00:27:07.760
We're good now.

00:27:07.760 --> 00:27:08.100
We're running.

00:27:08.100 --> 00:27:11.200
I love that.

00:27:11.200 --> 00:27:16.220
I told this a couple of times at work and instead of like the pause, I counted on my fingers.

00:27:16.220 --> 00:27:20.080
Well, as long as I can't see, it's fine.

00:27:20.080 --> 00:27:27.840
So actually, this brought back memories of a really funny, doesn't directly involve Python, but it involves open source.

00:27:27.840 --> 00:27:32.800
And if it were made in a later date, it probably would be involving Python, but instead it involves Java.

00:27:33.440 --> 00:27:34.740
It's a video, which is really funny.

00:27:34.740 --> 00:27:35.400
Yeah.

00:27:35.400 --> 00:27:36.380
It's called Java forever.

00:27:36.920 --> 00:27:38.660
And this is an amazing video.

00:27:38.660 --> 00:27:40.020
So people watch this.

00:27:40.020 --> 00:27:41.720
It's like high production value.

00:27:41.720 --> 00:27:43.000
I hadn't seen this before.

00:27:43.000 --> 00:27:45.120
And it's really, really hilarious.

00:27:45.120 --> 00:27:45.660
Yeah.

00:27:45.720 --> 00:27:47.020
So there's this family.

00:27:47.020 --> 00:27:52.600
They love .NET, Microsoft, and they will never stray from them like a very authoritative father.

00:27:52.600 --> 00:27:59.440
But there's a rebellious 18-year-old who loves open source and Java and all sorts of crazy mayhem ensues.

00:27:59.440 --> 00:28:01.300
And we can't do it justice here.

00:28:01.360 --> 00:28:02.380
So I'll just link to the YouTube.

00:28:02.380 --> 00:28:03.220
It's pretty funny.

00:28:03.220 --> 00:28:03.680
Check it out.

00:28:03.680 --> 00:28:04.360
Yeah.

00:28:04.360 --> 00:28:05.100
All right.

00:28:05.100 --> 00:28:05.760
All right.

00:28:05.760 --> 00:28:07.340
Thanks for the joke, Brian.

00:28:07.340 --> 00:28:07.800
Thank you.

00:28:07.800 --> 00:28:08.020
Yeah.

00:28:08.020 --> 00:28:08.440
Catch you later.

00:28:08.440 --> 00:28:08.700
Bye.

00:28:08.900 --> 00:28:10.520
Thank you for listening to Python Bytes.

00:28:10.520 --> 00:28:13.040
Follow the show on Twitter via at Python Bytes.

00:28:13.040 --> 00:28:15.940
That's Python Bytes as in B-Y-T-E-S.

00:28:15.940 --> 00:28:19.340
And get the full show notes at pythonbytes.fm.

00:28:19.340 --> 00:28:23.700
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:28:23.700 --> 00:28:26.400
We're always on the lookout for sharing something cool.

00:28:26.400 --> 00:28:29.780
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:28:30.180 --> 00:28:33.300
Thank you for listening and sharing this podcast with your friends and colleagues.

