WEBVTT

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

00:00:04.580 --> 00:00:10.180
This is episode 75, recorded April 25th, 2018. I'm Michael Kennedy.

00:00:10.180 --> 00:00:11.020
And I'm Brian Okken.

00:00:11.020 --> 00:00:15.860
And we've got a bunch of awesome stuff lined up for you, like always. But before we get to it,

00:00:15.860 --> 00:00:19.460
I want to say thank you to Datadog. They're sponsoring this episode like they have many,

00:00:19.460 --> 00:00:23.340
and they're a big part of why the show keeps going. So thank you, Datadog.

00:00:23.340 --> 00:00:33.040
So Brian, people often refer to the thing that runs your Python code when you type Python as the interpreter.

00:00:33.040 --> 00:00:39.180
But only sometimes does it actually interpret. Sometimes it compiles. Sometimes it compiles,

00:00:39.180 --> 00:00:46.440
depending on what underlying thing you use to run it, right? PyPy versus cPython versus say Python.net.

00:00:46.440 --> 00:00:49.580
You found it interesting for one like that for this week, right?

00:00:49.580 --> 00:00:54.120
I had to go look it up. I was surprised we hadn't covered it yet. There's a package called Numba.

00:00:54.120 --> 00:01:03.360
And it's built on top of NumPy. But it's a fairly easy way to speed up a bunch of your code by adding a

00:01:03.360 --> 00:01:10.820
just-in-time compiler to it. And I've also linked, so I've got a link to the library itself and also to

00:01:10.820 --> 00:01:17.060
an introduction article that I found that's pretty nice. It's pretty easy to use. And they have this

00:01:17.060 --> 00:01:23.680
article we're linking to has some speed up tests where you just put it like a little JIT decorator

00:01:23.680 --> 00:01:28.760
on a function that you want to speed up. And there's a bunch of flags to it. You can try to do it ahead

00:01:28.760 --> 00:01:37.240
of time or not, but it'll compile down some of your code to C code as good as it can. And you can specify

00:01:37.240 --> 00:01:45.080
data types too if you want to even allow it to be even faster. And I'm pretty blown away with how

00:01:45.080 --> 00:01:51.700
trivial it is to add some of this stuff to your code and speed it up. Some of the speed ups are like 78

00:01:51.700 --> 00:01:53.940
times faster and stuff, depending on your algorithm.

00:01:53.940 --> 00:01:59.760
That is really awesome. And this thing lives in such an interesting place. And like when I set the stage,

00:01:59.760 --> 00:02:07.940
it's not CPython, but it's also not a full compiler. It's not a JIT compiler either. It doesn't attempt to do

00:02:07.940 --> 00:02:16.620
what like it be a general solution. Anything like PyPy, P-Y-P-Y is a general purpose JIT compiler trying to make all your Python fast.

00:02:17.100 --> 00:02:25.560
So they say that this is a compiler for Python arrays and numerical functions, period. That's pretty awesome, right?

00:02:25.560 --> 00:02:40.400
There's a lot of people working with that sort of stuff that a lot of the code doesn't have to be really fast, but then they've got a big blob of data that they've got to deal with and run some algorithm over it. And in those cases with a big array, that's a great place to apply this.

00:02:40.400 --> 00:02:52.080
Yeah, it's really cool. And so if you have tight loops that are slow because of some kind of NumPy thing or arrays or other numerical operations, slap a decorator on it, make it go fast. Pretty sweet.

00:02:52.080 --> 00:03:10.220
Yeah. And we had a comment from somebody that you didn't know whether or not we talked about libraries. They thought we were just talking about articles and stuff. And I do want to include libraries. And so I've been trying to make sure going back and some of the ones that people really ought to know about if they don't know already, we'll try to get those in here and there. So it's good.

00:03:10.220 --> 00:03:19.860
Yeah, sure. Absolutely. If we haven't talked about it, it's definitely a game for being a cover on the show. So speaking of libraries that people care about, what's the most common way to get them?

00:03:19.860 --> 00:03:20.360
Pip install.

00:03:20.360 --> 00:03:39.160
Pip install. Well, as of recently, a couple of days ago, now you pip install with pip 10. So if you haven't yet, you should pip install --upgrade pip and maybe put a pip 3 on the front, depending on what OS you're on. But yeah, so there's a brand new version of pip and a major version as well. That's pretty cool, right?

00:03:39.160 --> 00:03:41.480
Yeah. So what do we get new? Do you know?

00:03:41.480 --> 00:03:57.240
Yeah. So we no longer have Python 2.6 support. It is out. If you're living, I don't know, way, way in the past, like 2006, it was good enough for me, it's good enough for my code, then you should stick on pip 9 because it's no longer going to support it.

00:03:57.480 --> 00:04:12.860
It supports this new feature that's described by PEP 518, which allows you to specify what packages are required to build from source. So that's kind of cool. You can say these are requirements to start from source and these are other requirements.

00:04:13.800 --> 00:04:20.200
It improves Unicode on Windows. It has a pip config command. I've never used pip config. Have you?

00:04:20.200 --> 00:04:21.120
I don't think so.

00:04:21.120 --> 00:04:30.200
I think it's new. So apparently you can set up like default behaviors and stuff like that. And it can be based on virtual environments or it can be based on users or it can be based on machines.

00:04:30.200 --> 00:04:48.820
So this is probably going to be a nice handy thing to dig into. Maybe we should do a whole section on just leveraging pip config. Also, if you pip install --upgrade a thing that used to try to upgrade all the dependencies, if I remember correctly, now the default upgrade strategy will be only to upgrade dependencies if needed.

00:04:48.820 --> 00:04:56.700
Right. So if the thing says I require doc opt six and you have doc opt four, it'll upgrade it. But if it doesn't say it requires that version, then it'll just leave it alone.

00:04:56.940 --> 00:05:00.380
So that could be for better or worse. I'm not sure. And then a bunch of bug fixes.

00:05:00.380 --> 00:05:01.220
Okay. Neat.

00:05:01.220 --> 00:05:08.460
Yeah. So if you're out there and you're not living super far in the past, be sure to upgrade your pip. It's nice. And there's even been a point release since then.

00:05:08.460 --> 00:05:24.940
One of the things I really like pip 10, this is a minor thing, is that when you type pip list, it lists your packages. And it used to, in pip like nine, it would give you a warning that there's a table configuration and you can do the old style or the new style.

00:05:24.940 --> 00:05:29.340
And that's gone. And in pip 10, it just gives you the table. And I like that.

00:05:29.340 --> 00:05:41.140
Yeah. That's really awesome. I didn't like that warning there because if you're doing like screencasts or videos or anything, it looked like something was wrong, but it wasn't actually wrong. It was just like, hey, we're changing how this works. So I'm glad that that's over.

00:05:41.300 --> 00:05:58.300
So when I have functions that just have a bunch of positional arguments, right? And it's like true, true, false, true. Like what the heck does that mean? Who knows? Right. So you've got a nice way to fix that. That's a modern Python only thing, right?

00:05:58.400 --> 00:06:05.400
I'm chuckling because I'm just leaving Michael hanging on the transitions between articles today, but I'll try to work on that.

00:06:05.400 --> 00:06:06.060
Sorry, I got it.

00:06:06.800 --> 00:06:23.880
This is actually pretty awesome. There's a, I don't know how I missed this. There's an article from Trey Hunter called keyword named arguments in Python and how to use them. And basically, I think he's right. I was talking to him earlier and a lot of people looked at this article and went, yeah, I know how to use keyword arguments.

00:06:24.200 --> 00:06:53.400
So keyword arguments are very useful and they're things you always have to name your variables that are argument names for a function and the color of the function can use those. You can specify them. And if you don't specify them, you have to send them in order. But if you do specify them, you can rearrange the order if you want. You can also, one of the things that's often used, how they're often used is you've got like a whole bunch of default values for arguments and a color just needs to override like one or two. You can just name it that way.

00:06:53.820 --> 00:07:23.380
But one of the things in Python three is the different use of the asterisks in all of this. And there's a way to kind of separate your positional arguments from your named only arguments. And if you stick a star in as one of the variables, it forces everything to the right to be only named. So a caller has to provide those with names. And I didn't, that's something that I completely missed. And that's pretty cool.

00:07:23.440 --> 00:07:53.420
I like it.

00:07:53.420 --> 00:08:05.840
And you're like, what do I do here? I have no idea. I sure hope the documentation tells me because of the function says I take anything. You make up a name. I'll take it. But there's usually like a handful of things it actually takes.

00:08:06.000 --> 00:08:19.580
Right. There's a bounded set of like, these are the five things you can pass. They're not all required. Put them in as keyword arguments. Right. But if it starts our KWR, you're just saying to everybody, you know, good luck, go hunting. Hopefully I documented this. Right. Yeah.

00:08:19.580 --> 00:08:40.000
So you find something on Stack Overflow. So you could say star, comma, and then keyword, the argument name equals a default value, argument name equals default value. And then it has exactly the same behavior, except you can see both in your tooling or editor, as well as in looking at the function, what it takes. And you call it exactly the same way. So I really love this feature.

00:08:40.000 --> 00:08:53.140
I love it too. And I like your explanation of other reasons to use it. I'm with you. The KWR, it just makes it so the user of that function has no idea what they're supposed to pass in.

00:08:53.140 --> 00:09:19.160
The worst offender of this is the AWS API. It's super frustrating. Like sometimes it's dictionaries of dictionaries. Sometimes they're not. It's just don't get me started. And the documentation doesn't cover it. Right. The documentation will say, well, this sub part is this name, but it's this type, which is really a dictionary, but there's no mention or description of what goes in that sub dictionary. It's just, they can be totally avoided by doing cool stuff like this, which has the same, same effect.

00:09:19.840 --> 00:09:46.840
Other stuff that's cool, by the way, is Datadog. So if you have an app that spans multiple processes, maybe is using different services, it's a piece together larger app, you should definitely check out Datadog. It's a monitoring solution for providing deep visibility. And it tracks down issues across distributed Python apps. So it's pretty awesome. Within just a few minutes, you'll be able to investigate bottlenecks in your code by exploring graphs and rich dashboards.

00:09:47.540 --> 00:10:06.240
So if you want to check that out, if you think having better insight into how your overall app is working, visualize your Python performance today, get started with Datadog, do a free trial, and they'll give you a free Datadog t-shirt. It's very cute and gray and white, and I like it. So check it out over at pythonbytes.fm/Datadog.

00:10:06.240 --> 00:10:10.660
One of the things that we haven't talked about for a while is how to install packages.

00:10:12.740 --> 00:10:38.740
There's a really great new way with pip 10 to pip install them, but there's more to it than that, right? It's not just pip install the thing and the client side behavior is different. For the first time in a very long time ever, maybe? I don't know. It goes farther back than I know the history of it. That means something different on the server side. So finally, finally, finally, pypi.org officially launches.

00:10:38.740 --> 00:10:39.240
Yay!

00:10:39.240 --> 00:10:57.360
More importantly, legacy pypi, the one at pypi.python.org slash pypi, that one, is now over at legacy.pypi.org. And that's like an old stick around version, and they're actually shutting it down.

00:10:57.920 --> 00:11:06.100
So the pypi.python.org will redirect over to what's called warehouse. That's the code name for the new implementation running at pypi.org.

00:11:06.100 --> 00:11:07.300
That's nice. I like it.

00:11:07.300 --> 00:11:22.340
Yeah, it's super awesome. This is no longer based on a sort of prototype code that grew before the web frameworks even existed. This is based on Pyramid. It's based on a lot of the common programming APIs and styles that we know today.

00:11:22.340 --> 00:11:30.480
It even uses Kubernetes and Docker and all sorts of amazing stuff. It uses Elasticsearch, maybe Postgres. I'm not entirely sure about that.

00:11:30.480 --> 00:11:38.940
So yeah, if people are thinking about adding features to PyPI and then they've thought, oh, but this is some pretty gnarly code. I'm not going in there.

00:11:38.940 --> 00:11:42.340
Well, the new version is the official version and it's much easier to add features to.

00:11:42.440 --> 00:11:45.320
You talked with some of the people involved with this, right?

00:11:45.320 --> 00:11:53.680
I did. So I talked with three of the folks that worked on it, and we talked about a lot of the stories and when it launched and stuff.

00:11:53.680 --> 00:12:04.680
And that's coming out on Talk Python this week. So it's a race. Does Python Bytes beat Talk Python episode 159? I'm not sure, but one of them is going to be just about the same time.

00:12:04.680 --> 00:12:11.500
So if you're interested in this, go listen to it. You'll hear a lot of interesting stories. Like, Brian, do you remember when it used to be there was PyPI.io?

00:12:11.500 --> 00:12:12.140
Yeah.

00:12:12.140 --> 00:12:20.700
Do you remember that in the early days? And then later it became PyPI.org. I figured out what the story was around that. I thought it was indecision, right?

00:12:20.940 --> 00:12:42.480
Oh, we'll do IO. No, no, actually, we should make it more organizational. We'll do .org, right? It turned out that what had happened was PyPI.org was owned by someone else. The PSF didn't own it. And they had to try to get a hold of it. So in the meantime, they used PyPI.io, but their ultimate goal was always to have PyPI.org. It just took them a while to actually acquire the domain.

00:12:42.940 --> 00:12:50.780
So if stories like that are interesting, we got like a whole hour of it on Talk Python. So people would check that out. So packages in Python.

00:12:50.780 --> 00:12:52.240
Tell me about them.

00:12:52.240 --> 00:12:53.820
We got a theme going on here.

00:12:53.820 --> 00:12:57.020
I think we do have a theme. I got one more package after this, by the way.

00:12:57.140 --> 00:13:09.280
So one of the things I forgot about is when you're kind of coming into, there's a lot of people that, as we know, come into Python from other languages and they'll rush in and figure out how to do something quickly.

00:13:09.280 --> 00:13:13.020
And then they think, yeah, I'm a Python expert because I wrote a script.

00:13:13.020 --> 00:13:15.520
Isn't people are trying to become experts or anything.

00:13:15.660 --> 00:13:26.800
But one of the things that tripped me up right at first is getting my head around what is a module, what is a package, really how to users make those.

00:13:26.800 --> 00:13:34.000
And, you know, dealing with dunder in it and dunder in it files and on where do they go and all that stuff.

00:13:34.000 --> 00:13:37.400
And so there's a nice tutorial now.

00:13:37.400 --> 00:13:38.560
I think it's a real.

00:13:38.560 --> 00:13:39.700
Yeah, it's a real Python.

00:13:39.700 --> 00:13:42.080
Python modules and packages and introduction.

00:13:42.080 --> 00:13:44.100
And I just really liked this.

00:13:44.600 --> 00:13:45.640
It's a good rundown.

00:13:45.640 --> 00:13:46.380
It's pretty simple.

00:13:46.380 --> 00:13:49.320
And this is something I'm bookmarking.

00:13:49.320 --> 00:13:55.100
So a lot of the people I work with that are new to Python and trying to figure this stuff out, I can point them to this.

00:13:55.100 --> 00:13:56.520
And it's a good introduction.

00:13:56.520 --> 00:13:57.640
Yeah, it's a great introduction.

00:13:57.640 --> 00:13:58.000
Yeah.

00:13:58.000 --> 00:14:03.340
And it's definitely that kind of stuff that when you're new, it's a little bit weird to figure out the difference, right?

00:14:03.340 --> 00:14:07.220
Like use packages and modules kind of the same, but they're not the same.

00:14:07.220 --> 00:14:08.000
What's the story?

00:14:08.000 --> 00:14:14.100
And especially learning how to package up your project to make it accessible to other programs is tricky.

00:14:14.240 --> 00:14:21.640
This isn't going into packaging itself, which is a bummer that we have those as two different aims.

00:14:21.640 --> 00:14:27.780
Really, this is talking about a directory with a __init__() in it and subdirectories and stuff.

00:14:27.780 --> 00:14:29.980
We're talking packages and sub packages.

00:14:29.980 --> 00:14:32.060
But it is the initial part.

00:14:32.060 --> 00:14:38.120
Once you have this down, then you can jump into packaging and distributing code to share.

00:14:38.620 --> 00:14:40.020
But this is a good starter.

00:14:40.020 --> 00:14:41.500
So it's a good learning place.

00:14:41.500 --> 00:14:42.880
Yeah, it's definitely a good learning place.

00:14:43.220 --> 00:14:54.880
So remember last week we spoke about the joint project that the PyCharm team and the Python Software Foundation did with their 2017 Python survey?

00:14:54.880 --> 00:14:55.400
Yeah.

00:14:55.540 --> 00:15:11.380
One of the interesting pieces of data there was the people who are data scientists do more Python 3, modern Python that is, than as a percentage of their projects, than say web developers or other types of Python developers.

00:15:12.140 --> 00:15:14.180
It's partly because they're starting from scratch.

00:15:14.180 --> 00:15:15.160
More of them.

00:15:15.160 --> 00:15:17.020
It's like a more new type of thing.

00:15:17.020 --> 00:15:18.440
So why start with the old, right?

00:15:18.440 --> 00:15:30.020
Well, the big news today is that Pandas, one of the major, most important foundational data science libraries, is going modern Python only at the end of the year.

00:15:30.140 --> 00:15:32.200
That's a big thing, yeah, definitely.

00:15:32.200 --> 00:15:40.360
Yeah, I would say this is as big of news as Django 2 going Python 3 only on similar timescales.

00:15:40.360 --> 00:15:42.860
Well, they're already out with their new stuff.

00:15:42.860 --> 00:15:44.880
So I guess just in terms of their old support ones.

00:15:44.880 --> 00:15:46.460
So that's pretty cool, right?

00:15:46.460 --> 00:15:52.860
One more major, major building block that it used to be, well, if I move to Python 3, I won't be able to get my libraries.

00:15:52.860 --> 00:15:57.600
It's now the story is if you don't move to Python 3, you don't get the best, newest libraries.

00:15:57.600 --> 00:15:58.600
So pretty awesome.

00:15:58.600 --> 00:16:00.140
And it isn't just getting the newest.

00:16:00.140 --> 00:16:02.360
It's also security updates and things like that.

00:16:02.360 --> 00:16:08.460
Yeah, like part of their announcement said on December 31st, 2018, Pandas will drop support for Python 2.7.

00:16:08.460 --> 00:16:10.660
Presumably stuff before that's not even supported.

00:16:10.660 --> 00:16:14.840
This includes no backports of security or bug fixes, period.

00:16:14.840 --> 00:16:18.560
They are open to letting somebody take that to become their job.

00:16:18.560 --> 00:16:21.020
But they're like, we're not doing that.

00:16:21.020 --> 00:16:22.400
So we're moving on.

00:16:22.400 --> 00:16:24.800
Is Pandas like a volunteer thing?

00:16:24.800 --> 00:16:27.100
Is it open source just run by open source people?

00:16:27.100 --> 00:16:27.420
Do you know?

00:16:27.420 --> 00:16:27.940
I think so.

00:16:27.940 --> 00:16:31.220
I think it might be part of the high side stuff.

00:16:31.220 --> 00:16:32.020
Sorry.

00:16:32.020 --> 00:16:43.060
Part of the support thing is, I mean, you can kind of expect some companies to have back like, you know, security and bug fixes on old releases for a while.

00:16:43.280 --> 00:16:46.620
But, you know, open source projects, these are just people volunteering their time.

00:16:47.140 --> 00:16:50.960
I think it's completely reasonable for people to say, hey, we're done trying to support 2.7.

00:16:50.960 --> 00:16:51.640
Let's move on.

00:16:51.640 --> 00:16:52.260
Yeah, it makes sense.

00:16:52.260 --> 00:16:53.620
So I looked while you're talking.

00:16:53.620 --> 00:16:56.940
Pandas is a num focus sponsored project.

00:16:57.780 --> 00:17:03.620
So I think it's sort of donation supported, but through a more formal science organization.

00:17:03.620 --> 00:17:07.140
But still, those people are contributing features.

00:17:07.140 --> 00:17:15.220
They can either focus on bug fixes and making Python 2 stuff work or just moving forward and getting the latest, greatest stuff going.

00:17:15.340 --> 00:17:16.380
So that's pretty cool.

00:17:16.380 --> 00:17:17.660
Yeah, it's a good focus.

00:17:17.660 --> 00:17:20.040
So, Brian, that's it for this week for our items.

00:17:20.040 --> 00:17:22.940
Got anything in particular you want to talk about with everyone?

00:17:22.940 --> 00:17:27.000
I've got a couple episodes coming out on Talk Python.

00:17:27.240 --> 00:17:30.000
And I'm getting ready for PyCon.

00:17:30.000 --> 00:17:31.380
I'm looking forward to that.

00:17:31.380 --> 00:17:33.040
Yeah, you have a talk going there, right?

00:17:33.040 --> 00:17:33.900
That's going to be pretty awesome.

00:17:33.900 --> 00:17:36.760
Yeah, I'm getting a little nervous for that.

00:17:36.760 --> 00:17:37.680
But it'll be good.

00:17:37.680 --> 00:17:38.020
Don't worry.

00:17:38.020 --> 00:17:41.220
It's not like it's recorded and then also there's a bunch of people there.

00:17:41.220 --> 00:17:42.840
Oh, yeah, it's going to be forever.

00:17:42.840 --> 00:17:43.560
No stress.

00:17:43.560 --> 00:17:44.720
Just kidding.

00:17:44.720 --> 00:17:46.240
Yeah, no stress.

00:17:46.240 --> 00:17:46.900
Thanks for that.

00:17:46.900 --> 00:17:47.020
Yeah, yeah.

00:17:47.020 --> 00:17:48.960
No, I'm just teasing you because I know you'll do great.

00:17:48.960 --> 00:17:52.140
We also have a booth there, you and I and a few others.

00:17:52.140 --> 00:17:54.660
So people can come visit us at the booth like the last year.

00:17:54.880 --> 00:18:00.480
I'd like people to try to reach out if they want to just come on and if there's something they want to record.

00:18:00.480 --> 00:18:04.580
I think I'm going to take some recording equipment so we can do some short recordings.

00:18:04.580 --> 00:18:05.460
Oh, that'd be awesome.

00:18:05.460 --> 00:18:08.720
Yeah, I'm definitely bringing my mic and going to do some stuff like that as well.

00:18:08.720 --> 00:18:09.460
What's up with you?

00:18:09.460 --> 00:18:14.920
Well, remember last time Matt Harrison was on the show and we were joking about trying to get some course or something other done?

00:18:14.920 --> 00:18:15.400
Yeah.

00:18:15.400 --> 00:18:18.400
Well, it's taken me a ton of work this past seven days.

00:18:18.400 --> 00:18:21.820
But nonetheless, we now have a brand new course to announce.

00:18:21.820 --> 00:18:24.320
Python 3, an illustrated tour.

00:18:24.780 --> 00:18:25.200
Nice.

00:18:25.200 --> 00:18:32.520
So the idea is it basically only covers the features that were new to Python as a Python 3.

00:18:32.520 --> 00:18:35.760
So it says here are a couple of peps that talk about, say, type annotations.

00:18:35.760 --> 00:18:40.120
And here's some graphics and other sort of walkthrough of what that means for you.

00:18:40.180 --> 00:18:54.580
So if you feel like you are not using all of the features of Python 3 or you're coming especially in Python 2 and you're like, I need a quick show me the new stuff sort of in a practical way, then check out the Python 3 and illustrated tour.

00:18:54.740 --> 00:18:55.860
That's done by Matt Harrison.

00:18:55.860 --> 00:18:57.000
And it came out really well.

00:18:57.000 --> 00:19:00.120
So check it out at talkpython.fm/illustrated.

00:19:00.120 --> 00:19:00.600
Okay.

00:19:00.600 --> 00:19:01.460
I'll check that out.

00:19:01.460 --> 00:19:01.700
Yeah.

00:19:01.700 --> 00:19:01.940
Yeah.

00:19:01.940 --> 00:19:03.000
I learned a lot.

00:19:03.000 --> 00:19:04.080
It's really, really fun.

00:19:04.080 --> 00:19:05.060
We keep learning things.

00:19:05.060 --> 00:19:09.120
Like, for example, you talked about the star at the beginning of the function arguments, right?

00:19:09.120 --> 00:19:10.180
That kind of stuff is in there.

00:19:10.180 --> 00:19:11.980
And I didn't know about that until too recently either.

00:19:11.980 --> 00:19:12.400
Okay.

00:19:12.400 --> 00:19:12.780
Cool.

00:19:12.780 --> 00:19:13.140
All right.

00:19:13.280 --> 00:19:14.500
It's been a good talk today.

00:19:14.500 --> 00:19:14.880
Thanks.

00:19:14.880 --> 00:19:15.180
Yeah.

00:19:15.180 --> 00:19:15.500
You bet.

00:19:15.500 --> 00:19:16.100
Very nice one.

00:19:16.100 --> 00:19:18.440
We really dug into the packages this time, didn't we?

00:19:18.440 --> 00:19:19.720
And we don't plan this.

00:19:19.720 --> 00:19:20.820
It just happens.

00:19:20.820 --> 00:19:21.660
It just happens.

00:19:21.660 --> 00:19:22.060
That's right.

00:19:22.060 --> 00:19:22.780
All right.

00:19:22.780 --> 00:19:23.500
Well, thanks, Brian.

00:19:23.500 --> 00:19:24.700
And talk to you all later.

00:19:24.700 --> 00:19:25.020
Bye.

00:19:25.020 --> 00:19:28.160
Thank you for listening to Python Bytes.

00:19:28.160 --> 00:19:30.740
Follow the show on Twitter via at Python Bytes.

00:19:30.740 --> 00:19:33.620
That's Python Bytes as in B-Y-T-E-S.

00:19:33.620 --> 00:19:37.060
And get the full show notes at pythonbytes.fm.

00:19:37.060 --> 00:19:41.380
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:19:41.520 --> 00:19:44.100
We're always on the lookout for sharing something cool.

00:19:44.100 --> 00:19:47.480
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:19:47.480 --> 00:19:51.100
Thank you for listening and sharing this podcast with your friends and colleagues.

