WEBVTT

00:00:00.040 --> 00:00:03.980
This is Python Bytes. Python headlines and news delivered directly to your earbuds.

00:00:03.980 --> 00:00:09.220
It's episode six, recorded Monday, December 12th. This episode is brought to you by Rollbar.

00:00:09.220 --> 00:00:13.100
They help take the pain out of errors. Thank you so much, Rollbar, for sponsoring the show.

00:00:13.100 --> 00:00:18.120
And this is Michael Kennedy, one of your hosts. I'm here with Brian Okken, my co-host. Hello,

00:00:18.120 --> 00:00:23.280
Brian. How's it going, man? Hello. It's going really good. Good, good. This year's gone by

00:00:23.280 --> 00:00:29.260
quickly, hasn't it? It's gone. It's super fast. Yeah, I feel like everyone was fixated on the

00:00:29.260 --> 00:00:34.280
election because it was so unique. And then kind of nobody knows what to do with the rest of the year.

00:00:34.280 --> 00:00:41.080
So I'm going to go on vacation. How about you? I'm going to start writing. So yeah, you got a book

00:00:41.080 --> 00:00:46.340
to finish, man. Anyway, so the point is, this is actually our last episode of the year. So I want

00:00:46.340 --> 00:00:51.660
to say thanks to everybody who subscribed and listened and shared this podcast with their friends.

00:00:51.660 --> 00:00:58.120
We're taking a break and we will be back first thing in January, first week. We'll have even more

00:00:58.520 --> 00:01:02.180
share, won't we? Yeah, that'll be the, I have like three weeks of stuff to catch up on.

00:01:02.180 --> 00:01:07.380
Yeah. Hopefully no drama. Okay. So what's the first item you want to share with everyone? What'd you

00:01:07.380 --> 00:01:12.860
find? Well, there's an article by Dan Bader, make your Python code more readable with custom

00:01:12.860 --> 00:01:19.420
exception classes. This is great. He wrote up a little tutorial along with a five minute video where

00:01:19.420 --> 00:01:25.080
he walks through stuff. He talks about the, including your own exception classes can make your errors

00:01:25.080 --> 00:01:32.000
more readable within your code and also communicate to the users of your functions or whatever your

00:01:32.000 --> 00:01:36.900
intent and what the errors are. And also you can add more context. I like it because it's one of those

00:01:36.900 --> 00:01:43.040
things that I was afraid to add custom exceptions and it's really just pretty darn easy. The main

00:01:43.040 --> 00:01:47.880
points I think is to remember to derive from either exception or one of the other built-in Python

00:01:47.880 --> 00:01:53.460
exceptions. Like value error or something like that, right? Yeah. Whatever sort of makes sense.

00:01:53.460 --> 00:01:59.640
And, and it's a, it's a good one. I also wanted to add that if you are, there's extra things you

00:01:59.640 --> 00:02:06.480
should do if you're releasing a package and, or even within, within your company, I think it's good to

00:02:06.480 --> 00:02:11.640
derive from your own, create a custom exception and then derive all your other exceptions from that one.

00:02:11.880 --> 00:02:17.360
And I got that tip from another article that we'll link to in the show notes by Julian Danju.

00:02:17.360 --> 00:02:22.620
Yeah. Yeah. Yeah. That's a really great point actually, because it would be great to do try,

00:02:22.620 --> 00:02:27.900
accept all of the errors from this package. Like whatever's happening in here, I want to start by

00:02:27.900 --> 00:02:34.280
handling those and maybe get more specific ones. Maybe not, but yeah, I hadn't really thought about

00:02:34.280 --> 00:02:41.240
that. The make your own special base exception. Even the reverse, try to do specific first and then,

00:02:41.240 --> 00:02:47.540
and then do a catch all of those. And then if it isn't one of your package ones, then you can also

00:02:47.540 --> 00:02:51.480
still catch the general exception and do something different there. Yeah, that's cool. There's two,

00:02:51.480 --> 00:02:56.100
there's a couple of things about this article. I like when Dan Bader is doing a bunch of cool videos

00:02:56.100 --> 00:03:01.100
on YouTube, he really seems to be putting a lot of effort to frequently get those out. And so here's an

00:03:01.100 --> 00:03:05.560
article that takes like five minutes to read, but there's also a five minute video screencast to go

00:03:05.560 --> 00:03:12.120
along with it. So well done on that, Dan. And then more generally, this idea here, it makes it easier

00:03:12.120 --> 00:03:18.040
for one of my favorite programming patterns, which is also quite Pythonic is in that it's, the pattern is

00:03:18.040 --> 00:03:24.360
it's easier to ask for forgiveness than permission, as opposed to like the C++ style, look before you leap

00:03:24.360 --> 00:03:28.800
programming model where you test the heck out of everything and then you try a thing. You just, here, you just do it.

00:03:28.860 --> 00:03:32.700
If there was an exception, you know, you catch it and then accept block and it's all good.

00:03:32.700 --> 00:03:39.360
Yeah. I definitely like a, at a high level, like for instance, if I were, as an example, if I were using

00:03:39.360 --> 00:03:46.460
requests, I could have a special handler that dealt with exceptions from requests and know that, that I,

00:03:46.460 --> 00:03:51.060
cause I understand what part of my system's dealing with that. I could handle it in one place.

00:03:51.860 --> 00:03:55.480
Right. Absolutely. Yeah. Could not contact server. The web service seems to be down.

00:03:55.480 --> 00:04:01.180
Something like this, right? Beautiful. Wouldn't it be awesome if like artificial intelligence could just

00:04:01.180 --> 00:04:08.440
like sit there and just like help you code? I mean, we all know of AI for like Siri and silly things like

00:04:08.440 --> 00:04:14.440
that. But I feel like actually 2016 is a little bit where the future kind of intersected with now.

00:04:14.520 --> 00:04:19.080
Like things became the future came to us. There are so many things with AI that are really awesome.

00:04:19.080 --> 00:04:25.240
Like there was several AIs that actually on their own invented encryption. But what I want is an AI to

00:04:25.240 --> 00:04:30.760
help me as a developer. How about you? Sounds great. Yeah. That'd be super cool. So, so I actually ran

00:04:30.760 --> 00:04:35.880
across this thing. one of the listeners, Gilberto Diaz was nice enough to send me a link and,

00:04:35.880 --> 00:04:40.640
an email say, Hey, there's this thing that is so cool. You must check it out. It's not technically

00:04:40.640 --> 00:04:46.200
built in Python, but it really supports Python developers in a crazy good way. So there's this

00:04:46.200 --> 00:04:51.400
thing called kite at kite.com and it's in private beta. We were lucky enough to get some early access

00:04:51.400 --> 00:04:56.400
to it. And what it is, is like you install it in your OS and it sits in kind of like a sidebar.

00:04:56.400 --> 00:05:00.240
It takes up maybe like, I don't know, a fifth of your screen. If you have two screens and, you know,

00:05:00.240 --> 00:05:06.000
stick it on the other one and it watches what you do in all sorts of different programming

00:05:06.000 --> 00:05:12.320
environments in sublime text and Visual Studio Code in PyCharm, even Vim or Emacs has many,

00:05:12.320 --> 00:05:20.000
many plugins. As you type, it helps you. All right. So, if you're writing Python code and you type

00:05:20.000 --> 00:05:25.700
import space, it'll show you a list of the most popular packages. If you type R, it'll show you the

00:05:25.700 --> 00:05:30.160
list of the most popular packages that start with R like request right at the top. Yeah. And then once

00:05:30.160 --> 00:05:34.000
you import a thing, it'll start showing you documentation about it. Here's some examples

00:05:34.000 --> 00:05:37.840
on how to use that thing you just imported as you start to like, you know, interact with it,

00:05:37.840 --> 00:05:41.840
like request dot, it'll say, well, the most commonly called function here is get, you want to see some

00:05:41.840 --> 00:05:48.400
examples, how to use request dot get or like the documentation. And it just, it just really is quite

00:05:48.400 --> 00:05:55.040
cool how much it knows. And you know, it does auto completion. Like many editors do it'll, it'll like

00:05:55.040 --> 00:05:59.120
show you on the left, like, here's the things you can complete. But what I like about it is it uses like

00:05:59.120 --> 00:06:06.000
crowdsourcing for popularity. So there's like, you know, 10,000, developers working on this.

00:06:06.000 --> 00:06:10.240
And they'll say, well, this is the most popular completion in this situation here.

00:06:10.240 --> 00:06:14.720
Base, not just alphabetical or something. So I think it's cool. There's, there's a great video

00:06:14.720 --> 00:06:18.000
you have to watch. If you go check this out at kite.com, it's like right there in the homepage.

00:06:18.000 --> 00:06:24.640
I'm, I'm looking forward to playing with it. Yeah. You, you'd mentioned it seems like AI pair programming

00:06:24.640 --> 00:06:29.680
and, does sure sound like that. It's, it's quite interesting. I feel like it's more like a

00:06:29.680 --> 00:06:34.400
artificial intelligence mentor rather than paired programmer. Like it's there going, oh, by the way,

00:06:34.400 --> 00:06:38.160
did you know that the, you actually can call this function? Oh, that package is really cool. Cause

00:06:38.160 --> 00:06:43.200
it has this thing you might not know about. It's kind of like the wiser, wiser version rather than like,

00:06:43.200 --> 00:06:45.360
you know, pair programmer, but I think it's great.

00:06:45.360 --> 00:06:47.000
Oh, definitely looking forward to trying that.

00:06:47.200 --> 00:06:50.400
Yeah, for sure. I hate it when my data gets messy.

00:06:50.400 --> 00:06:56.280
Yeah, definitely. so there, there's an article, by, I'm going to even try this

00:06:56.280 --> 00:07:02.880
Jean Nicholas hold, I think tidy data in Python. This article was pretty interesting. It caught my

00:07:02.880 --> 00:07:08.720
attention because I often have data that's in a format that I can't use right away and I need to

00:07:08.720 --> 00:07:14.480
transform it into something else. And I didn't ever think of it like, changing tables around and,

00:07:14.480 --> 00:07:20.080
and completely changing things automatically. Anyway, this article gives some, some attributes

00:07:20.080 --> 00:07:27.440
of what problems to look at in data sets. He based it on a paper named tidy data by Hadley Wickham.

00:07:27.440 --> 00:07:35.120
He takes the idea of the paper and then transfers it to, into Python and how to, how to utilize it

00:07:35.120 --> 00:07:42.320
in Python with the pandas library. And like, so this seems very abstract right now, but he has some

00:07:42.320 --> 00:07:48.560
examples of, data that's, that's really data is in the column headers. He has some attributes to

00:07:48.560 --> 00:07:55.840
look for, like each variable forms a column and contains a value and each observation forms a row

00:07:55.840 --> 00:08:03.680
and the type of observation units form a table. And it still sounds kind of complex or kind of abstract,

00:08:03.680 --> 00:08:10.240
but the examples really are pretty easy to follow. And I, it's just a neat idea of, of taking a look at

00:08:10.240 --> 00:08:14.720
your data and making it more useful. I had never really thought about data in this sense,

00:08:14.720 --> 00:08:19.360
but it seems to me like this talks about how you put your data together so that you'll be,

00:08:19.360 --> 00:08:26.400
it's most natural to take advantage of it with things like pandas and the various data science tools

00:08:26.400 --> 00:08:30.480
and all sorts of languages, but he's focused on Python, which is extra cool.

00:08:30.480 --> 00:08:36.720
And so he's, he has several examples on, on, you know, do things this way, not that way. And your life will be

00:08:36.720 --> 00:08:39.840
much easier. And I just never thought of systemizing that, I guess.

00:08:39.840 --> 00:08:45.440
Yeah. And I also, looking at the different comparison of before and after tables, you can

00:08:45.440 --> 00:08:52.480
definitely see how it's definitely the converted table is easier programmatically, but the from table,

00:08:52.480 --> 00:09:00.000
the, the dirty one is, it's, it's more broken up, like how people look at stuff. I didn't think there

00:09:00.000 --> 00:09:06.320
would be a difference, but it does appear to be, it's, it's easier for, to visualize smaller tables

00:09:06.320 --> 00:09:10.240
as people, but, as computers, we need things a little bit more broken down.

00:09:10.240 --> 00:09:13.920
Yeah, it's cool. So if you've got a lot of data, especially in tabular form, check that out.

00:09:13.920 --> 00:09:19.680
We're going on break. Like I'm actually heading out on vacation somewhere away from home and,

00:09:19.680 --> 00:09:23.920
you know, I'm still taking my laptop with me because that would be kind of insane. But you know,

00:09:23.920 --> 00:09:29.040
our sponsor roll bar, they, they were going to let me just chill out and not worry about whether the

00:09:29.040 --> 00:09:33.200
web app is working and not check it all the time. Like I might not use my computer for a few days.

00:09:33.200 --> 00:09:38.800
And unless I get notifications on my phone or, you know, text messages or slack or something like

00:09:38.800 --> 00:09:42.400
that saying, Hey, your website's down. There's this problem. You know, things are going to be good.

00:09:42.400 --> 00:09:45.760
I'm not going to worry about it. That's because I got roll bar integrated with all the talk Python

00:09:45.760 --> 00:09:50.240
stuff, which is really cool. So if there's a problem, you know, I can just read what the error is and

00:09:50.240 --> 00:09:53.840
probably fix it pretty easily. So all the Python byte listeners, they can have the

00:09:53.840 --> 00:09:57.520
same peace of mind. They just have to go to rollbar.com/pythonbytes and sign up for the

00:09:57.520 --> 00:10:02.000
free tier. Sounds cool, huh? Sounds very good. Yeah. Yeah. It's good. It's good to be on vacation

00:10:02.000 --> 00:10:06.880
and you know, not worry about things working. Just set up the error notifications and you're all good.

00:10:06.880 --> 00:10:13.440
I'm really excited that there's a new version of Python. I'm, I think people are starting to move

00:10:13.440 --> 00:10:18.240
on from legacy Python and there's just end of this week, there's going to be one more reason to do so.

00:10:18.240 --> 00:10:23.760
So we actually have as our next item, a video, a conference presentation at PyCon Canada

00:10:23.760 --> 00:10:32.000
2016 by Brett Cannon. He did a talk called what's new in Python three. And I think it's interesting.

00:10:32.000 --> 00:10:35.440
You look at all the peps and all the stuff that's coming and you think, well, okay,

00:10:35.440 --> 00:10:39.360
they're doing little tweaks here. I guess it has new string formatting and whatever. It turns out

00:10:39.360 --> 00:10:45.520
there are over 16 peps in Python three, six, and that's more than any peps that have been in Python

00:10:45.520 --> 00:10:50.160
three other than the actual creation of Python 3.0 itself. That's pretty cool, right?

00:10:50.160 --> 00:10:56.080
Maybe we should have had another role before now then maybe, but I'm excited for all these.

00:10:56.080 --> 00:11:00.080
Yeah, it's going to be great. It's going to be great. The reason I like this video and I want to

00:11:00.080 --> 00:11:05.360
point it out is we could all go to, you know, what's new in Python three and we can read the list. Like,

00:11:05.360 --> 00:11:11.120
okay, well here dictionaries will be ordered. there's now a private identifier or like a versioning

00:11:11.120 --> 00:11:15.760
number on dictionaries. Like, okay, whatever, who cares? This gives you the story behind all the

00:11:15.760 --> 00:11:20.640
changes coming to Python three, six, right? Why did the core developers of which Brett is one

00:11:20.640 --> 00:11:26.320
think that this is a good idea? Like, how does it help? What, what really problem, what problem are

00:11:26.320 --> 00:11:32.080
they really trying to solve deep down when they made this change? And it really is a cool look inside

00:11:32.080 --> 00:11:35.680
what's coming with Python three, six. that sounds great.

00:11:35.680 --> 00:11:40.160
I think it's, it's good. So Python three, six release candidates available right now if you want to

00:11:40.160 --> 00:11:44.640
download it, but you know, if you can wait like five days, you should have the final version of

00:11:44.640 --> 00:11:47.120
Python three, six. They did something with virtual environments, right?

00:11:47.120 --> 00:11:53.120
Yeah. This is one of the things I was stumbled across. I think it was in a Reddit line somewhere,

00:11:53.120 --> 00:12:00.080
the command command line command of pyvenv, which I can't remember which version that came in on one of

00:12:00.080 --> 00:12:07.440
the three O's that's being deprecated. And the reason, and they want people to use the dash M V E N V

00:12:07.440 --> 00:12:15.520
instead. And that's so that you specifically tell the virtual environment system, which Python to use.

00:12:15.520 --> 00:12:21.760
And it makes the programmer know, need to know how to get to Python first before they create a virtual

00:12:21.760 --> 00:12:26.480
environment. I think that it totally makes sense. It's just something to point out. I think it's

00:12:26.480 --> 00:12:31.760
important. It I'm going to have to actually edit my book because of this, because, I think I, I

00:12:31.760 --> 00:12:39.120
recommended pyvenv in mine. So time to un-recommend it. Yeah. that's cool. No, I do think it is good.

00:12:39.120 --> 00:12:44.240
I mean, you can say Python three --version, you'll see what that is. And then you can say Python

00:12:44.240 --> 00:12:48.160
three dash M V and V, and then that's the thing you're going to get. Right. So it is a little more

00:12:48.160 --> 00:12:53.520
clear, I guess. Very cool. Yeah. It wouldn't be a week in Python without some form of testing or code

00:12:53.520 --> 00:12:59.520
coverage, right? Yeah, definitely. And, Ned Batchelder, who we all owe some gratitude for,

00:12:59.520 --> 00:13:05.920
for coming up with, or for taking over the coverage package. He's, I interviewed him

00:13:05.920 --> 00:13:11.680
about that on episode 12 of testing code, but, he's planning a new feature for coverage up high,

00:13:11.680 --> 00:13:18.960
um, which will tell us which, so when you, when you run a coverage report, also what functions cause

00:13:18.960 --> 00:13:24.960
this, or, or how did you get this stuff covered? And, he covers it in an article. He taught,

00:13:24.960 --> 00:13:31.360
he titled, who tests what this is a discussion about kind of, how I like the discussion because

00:13:31.360 --> 00:13:37.440
those, those people new to coverage can kind of peek inside and see the different stages of how

00:13:37.440 --> 00:13:42.000
coverage works. It goes through measurement and storing the data and then combining the data

00:13:42.000 --> 00:13:47.600
and reporting because you can't have multiple tests, most multiple runs and combine them into

00:13:47.600 --> 00:13:53.360
it to one report. This idea of, trying to figure out which code was covered by which tests

00:13:53.360 --> 00:14:00.480
is how it started, but he comes up with some, some reasons why there may be more, more uses than just

00:14:00.480 --> 00:14:06.960
in testing. And it's a, it's a good discussion, but part of one of the things he, why he wrote this

00:14:06.960 --> 00:14:11.680
article is, is to try to get some help. He wants some feedback. So some of the questions are,

00:14:11.680 --> 00:14:17.200
um, he discusses the memory, memory usage and, and the data model. And he wants to know if there's

00:14:17.200 --> 00:14:23.360
something we need more sophisticated problem solving on this, or should we be more conservative with

00:14:23.360 --> 00:14:29.040
memory? And then the output, the output right now is intended to be in Jason, but he wants to know if

00:14:29.040 --> 00:14:33.840
somebody could use a different data format. I like the direction he's going with it. And I think

00:14:33.840 --> 00:14:39.680
I'll use it and I encourage anybody that has sort of a non-standard usage of coverage to take a look

00:14:39.680 --> 00:14:44.880
at this article and give Ned some feedback. Yeah. I really like it as well, because a lot of times,

00:14:44.880 --> 00:14:50.400
unless you're actually a contributor to the project already, you feel like the fate of the thing is

00:14:50.400 --> 00:14:55.200
already determined, but this was much more like, look, we have this challenging problem. these are the

00:14:55.200 --> 00:14:59.120
ways and the trade-offs were thinking about the ways we're thinking about solving it. The trade-offs were

00:14:59.120 --> 00:15:03.760
contemplating. We're not sure where to go. If you want to help, here's how to help. If you want to

00:15:03.760 --> 00:15:08.800
give us feedback before we jump in and go the wrong direction, do it. So this is a really cool article

00:15:08.800 --> 00:15:13.760
just on philosophy as well. Yeah. I think it's great. And being able to know which tests actually

00:15:13.760 --> 00:15:18.880
triggered the covered line when you run a thousand tests with these three, like that's pretty interesting.

00:15:18.880 --> 00:15:23.280
Yeah. And you know, before I talked to him, I didn't realize that there was, there were so many

00:15:23.280 --> 00:15:27.520
features of coverage that I didn't realize, like being able to have multiple test runs and combine

00:15:27.520 --> 00:15:33.120
that data and HTML output and things like that. It's pretty cool. Yeah. Yeah. Quite cool. Quite cool.

00:15:33.120 --> 00:15:39.040
So what do you got for us, Michael? All right. I've got one, one final glorious topic for the rest of the

00:15:39.040 --> 00:15:46.640
year to round out 2016. So here it is, threaded asynchronous magic and how to wield it. So this is a

00:15:46.640 --> 00:15:52.400
really cool article by Christian Medina. You know, we had talked about the, I don't remember exactly

00:15:52.400 --> 00:15:59.120
the title, but that asyncio tutorial, that was like the G event tutorial remade for asyncio and Python

00:15:59.120 --> 00:16:02.720
three, four. And we're like, well, wouldn't it be cool if there's a great one on async and await,

00:16:02.720 --> 00:16:09.680
like the really, the truly new cool features of Python for threading and parallelism. Well, Christian

00:16:09.680 --> 00:16:16.080
Medina wrote it. Awesome. He wrote a really nice one and it has a bunch of bite-sized examples. You can,

00:16:16.080 --> 00:16:20.640
you know, they're not too, they're not too large, but they don't seem entirely fake.

00:16:20.640 --> 00:16:26.240
So he has one example of like sending email notifications, sort of asynchronously, but it's

00:16:26.240 --> 00:16:31.760
like, you know, but you realize there's no awaitable asynchronous, like way to send mail in Python. So,

00:16:31.760 --> 00:16:36.320
well, we're just going to block, but at least we can use this asyncio loop for that. That's cool.

00:16:36.320 --> 00:16:44.560
And then also talked about the aiohttp library, which is an HTTP client server for asyncio and how to do a

00:16:44.560 --> 00:16:50.000
bunch of parallel web requests. So we often think about requests being the primary way that we do

00:16:50.000 --> 00:16:56.800
programming against web services and generally HTTP. But this is another option that's really simple,

00:16:56.800 --> 00:17:03.120
that fits exactly into the asyncio. So you can easily block on the network calls, which will then free

00:17:03.120 --> 00:17:06.800
up the thread to go do other stuff because it knows it's waiting on the network. That sounds cool.

00:17:06.800 --> 00:17:12.320
Yeah, it's really cool. It covers things like tasks, scheduling tasks, scatter, gather styles of

00:17:12.320 --> 00:17:17.680
programming, and then even moving the asyncio loop to a background thread. So you don't block up your

00:17:17.680 --> 00:17:22.080
main thread, but you kind of have a place to put all the asynchronous work and let it run on that other

00:17:22.080 --> 00:17:27.120
one thread, which is pretty cool. So yeah. So thanks, Christian, for doing that. Got to meet him at

00:17:27.120 --> 00:17:34.560
PyCon last year. And so that was fun. And hopefully everyone else is going to PyCon. If you don't have your tickets yet,

00:17:34.560 --> 00:17:38.640
you need to be getting it, right, Brian? Definitely. I missed out last year. So.

00:17:38.640 --> 00:17:43.920
Don't be sad. Get tickets before they sell out because this, I'm sure it will sell out. It sold

00:17:43.920 --> 00:17:48.800
out early last year. Plus it's in Portland and Portland rocks. Portland definitely rocks. It's

00:17:48.800 --> 00:17:54.560
going to be weird. They're going to be keeping it weird. All right. Well, that's it for me. I don't

00:17:54.560 --> 00:17:57.920
really have a whole lot of news to share other than just saying thanks to everyone for listening,

00:17:57.920 --> 00:18:03.040
you know, for our new podcast. It's been fun to do for you and I appreciate all the feedback.

00:18:03.040 --> 00:18:08.480
I appreciate it too. Speaking of feedback, we did get one person. I think it's Harry J.

00:18:08.480 --> 00:18:14.560
I hope I didn't pronounce that wrong. On Twitter said that he listened to episode three and I had

00:18:14.560 --> 00:18:20.480
mentioned that a library called Pianini that don't know if I'm pronouncing that right, but I assumed that

00:18:20.480 --> 00:18:26.240
these were that maybe it was named after the knights who say knee. We thought that would be fun anyway.

00:18:26.240 --> 00:18:34.240
Yeah, yeah, definitely. But Harry J. tells me that this is not true. It's named after a Sanskrit grammarian

00:18:34.240 --> 00:18:40.880
with a P-A. I don't know how to pronounce that either. It's P-A-N-I-N-I. Anyway, thanks. I like fact checking.

00:18:40.880 --> 00:18:44.800
Yeah, it's great to have fact checkers. Awesome. I'm still going to call it Pianini.

00:18:44.800 --> 00:18:48.080
Knee, knee, knee. Yeah, definitely.

00:18:48.080 --> 00:18:54.560
Just know it has a different origin. Okay. Well, thank you, Brian. Thank you everyone for listening.

00:18:54.560 --> 00:18:58.480
Thank you, Rural Bar for sponsoring the show. We will see you all in January. Until then,

00:18:58.480 --> 00:19:03.280
you know, enjoy the winter wonderland. Unless you're down in Australia, then have a nice summer.

00:19:03.280 --> 00:19:06.800
Yeah, definitely. See you next year. Yeah. See you next year. Bye everyone. Bye.

00:19:06.800 --> 00:19:12.720
Thank you for listening to Python Bytes. Follow the show on Twitter via @pythonbytes. That's

00:19:12.720 --> 00:19:19.840
Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news item

00:19:19.840 --> 00:19:24.480
you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout for

00:19:24.480 --> 00:19:29.520
sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy.

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

