WEBVTT

00:00:00.220 --> 00:00:04.640
This is Python Bytes. Python headlines and news delivered directly to your earbud.

00:00:04.640 --> 00:00:11.040
It's episode 13 on Monday the 13th. Oh my god. Recorded February 13th, 2017.

00:00:11.040 --> 00:00:17.140
Hey Brian, I want to start by saying thanks and hello. I want to say thanks to a new sponsor of

00:00:17.140 --> 00:00:21.440
the show. We have a new sponsor. That's wonderful. We do. And I want to say thank you to Metis.

00:00:21.440 --> 00:00:25.960
They're a data science training company. We have some boot camp type stuff that's really excellent

00:00:25.960 --> 00:00:31.580
and I'll tell everyone about that later. But I kind of like to learn about alternate Python

00:00:31.580 --> 00:00:38.860
implementations and where they are these days. We had heard about Piston, which is spelled P-Y-S-T-O-N,

00:00:38.860 --> 00:00:45.660
developed by Dropbox and an announcement came out at the end of last month saying that Piston is no

00:00:45.660 --> 00:00:52.740
longer to be supported by Dropbox. Yeah, so this is a really interesting development. It's a little

00:00:52.740 --> 00:00:59.380
unfortunate. I don't really know how to interpret as a positive or negative. I mean, it could be just

00:00:59.380 --> 00:01:03.540
there was an experiment. We're moving on to the next experiment. But what it was is an alternate

00:01:03.540 --> 00:01:09.480
version implementation. I have a hard time calling an interpreter when it's actually JIT compiled, but

00:01:09.480 --> 00:01:17.720
alternate interpreter for Python. And the idea was it supported Python 2.7 and it did JIT compilation

00:01:17.720 --> 00:01:26.300
instead of interpreting. So its main goal was to be a very fast but highly compatible alternate

00:01:26.300 --> 00:01:33.540
implementation of Python 2.7. Yeah. And so there's a couple of blog posts, one on the Piston blog and

00:01:33.540 --> 00:01:43.820
one on by Kevin Modzilewski and one on his own site, kevmod.com. And it looks like there's lots of

00:01:43.820 --> 00:01:50.620
reasons around it. But the general flow of it is that the cost and benefit, it cost more than they were hoping

00:01:50.620 --> 00:01:56.920
and it benefited them not as much as they were hoping. Yeah, so we look at the different implementations of

00:01:56.920 --> 00:02:04.200
Python. We've got obviously CPython and its versions, but we've got Piston, we've got Unladen Swallow,

00:02:04.680 --> 00:02:13.380
we've got Cython, we've got PyPy, P-Y-P-Y, IronPython, Jython. There's a bunch of different ones and they all have these

00:02:13.380 --> 00:02:20.760
trade-offs. And so they were actually able to make Piston pretty quick in the benchmark story. So they got it up to 95%

00:02:20.760 --> 00:02:28.820
faster than CPython 2.7. But they also ran into other drawbacks and they found like actually when it ran the Dropbox

00:02:29.260 --> 00:02:37.760
code itself, it was only 10% faster, but it put a lot more memory pressure on it because it does GC instead of reference counting.

00:02:37.760 --> 00:02:46.540
I've got mixed feelings about it. I like that the project was out in the open, open source, and people could watch this experiment.

00:02:46.540 --> 00:02:54.040
I wasn't really thrilled that they were targeting 2.7 to start with. The outcome of them just, I guess, not working on it anymore.

00:02:54.040 --> 00:02:58.900
It totally makes sense, but it is, I guess, it's just a thing. It's interesting.

00:02:58.900 --> 00:03:04.640
Yeah, I think it's a case of a couple of things. I mean, nobody said it, but I feel like, you know,

00:03:04.640 --> 00:03:10.700
moving to Python 3 is also causing like a sort of a rethinking of this as well. Like if they're going to be moving to Python 3,

00:03:10.700 --> 00:03:16.220
then they'd have to redo this work and so on. One of the problems or criticisms, mild criticisms, let's say,

00:03:16.220 --> 00:03:22.380
was that this was like a from scratch thing. It didn't build on existing stuff. So it didn't build on PyPy

00:03:22.380 --> 00:03:30.780
because PyPy wants to be fast at the cost of compatibility and to run a multi-million line Python application that is Dropbox.

00:03:30.780 --> 00:03:36.500
Compatibility is like super, super critical. So they're like, well, we can't have any incompatibility,

00:03:36.500 --> 00:03:42.200
but it wasn't directly based on CPython, even though it took a bunch of pieces in. And so I don't know,

00:03:42.200 --> 00:03:47.880
it was like this sort of other experiment where the thing that gives me the most hope right now is what

00:03:47.880 --> 00:03:53.780
Brett Cannon and Dino Veland are working on with Pigeon, P-Y-J-I-O-N at Microsoft, where they're trying

00:03:53.780 --> 00:03:57.940
to add like JIT plugin capabilities to the existing CPython.

00:03:57.940 --> 00:04:00.780
Yeah. There is some more CPython news.

00:04:00.780 --> 00:04:03.960
There's big CPython news. CPython

00:04:03.960 --> 00:04:08.340
has just as of three days ago

00:04:08.340 --> 00:04:10.920
moved. It used to be

00:04:10.920 --> 00:04:19.180
long, long ago in 2006, it moved to Subversion, SVN. And from 2006 to 2011, it was on Subversion.

00:04:19.180 --> 00:04:21.060
Then it moved to Mercurial.

00:04:21.060 --> 00:04:25.700
What's kind of interesting because that's when Git came out and Mercurial, they both, all this whole

00:04:25.700 --> 00:04:31.880
distributed version control system story kind of happened around then. And Mercurial is interesting

00:04:31.880 --> 00:04:36.040
because it's written in Python. Like for example, Facebook does some really interesting things

00:04:36.040 --> 00:04:41.380
with Mercurial. And so it seemed like a natural home for Python to live on Mercurial.

00:04:41.380 --> 00:04:44.520
But, you know, GitHub has really been

00:04:44.520 --> 00:04:47.980
the place where people go to do open source.

00:04:47.980 --> 00:04:52.240
Not just a container for open source stuff like SourceForge used to be or something,

00:04:52.240 --> 00:04:55.560
but there's like a whole social ecosystem where everybody

00:04:55.560 --> 00:04:58.440
comes and collaborates in GitHub.

00:04:58.620 --> 00:05:04.400
And so the big news is as of Friday, Python, CPython and a few of its pieces have moved

00:05:04.400 --> 00:05:05.800
to GitHub.

00:05:05.800 --> 00:05:10.880
I think that's great. And I think that one of the great things about it is the culture around

00:05:10.880 --> 00:05:15.200
GitHub. Whether you're a pro GitHub person or not, that's where a lot of people look for

00:05:15.200 --> 00:05:19.920
opportunities to help out in open source projects. It's a higher incentive for people to get involved

00:05:19.920 --> 00:05:21.780
with helping to maintain CPython.

00:05:21.780 --> 00:05:25.620
Yeah, absolutely. Yeah, I think that's actually the main motivation, which is really interesting.

00:05:25.620 --> 00:05:30.040
So there's a link to the mailing list where they talk about it. We'll put that in the show notes.

00:05:30.040 --> 00:05:32.340
There's obviously the link to the repository in GitHub.

00:05:32.340 --> 00:05:35.640
There's a Reddit thread where people are talking about this.

00:05:35.640 --> 00:05:38.000
And a lot of people are bemoaning the fact

00:05:38.000 --> 00:05:41.620
that it's not on something totally open source.

00:05:41.620 --> 00:05:44.700
It's not on something that is

00:05:44.700 --> 00:05:48.440
based on Python. Like it used to be on a source control system

00:05:48.440 --> 00:05:49.940
built on top of Python.

00:05:49.940 --> 00:05:52.400
And while that's cool,

00:05:52.400 --> 00:05:57.580
like you shouldn't, my opinion is you shouldn't do that at the cost of people loving to work on the

00:05:57.580 --> 00:06:04.120
project. So the real thing that you want to read to get the deep insight on this is at snarky.ca.

00:06:04.120 --> 00:06:08.600
So this is Brett Cannon's blog, and it's the history behind the decision to move Python to GitHub.

00:06:08.600 --> 00:06:13.520
And he talks about how he worked with a bunch of people to come to this decision.

00:06:13.740 --> 00:06:23.540
And he says, you know, back in 2007, it became really obvious that working on the source code and doing code reviews and collaboration was actually a burden.

00:06:23.540 --> 00:06:28.240
There were people submitting, you know, patches and stuff.

00:06:28.380 --> 00:06:33.020
And they would sit there for maybe years before somebody actually reviewed it.

00:06:33.020 --> 00:06:39.560
Like how excited would you be to work on a project to contribute to open source if you submit a patch and it doesn't get looked at for a year, right?

00:06:39.560 --> 00:06:47.280
And so the workflow on GitHub is just so much easier for pull requests and reviewing it.

00:06:47.280 --> 00:06:53.980
And so basically, Brett said, like, I want it to be so easy that I could take my tablet and sit on the beach where I have some kind of internet connectivity

00:06:53.980 --> 00:06:56.600
and review pull requests and chill out.

00:06:56.600 --> 00:06:58.300
Like, that's just not how it works now.

00:06:58.300 --> 00:07:00.820
Like, you've got to have a machine with SSH keys and all sorts of stuff.

00:07:00.820 --> 00:07:08.560
So the main driver behind this is trying to make it easier for core developers to be more responsive to people who contribute to the project,

00:07:08.560 --> 00:07:09.920
which I think is super positive.

00:07:09.920 --> 00:07:12.260
Yeah, I think I'm really excited about it.

00:07:12.260 --> 00:07:17.960
And actually, I had never really considered contributing myself, but I definitely consider it more now.

00:07:17.960 --> 00:07:21.480
Yeah, I definitely consider it more accessible now.

00:07:21.600 --> 00:07:25.640
And I think this is absolutely the right move, even if it's breaking some conventions.

00:07:25.640 --> 00:07:28.780
Like, it's moving off of Python as the thing that supports it.

00:07:28.780 --> 00:07:35.080
It's moving off a fully, fully open source thing to, like, this somewhat closed thing, which is GitHub.

00:07:35.080 --> 00:07:36.440
But still, I think it's great.

00:07:36.440 --> 00:07:44.340
So remember last time when we talked about the top 10 Python articles of 2016?

00:07:44.340 --> 00:07:44.980
Yes.

00:07:45.160 --> 00:07:49.460
Yeah, so I said, well, let's just take a survey of the kind of category of these things.

00:07:49.460 --> 00:07:54.440
And I would say, like, a full two-thirds or more of those were data science.

00:07:54.440 --> 00:07:56.880
Data science is definitely important in Python.

00:07:56.880 --> 00:07:59.100
So I want to tell you about our sponsor, Metis.

00:07:59.100 --> 00:08:03.800
So Metis is a data science training company based in New York, San Francisco, Chicago, and Seattle.

00:08:04.400 --> 00:08:10.040
And they provide full-time immersive boot camps and evening courses that you can come.

00:08:10.040 --> 00:08:17.000
So if you have a full-time job, you can go, like, two nights a week for six weeks and take classes on all sorts of data science things.

00:08:17.000 --> 00:08:19.520
Machine learning and things like that.

00:08:19.700 --> 00:08:32.280
If you are wanting to learn more about data science, especially in a hands-on way, you live in New York or San Francisco, or you're willing to spend some time there, check out thisismetis.com slash talkpython.

00:08:32.280 --> 00:08:34.940
And maybe we'll feature your article next year.

00:08:34.940 --> 00:08:37.280
Yeah, that actually sounds pretty interesting.

00:08:37.280 --> 00:08:40.180
Yeah, I would love to go do more data science.

00:08:40.180 --> 00:08:43.360
So TensorFlow, they've got classes on that, all sorts of cool stuff.

00:08:43.360 --> 00:08:45.720
So check it out, thisismetis.com slash talkpython.

00:08:45.720 --> 00:08:47.020
All right.

00:08:47.160 --> 00:08:53.220
You know what they do a lot of in data science, a lot of functional programming, a lot of expressions, things like that, right?

00:08:53.220 --> 00:08:53.920
Yeah.

00:08:53.920 --> 00:08:55.580
Actually, I don't know.

00:08:55.580 --> 00:08:57.120
I'm not a data science person.

00:08:57.120 --> 00:08:59.180
The ones I've hung around seem to.

00:08:59.180 --> 00:09:05.280
There's an article called Using Functional Programming in Python Like a Boss, Generators, Iterators, and Decorators.

00:09:05.280 --> 00:09:07.260
And these are generators and iterators.

00:09:07.260 --> 00:09:12.900
Okay, all three of those, generators, iterators, and decorators are things that trip up intermediate Python people.

00:09:12.900 --> 00:09:15.580
Beginner people just ignore them for now.

00:09:16.120 --> 00:09:25.360
But this article is a Jupyter Notebook, which I like this trend of people just publishing Jupyter Notebooks as articles.

00:09:25.360 --> 00:09:27.580
It actually is good.

00:09:27.580 --> 00:09:29.880
And there's some good diagrams in here.

00:09:29.880 --> 00:09:37.060
Although the use of really large images, it's kind of annoying to me, but it's okay.

00:09:37.460 --> 00:09:47.160
Anyway, this article talks about, it also talks about just basically what a function is and what things can act like functions.

00:09:47.160 --> 00:09:53.620
And then talks about generators, iterators, and containers and how they all work together to make your code more expressive.

00:09:53.920 --> 00:09:59.040
And it seems like kind of an esoteric sort of thing to think about, but I think it's good.

00:09:59.040 --> 00:10:02.700
And this is a good, I like this article about thinking about this stuff.

00:10:02.700 --> 00:10:10.460
Yeah, I really think this is one of those things that when you come to Python from other languages, it takes you a while to get into these, right?

00:10:10.540 --> 00:10:20.060
Like the concept of a generator is quite different to somebody coming from C or I think Java, I don't think Java has this, things like that.

00:10:20.060 --> 00:10:23.720
But once you get the Zen of them, they're amazing.

00:10:23.720 --> 00:10:25.320
And they make such a big difference.

00:10:25.580 --> 00:10:29.160
But it's really a nice mental shift.

00:10:29.160 --> 00:10:31.920
Yeah, so I really think it's great that he's covering it.

00:10:31.920 --> 00:10:43.180
Also one of those topics that I don't think I remember when I finally grokked what people were talking about, but it took like three or four different articles talking about it for it to sink in for me.

00:10:43.180 --> 00:10:44.200
So here's another one.

00:10:44.200 --> 00:10:44.840
Yeah, excellent.

00:10:44.840 --> 00:10:45.720
Yeah, so we'll link to that one.

00:10:45.720 --> 00:10:54.560
And by some strange coincidence, just so everybody knows, the way that we pick things for this show is I go find a couple of interesting things.

00:10:54.560 --> 00:10:56.900
Brian goes and finds a couple of interesting things.

00:10:56.900 --> 00:10:59.260
We throw them together and then we just talk about them.

00:10:59.260 --> 00:11:06.800
And it happens to be the very next one is the same person in a Jupyter Notebook, but it's actually a totally different topic.

00:11:06.800 --> 00:11:08.640
But it's presented in a similar way.

00:11:08.640 --> 00:11:12.340
So this one is called It's Metaclasses All the Way Down.

00:11:12.760 --> 00:11:18.200
This is a quick but fairly deep dive into what metaprogramming is.

00:11:18.200 --> 00:11:24.020
And it starts out by saying, look, metaprogramming is a technique for writing computer programs that can treat themselves as data.

00:11:24.020 --> 00:11:28.160
So you can introspect, generate, and or modify them while they're running.

00:11:28.160 --> 00:11:29.580
And that's definitely Python.

00:11:29.580 --> 00:11:32.820
You can, at runtime, create types.

00:11:32.820 --> 00:11:39.140
You can add functions or even remove features from classes and objects, right?

00:11:39.300 --> 00:11:48.420
But mostly metaprogramming comes down to metaclasses where you can actually control what the class does.

00:11:48.420 --> 00:11:51.780
So there's all sorts of interesting examples of how you might use them.

00:11:51.780 --> 00:11:59.280
It starts out with an interesting quote saying, look, metaclasses are deeper magic than 99% of the users should ever worry about.

00:12:00.120 --> 00:12:02.660
If you wonder whether you need them, you don't.

00:12:02.660 --> 00:12:06.200
So if you don't, like, that was a quote by Tim Peters.

00:12:06.200 --> 00:12:11.240
If you don't deeply understand, like, yeah, this is totally, I'm going to solve this with a metaclass, like, you probably shouldn't mess with it.

00:12:11.240 --> 00:12:16.580
But they are the power that makes a lot of the magic inside Python happen.

00:12:16.980 --> 00:12:18.600
So a couple of examples.

00:12:18.600 --> 00:12:20.740
One is Django RRM.

00:12:20.740 --> 00:12:24.820
We could substitute SQLAlchemy ORM or PeeWee ORM models, right?

00:12:24.820 --> 00:12:32.040
So when you define, like, a model in Django or SQLAlchemy, you put what looks like column types with database constraints as the fields of the class.

00:12:32.040 --> 00:12:36.560
But then when you interact with them at runtime, they look like strings and integers and dates, right?

00:12:36.560 --> 00:12:45.700
And that transition, that sort of two-faced behavior of these things that they can be used in a database query in one way but then act as normal objects as others, that's metaclasses.

00:12:45.700 --> 00:12:55.240
Another example, there's a cool example about using them to make abstract classes and abstract functions that have to be implemented by things that inherit it and so on.

00:12:55.240 --> 00:12:58.800
Again, this is a nice Jupyter notebook.

00:12:58.800 --> 00:13:03.120
It has some cool pictures, but it really does help you understand this stuff pretty well with nice examples.

00:13:03.120 --> 00:13:03.780
Yeah.

00:13:03.780 --> 00:13:04.180
Yeah.

00:13:04.180 --> 00:13:05.020
I like this, too.

00:13:05.020 --> 00:13:07.560
It's funny that we both picked the same person's article.

00:13:07.560 --> 00:13:08.300
It's a small world.

00:13:08.300 --> 00:13:09.260
Yeah.

00:13:09.260 --> 00:13:16.160
I think we're kind of going on the stuff that most people don't need train right now.

00:13:16.160 --> 00:13:18.840
But next up is lambdas.

00:13:18.840 --> 00:13:27.460
And speaking of another thing that I think newbies get a little confused by, but there are lambda functions.

00:13:27.460 --> 00:13:36.000
Lambda functions are just unnamed functions that are, you can put the entire expression on one line.

00:13:36.000 --> 00:13:39.000
And so they're convenient in a lot of places.

00:13:39.000 --> 00:13:44.560
So here's an article from Dan Bader titled, Lambda functions in Python, what are they good for?

00:13:45.200 --> 00:13:50.580
And what I like about this article is it's just a fairly quick jump into it.

00:13:50.580 --> 00:13:57.580
I think everybody that thinks of themselves as a little bit more than just a beginner in Python should at least understand lambda functions.

00:13:58.140 --> 00:14:03.760
And the thing I really like about this article is it talks about places to not use them.

00:14:03.760 --> 00:14:10.620
Because when you finally get your head around lambdas, all of a sudden it's your hammer and everything looks like a nail.

00:14:10.620 --> 00:14:19.420
He talks about a couple of places like creating class methods and other places where maybe you shouldn't use a lambda for that.

00:14:19.420 --> 00:14:20.640
You can, but don't.

00:14:20.640 --> 00:14:27.380
And then also there's some places where list comprehensions and dictionary comprehensions are wonderful.

00:14:27.760 --> 00:14:32.920
And they're way more expressive, but you could use lambdas in those two cases.

00:14:32.920 --> 00:14:33.720
Yeah, absolutely.

00:14:33.720 --> 00:14:38.680
I think the trick with lambdas that make them so wonderful is like there's little places in your code.

00:14:38.680 --> 00:14:46.020
You're like, if I could just pass a behavior here, I don't want to go out of where I am and write a function and then like give it a name and then say the name here.

00:14:46.020 --> 00:14:53.820
I just want to go, yeah, sort by this reversed or, you know, grab this value out and transform it or something.

00:14:53.820 --> 00:14:56.960
And lambda functions are beautiful for that.

00:14:57.180 --> 00:14:58.980
They're not so beautiful for writing your whole program.

00:14:58.980 --> 00:15:07.760
Yeah, actually sort is one of those, one of those places where one of the parameters is you can pass in a key or how to find the key.

00:15:07.760 --> 00:15:13.340
And it's, I've used lambdas a lot there because I don't really need a named function.

00:15:13.340 --> 00:15:15.440
I just need a function to pass in and do the work.

00:15:15.440 --> 00:15:16.740
Yeah, I've got a list of customers.

00:15:16.740 --> 00:15:17.900
I want to sort by last name.

00:15:17.900 --> 00:15:20.720
So lambda, C goes to C dot, last name, done.

00:15:20.720 --> 00:15:21.320
Beautiful.

00:15:21.320 --> 00:15:22.520
Yeah, it's great.

00:15:22.520 --> 00:15:25.260
So you wanted to do a quick follow-up on Jopronto.

00:15:25.920 --> 00:15:28.280
That's our super, super fast web framework, right?

00:15:28.280 --> 00:15:28.880
Theoretically.

00:15:28.880 --> 00:15:29.060
Yep.

00:15:29.060 --> 00:15:31.820
Yeah, that's what we were talking about that last week.

00:15:31.820 --> 00:15:37.940
But I ran across a Reddit thread that we'll post in the show notes.

00:15:38.500 --> 00:15:47.400
And it is titled, sticking with Flask versus switching to one of the new faster frameworks.

00:15:47.400 --> 00:16:03.020
And the Jopronto author actually posted on this and said, yeah, if you're looking at Jopronto, please read the read me there because I've noted that it's not ready for production, basically.

00:16:03.680 --> 00:16:08.640
So there's, he's not even, he's something about, I'll just read it.

00:16:08.640 --> 00:16:14.960
He's, as stated in the read me, you should not build anything serious with Jopronto now because it's going to probably eat your laundry.

00:16:14.960 --> 00:16:18.620
Remember, it's hand coded in C and this needs a lot of testing.

00:16:18.620 --> 00:16:23.740
On top of that, I plan to do several iterations of API changes in a largely incompatible way.

00:16:24.300 --> 00:16:28.440
I hope, though, it's going to make a serious player in the field one day.

00:16:28.440 --> 00:16:30.880
I applaud the author for putting that out there.

00:16:30.880 --> 00:16:37.740
He's basically developing in the open, but he's not promising to stick with the same model or the same API.

00:16:37.740 --> 00:16:39.260
And I think that's completely fair.

00:16:39.260 --> 00:16:40.560
And he's pretty open about it.

00:16:40.560 --> 00:16:42.040
Yeah, that's really great of him.

00:16:42.040 --> 00:16:50.640
And it's, you know, he seriously is optimizing this stuff in some really interesting but out there ways.

00:16:50.840 --> 00:16:53.320
And so, and all that part is done in C, right?

00:16:53.320 --> 00:17:02.160
And so, it probably needs a little bit of careful validation before it becomes a thing that you really, you know, depend on for your e-commerce site or whatever.

00:17:02.160 --> 00:17:04.940
But it's definitely, it's got so much promise, that project.

00:17:04.940 --> 00:17:06.000
So, I hope he gets there.

00:17:06.000 --> 00:17:07.700
Oh, we're already done.

00:17:07.700 --> 00:17:08.740
So, there we go.

00:17:08.740 --> 00:17:09.380
That's it.

00:17:09.380 --> 00:17:11.460
That's the news we got for this week.

00:17:11.460 --> 00:17:14.120
Anything you want to share with everyone while we're wrapping things up, Brian?

00:17:14.120 --> 00:17:16.620
No, nothing, nothing right now.

00:17:16.620 --> 00:17:17.260
All right.

00:17:17.260 --> 00:17:17.600
Awesome.

00:17:17.600 --> 00:17:19.140
Well, how about you?

00:17:19.280 --> 00:17:20.540
I'm cranking out some classes.

00:17:20.540 --> 00:17:25.340
I just am pretty much finished up my Consuming Restful Services course.

00:17:25.340 --> 00:17:26.820
So, stay tight.

00:17:26.820 --> 00:17:27.680
You know, hang tight for that.

00:17:27.680 --> 00:17:30.100
It's going to be out in maybe a week or so.

00:17:30.100 --> 00:17:30.800
All right.

00:17:30.800 --> 00:17:31.280
Cool.

00:17:31.280 --> 00:17:31.880
Yeah.

00:17:31.880 --> 00:17:34.300
Fun to be building new things for everyone.

00:17:34.300 --> 00:17:34.780
All right.

00:17:34.780 --> 00:17:36.440
Well, thank you everyone for listening.

00:17:36.440 --> 00:17:38.440
Brian, thanks for chatting with me today.

00:17:38.440 --> 00:17:39.520
Thank you.

00:17:39.520 --> 00:17:39.860
Yep.

00:17:39.860 --> 00:17:40.540
See you all later.

00:17:41.840 --> 00:17:43.600
Thank you for listening to Python Bytes.

00:17:43.600 --> 00:17:46.160
Follow the show on Twitter via at Python Bytes.

00:17:46.160 --> 00:17:49.060
That's Python Bytes as in B-Y-T-E-S.

00:17:49.060 --> 00:17:52.500
And get the full show notes at pythonbytes.fm.

00:17:52.500 --> 00:17:56.820
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:17:56.820 --> 00:17:59.520
We're always on the lookout for sharing something cool.

00:17:59.520 --> 00:18:02.920
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:18:02.920 --> 00:18:06.540
Thank you for listening and sharing this podcast with your friends and colleagues.

