Bonus: Python Bytes Crossover: Python 3.6 is going to be awesome, Kite: your friendly co-developing AI
Full show notes here.
Episode Deep Dive
Guest introduction and background
Brian Okken co-hosts the Python Bytes podcast and is deeply involved in the Python testing community. He’s the author of Python Testing with pytest and shares a passion for making Python concepts more accessible to developers. Brian brings a testing-oriented perspective to the latest news and tools in the Python ecosystem.
What to Know If You're New to Python
- Python 3.6 introduced significant changes (including deprecations and new features). A basic grasp of Python versions and the standard library helps you understand these transitions.
- Familiarity with the idea of “virtual environments” makes it easier to follow the discussion on why
pyvenv
was deprecated in favor ofpython -m venv
. - Asynchronous programming references (like
asyncio
) may sound advanced, but they’re a key part of modern Python, knowing they exist is enough for now. - Tools like
coverage.py
and articles on “tidy data” in Python highlight how testing and data processing are core concerns for Pythonistas at all skill levels.
Key points and takeaways
- Python 3.6’s Exciting Release
Python 3.6 packs in more PEPs than any version of Python 3 aside from the initial 3.0 release. Even seemingly small changes (like dictionary behavior or
f-string
style formatting, though only briefly alluded to here) mark a significant leap forward for the language. If you have been debating a move away from older Python versions, Python 3.6’s enhancements are a compelling reason to upgrade. Brett Cannon’s PyCon Canada talk further underscores why so many developers are excited about this release.- Links and tools:
- Kite: Your AI Code Companion
Kite is an AI-driven code assistant that plugs into various editors, analyzing context and offering code completions and examples. It leverages crowd-sourced popularity data (e.g., recommending
requests.get()
first if that’s the most common call). This kind of “pair programming with AI” can streamline coding, provide real-time docs, and help developers discover more of a library’s features.- Links and tools:
- Custom Exceptions by Dan Bader
An article and accompanying five-minute video from Dan Bader highlight how creating well-structured custom exceptions simplifies error handling and clarifies your code’s intent. Instead of reusing built-in exceptions such as
ValueError
, you can define exceptions likeMyPackageError
for all errors in your library, enabling precise handling. This approach fosters cleaner code and clearer communication for anyone who uses or reviews your work.- Links and tools:
- “Make your Python code more readable with custom exception classes” by Dan Bader (search title online)
- Links and tools:
- Tidy Data in Python
Inspired by Hadley Wickham’s Tidy Data principles, John Nicholas Hol’s “Tidy Data in Python” article demonstrates how to restructure messy datasets into a clean format for more effective analysis. The approach focuses on aligning each variable as a column and each observation as a row. Organizing data in this “tidy” structure is especially beneficial when working with pandas and other data science libraries.
- Links and tools:
- “Tidy Data in Python” by John Nicholas Hol (search title online)
- Hadley Wickham’s Tidy Data paper
- Links and tools:
- Coverage.py Enhancements (“Who Tests What?”)
Ned Batchelder, maintainer of
coverage.py
, seeks community feedback on a new feature revealing which tests covered which parts of the code. This granular insight can help teams optimize and reorganize their test suites. It also highlights the memory trade-offs in tracking detailed coverage data and the importance of thoughtful data formats (e.g., JSON).- Links and tools:
pyvenv
Deprecation andpython -m venv
Python 3.6 deprecates thepyvenv
command, directing developers to usepython -m venv
instead. The shift encourages explicit selection of your desired Python version or interpreter for virtual environments, clarifying environment creation. This change is part of Python’s broader move toward more consistent packaging and environment tooling.- Links and tools:
- Threaded Asynchronous Magic (Article by Cristian Medina)
Cristian Medina’s piece demystifies
async
andawait
in Python, showing how to handle network I/O efficiently with libraries likeaiohttp
. The article also covers advanced usage, such as scheduling tasks and running async loops on background threads. Even for developers new to concurrency, these code examples illustrate Python’s powerful async landscape.- Links and tools:
- “Threaded asynchronous magic and how to wield it” by Cristian Medina (search title online)
- AIOHTTP documentation
- Links and tools:
- Python Bytes Podcast Format
Python Bytes is a short, weekly headline-oriented podcast co-hosted by Michael and Brian. Rather than in-depth interviews, it delivers a quick roundup of timely Python stories, tools, and ideas. This format offers a brisk, newsy approach that complements longer interview shows like Talk Python To Me.
- Links and tools:
- Community Feedback and Corrections The show briefly addresses a listener’s correction on library naming, “Pianini” is named after a Sanskrit grammarian, not the Monty Python reference. This underscores the podcast’s commitment to community involvement and accuracy. Listeners are always invited to send corrections, new topics, and feedback.
- Year-End Break and Looking Forward This episode arrives as a year-end bonus. Michael and Brian thank the community for support, invite everyone to subscribe to Python Bytes, and share the plan to return with more episodes after a brief holiday hiatus. They also highlight the upcoming PyCon in Portland, encouraging folks to grab tickets early and keep an eye out for more Python news in the new year.
Interesting quotes and stories
“I've had so much fun that I decided to start a second podcast.” – Michael, on launching Python Bytes
“I was afraid to add custom exceptions, and it's really pretty darn easy.” – Brian, on Dan Bader’s article
“Wouldn't it be awesome if artificial intelligence could just sit there and help you code?” – Michael, introducing Kite
Key definitions and terms
- Custom Exceptions: User-defined classes that extend Python’s built-in exception hierarchy to represent domain-specific errors.
- Tidy Data: A data format where each variable is a column, each observation is a row, and each type of observation is a table.
- Coverage.py: A tool measuring which lines of Python code are executed, often used in conjunction with automated tests.
python -m venv
: The recommended way to create a new virtual environment in modern Python versions.- Asynchronous /
asyncio
: A Python concurrency framework allowing tasks to pause and resume around network or I/O waits without blocking.
Learning resources
- Python for Absolute Beginners: A comprehensive, hands-on course that covers all the fundamentals of Python in a way that new developers will find intuitive and engaging.
- Getting started with pytest: Perfect if you want to follow Brian Okken’s testing passion and learn how to write effective tests in Python.
- Async Techniques and Examples in Python: Dive into Python’s concurrency, covering threads, asyncio, and multiprocessing.
- Python 3.11: A Guided Tour Through Code: While the episode features Python 3.6 excitement, you can keep going with the latest Python 3.11 changes in this guided tour.
Overall takeaway
This crossover episode offers a fast-paced tour of Python’s evolving ecosystem and culture, showcasing both new language features (Python 3.6) and innovative tools (Kite, tidy-data approaches, improved coverage tooling). Listeners are reminded that Python is steadily improving while keeping user-focused principles, community-driven feedback, and practical tooling at its core. From custom exceptions that clarify your code to advanced async techniques that scale it, the many developments here show that Python remains on the cutting edge, welcoming both newcomers and seasoned pros alike.
Episode Transcript
Collapse transcript
00:00 Hey everyone, Michael here. It's just about time to close out 2016, isn't it? Well, I have a few
00:06 comments and a bonus episode for you. So first of all, thank you so much for listening to Talk
00:11 Python, helping make it a success. It really means a lot to me and I love all the listeners. I love
00:17 the community around it and just want to say thanks for taking the time and subscribing and
00:22 listening. I've had so much fun that I decided to start a second podcast. You may have heard of it.
00:26 It's called Python Bytes and I launched this podcast with Brian Okken. The whole idea behind
00:31 it is that we're going to bring Python headlines and news and kind of just new cool items to your
00:37 earbuds, right? So every week we'll try to cover some timely news and maybe just something cool that
00:42 we found. It's much shorter. It's not really an interview format or long form format as I think
00:46 of Talk Python. So I've decided to post this single episode of Python Bytes to the Talk Python listeners
00:53 so everyone gets a chance to check it out. I know many of you have extra time around New Year's.
00:57 So here's one more episode for you to listen to while you're driving to and from relative's house.
01:03 If you like what you hear, just visit pythonbytes.fm and subscribe to get episodes like this weekly.
01:08 So I want to wish you all a happy holiday season and happy New Year. And I'll be back on Talk
01:14 Python in a few days with Software Carpentry and the Sciences with Jonah from software-carpentry.org.
01:21 Until then, enjoy this episode with Brian and myself and have a great break.
01:25 This is Python Bytes. Python headlines and news delivered directly to your earbuds. It's episode 6,
01:32 recorded Monday, December 12th. This episode is brought to you by Rollbar. They help take the pain
01:37 out of errors. Thank you so much, Rollbar, for sponsoring the show. And this is Michael Kennedy,
01:41 one of your hosts. I'm here with Brian Okken, my co-host. Hello, Brian. How's it going, man?
01:45 Hello. It's going really good.
01:47 Good, good. This year's gone by quickly, hasn't it?
01:50 It's gone. It's super fast.
01:52 Yeah. I feel like everyone was fixated on the election because it was so unique. And then
01:58 kind of nobody knows what to do with the rest of the year. So I'm going to go on vacation. How about
02:03 you?
02:03 I'm going to start writing. So yeah, you got a book to finish, man. Anyway, so the point is,
02:10 this is actually our last episode of the year. So I want to say thanks to everybody who subscribed and
02:15 listened and shared this podcast with their friends. We're taking a break and we will be back first
02:22 thing in January, first week. We'll have even more news to share, won't we?
02:26 Yeah. That'll be, I have like three weeks of stuff to catch up on.
02:29 Yeah. Hopefully no drama. Okay. So what's the first item you want to share with everyone? What
02:34 do you find?
02:34 Well, there's an article by Dan Bader, make your Python code more readable with custom exception
02:40 classes. This is great. He wrote up a little tutorial along with a five minute video where he
02:46 walks through stuff. He talks about the, including your own exception classes can make your errors
02:51 more readable within your code and also communicate to the users of your functions or whatever your
02:58 intent and what the errors are. And also you can add more context. I like it because it's one of
03:03 those things that I was afraid to add custom exceptions and it's really just pretty darn easy.
03:08 The main points I think is to remember to derive from either exception or one of the other built-in
03:14 Python exceptions.
03:15 Like value error or something like that, right?
03:17 Yeah. Whatever sort of makes sense. And, and it's a, it's a good one. I also wanted to add that if you
03:25 are, there's extra things you should do if you're releasing a package and, or even within, within your
03:31 company, I think it's good to derive from your own, create a custom exception and then derive all your
03:37 other exceptions from that one. And I got that tip from another article that we'll link to in the show
03:42 notes by Julian Danju.
03:44 Yeah. Yeah. Yeah. Yeah. That's a really great point actually, because it would be great to do try
03:49 except all of the errors from this package. Like whatever's happening in here, I want to start by
03:54 handling those and maybe get more specific ones. Maybe not, but yeah, I hadn't really thought about
04:01 that. The make your own special base exception.
04:04 even the reverse try to do specific first and then, and then do a catch all of those. And then
04:10 if it isn't one of your package ones, then you can also still catch the general exception and do
04:16 something different there.
04:17 Yeah. That's cool. There's two, there's a couple of things about this article. I like
04:20 when Dan Bader is doing a bunch of cool videos on YouTube, he really seems to be putting a lot of
04:25 effort to frequently get those out. And so here's an article that takes like five minutes to read,
04:29 but there's also a five minute video screencast to go along with it. So well done on that, Dan.
04:34 And then more generally, this idea here, it makes it easier for one of my favorite programming
04:40 patterns, which is also quite Pythonic is in that it's the pattern is it's easier to ask for
04:45 forgiveness than permission, as opposed to like the C++ style. Look before you leap programming
04:51 model where you test the heck out of everything that you try thing. You just here, you just do it.
04:55 If there was an exception, you know, you catch it and then accept block and it's all good.
05:00 Yeah. I definitely like a, at a high level, like for instance, if I were, as an example,
05:05 if I were using requests, I could have a special handler that dealt with exceptions from requests
05:11 and know that, that I, cause I understand what part of my system's dealing with that. I could
05:16 handle it in one place. right. Absolutely. Yeah. Could not contact server. The web service
05:21 seems to be down something like this, right? Beautiful. Wouldn't it be awesome if like artificial
05:26 intelligence could just like sit there and just like help you code? I mean, we all know of AI for
05:33 like Siri and silly things like that, but I feel like actually 2016 is a little bit where the future
05:39 kind of intersected with now it like things became the future came to us. There are so many things
05:44 with AI that are really awesome. Like there was several AIs that actually on their own invented
05:49 encryption. But what I want is an AI to help me as a developer. How about you? Sounds great. Yeah.
05:55 That'd be super cool. So, so I actually ran across this thing. one of the listeners,
05:59 Gilberto Diaz was nice enough to send me a link and, an email and say, Hey, there's this thing
06:04 that is so cool. You must check it out. It's not technically built in Python, but it really supports
06:10 Python developers in a crazy good way. So there's this thing called kite at kite.com and it's in
06:15 private beta. We were lucky enough to get some early access to it. And what it is, is like you install
06:20 it in your OS and it sits in kind of like a sidebar and it takes up maybe like, I don't know, a fifth of
06:25 your screen. If you have two screens and you know, stick it on the other one and it watches what you do
06:30 in all sorts of different programming environments in sublime text and Visual Studio Code in pycharm,
06:36 even Vim or Emacs has many, many plugins. As you type, it helps you. All right. So, if you're
06:45 writing Python code and you type import space, it'll show you a list of the most popular packages. If you
06:51 type R, it'll show you the list of the most popular packages that start with R like request right at the
06:55 top. Yeah. And then once you import a thing, it'll start showing you documentation about it. Here's
07:00 some examples on how to use that thing you just imported. As you start to like, you know, interact
07:04 with it, like request dot, it'll say, well, the most commonly called function here is get, you want to
07:08 see some examples, how to use request dot get or like the documentation. And it just, it just really
07:14 is quite cool how much it knows. And you know, it does auto completion. Like many editors do it'll,
07:21 it'll like show you on the left, like, here's the things you can complete. But what I like about it is
07:25 it uses like crowdsourcing for popularity. So there's like, you know, 10,000, developers
07:32 working on this and they'll say, well, this is the most popular completion in this situation here.
07:37 Base, not just alphabetical or something. So I think it's cool. There's, there's a great video.
07:41 You have to watch if you go check this out at kite.com. It's like right there in the homepage.
07:45 I'm, I'm looking forward to playing with it. Yeah. You, you'd mentioned it seems like AI pair
07:50 programming and, does sure sound like that. It's, it's quite interesting. I feel like it's
07:55 more like an artificial intelligence mentor rather than paired programmer. Like it's going,
08:00 Oh, by the way, did you know that the, you actually can call this function? Oh,
08:03 that package is really cool. Cause it has this thing you might not know about. It's kind of like
08:07 the wiser, wiser version rather than like, you know, pair programmer, but I think it's great.
08:12 Oh, definitely looking forward to trying that. Yeah, for sure.
08:14 I hate it when my data gets messy. Yeah, definitely. so there, there's an article,
08:20 by, I'm going to even try this John Nicholas hold, I think tidy data in Python. This article
08:28 was pretty interesting. It caught my attention because I often have data that's in a format that
08:33 I can't use right away and I need to transform it into something else. And I didn't ever think of it
08:39 like, changing tables around and, and completely changing things automatically. Anyway,
08:44 this article gives some, some attributes of what problems to look at and data sets. He based it on
08:50 a paper named tidy data by Hadley Wickham. He takes the idea of the paper and then transfers it to,
08:59 into Python and how to, how to utilize it in Python with the pandas library. And like, so this seems
09:06 very abstract right now, but he has some examples of, data that's, that's really data is in the,
09:12 the column headers. He has some attributes to look for, like each variable forms a column and contains a
09:19 value and each observation forms a row and the type of observation units form a table. And it still sounds
09:28 kind of complex or kind of abstract, but the examples really are pretty easy to follow. And I, it's just a,
09:34 a neat idea of, of taking a look at your data and making it more useful.
09:38 I had never really thought about data in this sense, but it seems to me like this talks about how you put
09:44 your data together so that you'll be, it's most natural to take advantage of it with things like
09:49 pandas and the various, data science tools and all sorts of languages, but he's focused on Python,
09:56 which is extra cool. And so he's, he has several examples on, on, you know, do things this way,
10:01 not that way. And your life will be much easier. And I just never thought of systemizing that, I guess.
10:06 Yeah. And also, looking at the different comparison of before and after tables, you can
10:12 definitely see how it's definitely the, the converted table is easier programmatically, but the from table,
10:19 the, the dirty one is, it's, it's more broken up, like how people look at stuff. I,
10:26 I didn't think there would be a difference, but it does appear to be it's, it's easier for,
10:30 to visualize smaller tables as people, but, as computers, we need things a little bit more
10:36 broken down.
10:37 Yeah, it's cool. So if you've got a lot of data, especially in tabular form, check that out.
10:40 We're going on break. Like I'm actually heading out on vacation somewhere away from home and,
10:46 you know, I'm still taking my laptop with me because that would be kind of insane, but you know,
10:50 our sponsor roll bar, they, they were going to let me just chill out and not worry about
10:55 whether the web app is working and not check it all the time. Like I might not use my computer for
10:59 a few days unless I get notifications on my phone or, you know, text messages or Slack or something
11:05 like that saying, Hey, your website's down. There's this problem. You know, things are going to be good.
11:09 I'm not going to worry about it. That's because I got roll bar integrated with all the talk Python
11:12 stuff, which is really cool. So if there's a problem, you know, I can just read what the error
11:16 is and probably fix it pretty easily. So all the Python byte listeners, they can have the same
11:20 peace of mind. They just have to go to rollbar.com slash Python bytes and sign up for the free tier.
11:24 Sounds cool, huh?
11:25 Sounds very good.
11:26 Yeah. Yeah. It's good. It's good to be on vacation and you'll not worry about things working. Just
11:31 set up the error notifications and you're all good. I'm really excited that there's a new version of
11:37 Python. I'm, I think people are starting to move on from legacy Python and there's just end of this
11:42 week. There's going to be one more reason to do so. So we actually have as our next item, a video,
11:48 a conference presentation at PyCon Canada, 2016 by Brett Cannon. He did a talk called what's new in
11:55 Python three. And I think it's interesting. You look at all the peps and all the stuff that's coming
12:01 and you think, well, okay, they're doing little tweaks here. I guess it has new string formatting,
12:04 whatever. It turns out there are over 16 peps in Python three six. And that's more than any peps
12:11 that have been in Python three other than the actual creation of Python 3.0 itself. That's pretty cool,
12:16 right?
12:17 Maybe we should have had another role before now then maybe, but I'm excited for all of these.
12:22 Yeah. It's going to be great. It's going to be great. The reason I like this video and I want to
12:26 point it out is we could all go to, you know, what's new in Python three and we can read the list.
12:32 Like, okay, well here dictionaries will be ordered. there's now a private identifier or like a
12:37 versioning number on dictionaries. Like, okay, whatever, who cares? This gives you the story
12:41 behind all the changes coming to Python three six, right? Why did the core developers of which Brett
12:47 is one think that this is a good idea? Like, how does it help? What, what really problem,
12:52 what problem are they really trying to solve deep down when they made this change? And it really is
12:57 a cool look inside what's coming with Python three six. that sounds great.
13:02 I think it's, it's good. So Python three six release candidates available right now if you want to
13:07 download it, but you know, if you can wait like five days, you should have the final version of Python
13:11 three six. They did something with virtual environments, right?
13:14 Yeah. This is one of the things I, I was stumbled across. I think it was in a Reddit line somewhere.
13:19 The command command line command of pyvenv, which I can't remember which version that came in on one
13:26 of the three O's that's being deprecated. And the reason, and they want people to use the dash
13:32 M V E N V instead. And that's so that you specifically tell the virtual environment system,
13:40 which Python to use. And it makes the programmer know, need to know how to get to Python first before
13:47 they create a virtual environment. I think that it totally makes sense. It's just something to point
13:52 out. I think it's important. It, I'm going to have to actually edit my book because of this,
13:57 because, I think I, I recommended pyvenv in mine. So time to un-recommend it.
14:03 Yeah. That's cool. No, I do think it is good. I mean, you can say Python three --version. You'll see what that is. And then you can say
14:10 Python three dash M V and V, and then that's the thing you're going to get. Right. So it is a little
14:14 more clear, I guess. Very cool. Yeah. It wouldn't be a week in Python without some form of testing or
14:20 code coverage, right? Yeah, definitely. And, Ned Batchelder, who we all owe some gratitude for,
14:26 for coming up with, or for taking over the coverage package. He's, I interviewed him,
14:32 about that on episode 12 of testing code, but, he's planning a new feature for coverage up high,
14:38 which will tell us which, so when you, when you run a coverage report, also what functions
14:45 caused this or how did you get this stuff covered? And, he covers it in an article. He taught,
14:51 he titled, who tests what this is a discussion about kind of, how I like the discussion because
14:58 those, those, those people new to coverage can kind of peek inside and see the different stages
15:03 of how coverage works. It goes through measurement and storing the data and then combining the data
15:08 and reporting because you can't have multiple tests, most multiple runs and combine them into,
15:14 to one report. This idea of, trying to figure out which code was covered by which tests
15:20 is how it started, but he comes up with some, some reasons why there may be more,
15:25 more uses than just in testing. And it's a, it's a good discussion, but part of one of the things he,
15:32 why he wrote this article is, is to try to get some help. He wants some feedback.
15:36 So some of the questions are, he discusses the memory, memory usage and, and the data model.
15:42 And he wants to know if there's something we need more sophisticated problem solving on this,
15:48 or should we be more conservative with memory? And then the output, the output right now is intended
15:53 to be in Jason, but he wants to know if somebody could use a different data format. I like the
15:59 direction he's going with it. And I think I'll use it. And I encourage anybody that has sort of a
16:04 non-standard usage of coverage to take a look at this article and give Ned some feedback.
16:08 Yeah. I really like it as well, because a lot of times, unless you're actually a contributor to the
16:13 project already, you feel like the fate of the thing has already determined, but this was much more like,
16:19 look, we have this challenging problem. these are the ways and the trade-offs were
16:23 thinking about the ways we're thinking about solving it. The trade-offs were contemplating.
16:26 We're not sure where to go. If you want to help, here's how to help. If you want to give us feedback
16:31 before we jump in and go the wrong direction, do it. So this is a really cool article just on philosophy
16:36 as well.
16:37 Yeah. I think it's great.
16:38 And being able to know which tests actually triggered the covered line when you run a thousand
16:43 tests. Well, with these three, like, that's pretty interesting.
16:46 Yeah. And you know, before I talked to him, I didn't realize that there was,
16:49 there were so many features of coverage that I didn't realize, like being able to have multiple
16:53 test runs and combine that data and HTML output and things like that. It's pretty cool.
16:58 Yeah. Yeah. Quite cool. Quite cool.
16:59 So what do you got for us, Michael?
17:01 All right. I got one, one final glorious topic for the rest of the year to round out 2016. So
17:07 here it is. Threaded asynchronous magic and how to wield it. So this is a really cool article by
17:14 Christian Medina. You know, we had talked about the, I don't remember exactly the title,
17:19 but that asyncio tutorial that was like the G event tutorial remade for asyncio and Python 3.4.
17:26 And we're like, well, wouldn't it be cool if there's a great one on async and await, like the really,
17:30 the truly new cool features of Python for threading and parallelism. Well, Christian Medina wrote it.
17:37 Awesome.
17:38 He wrote a really nice one and it has a bunch of bite-sized examples. You can, you know,
17:43 they're not too, they're not too large, but they don't seem entirely fake. So he has one example of
17:48 like sending email notifications, sort of asynchronously, but it's like, you know, but you
17:54 realize there's no awaitable asynchronous, like way to send mail in Python. So, well, we're just going to
17:59 block, but at least we can use this asyncio loop for that. That's cool. And then also talked about the
18:04 AIO HTTP library, which is an HTTP client server for asyncio and how to do a bunch of parallel web
18:12 requests. So we often think about requests being the primary way that we do programming against web
18:19 services and generally HTTP, but this is another option that's really simple that fits exactly into
18:25 the asyncio. So you can easily block on the network calls, which will then free up the thread to go do
18:31 other stuff because it knows it's waiting on the network. That sounds cool. Yeah.
18:34 Yeah. It's really cool. It covers things like tasks, scheduling tasks, scatter, gather styles of
18:39 programming, and then even moving the asyncio loop to a background thread. So you don't block up your
18:44 main thread, but you kind of have a place to put all the asynchronous work and let it run on that other
18:48 one thread, which is pretty cool. So yeah. So thanks Christian for doing that. Got to meet him at
18:54 PyCon last year. And so that was fun. And hopefully everyone else is going to PyCon. If you don't have
19:00 your tickets yet, you need to be getting it right, Brian. Definitely. I missed out last year. So
19:05 don't be sad. Get tickets before they sell out because this I'm sure it will sell out. It sold
19:10 out early last year. And plus it's in Portland and Portland rocks. Portland definitely rocks. It's
19:15 going to be weird. They're going to be keeping it weird. All right. Well, that's it for me. I don't
19:21 really have a whole lot of news to share other than just saying thanks to everyone for listening,
19:24 you know, for our new podcast. It's been fun to do for you and I appreciate all the feedback.
19:29 I appreciate it too. Speaking of feedback, we did get one person. I think it's Harry J. I hope I
19:36 didn't pronounce that wrong on Twitter said that he listened to episode three and I had mentioned that
19:42 a library called Pianini that don't know if I'm pronouncing that right, but I assumed that these were
19:48 that maybe it was named after the Knights who say knee. We thought that would be fun anyway. Yeah,
19:53 definitely. But Harry J. tells me that this is not true. It's named after a Sanskrit grammarian
20:01 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
20:07 fact checking. Yeah, it's great to have fact checkers. Awesome. I'm still going to call it Pianini.
20:11 Knee, knee, knee. Yeah, definitely. Just know it has a different origin. Okay. Well, thank you,
20:19 Brian. Thank you everyone for listening. Thank you, Royal Bar for sponsoring the show. We will
20:23 see you all in January. Until then, you know, enjoy the winter wonderland unless you're down
20:28 in Australia, then have a nice summer. Yeah, definitely. See you next year.
20:32 Yeah. See you next year. Bye everyone. Bye.
20:34 Thank you for listening to Python Bytes. Follow the show on Twitter via at Python Bytes. That's
20:39 Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news item
20:46 you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout for
20:51 sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy. Thank you for
20:56 listening and sharing this podcast with your friends and colleagues.