« Return to show page
Transcript for Episode #253:
A new Python for you, and for everyone!
00:00 Hey there. Thanks for listening. Before we jump into this episode, I just want to remind you that this episode is brought to you by us over at talk Python training, and Brian through his pi test book. So if you want to get hands on and learn something with Python, be sure to consider our courses over at talk Python training, visit them via Python bytes FM slash courses. And if you're looking to do testing and get better with PI tests, check out Brian's book at Python bytes.fm slash pi test. Enjoy the episode.
00:30 Hello, and welcome to Python bytes where we deliver Python news and headlines directly to your earbuds. This is Episode 253. Recorded October 6 2021. I'm Brian knockin.
00:41 I'm Michael Kennedy. Yeah, yeah, necessary.
00:45 So welcome. Hey, before we jump into some of our topics, could you tell us a little bit about yourself?
00:52 I'm sure. First of all, I'm super excited to be here a little bit nervous. My first podcast ever. And I'm very happy to be on bicon biases. That podcast I've been listening to I think for the last five year, about the same time I got into Python. So right now I'm I thought like recently, a month ago, I started working at a new company, cybersecurity company called cipher bonito. They're doing some cool stuff, automated network perimeter security, for for Fortune 500 company. Very interesting approach. What they do there is to find more infrastructure and sell to the developer, and Python, of course, and I've been doing Python for the last fifth year. So as a developer, as a back end developers and automation developer, I actually started my career as a QA engineer. I didn't have any background coding background, so I kind of learned the Python on the job, or it will spread. And then I got into pi test and formation and some coin pride of switch to full time developer, but still, like testing is something very precious to me. I'm very invested in Oh, yeah.
02:21 important to me, too. Yeah, I
02:23 know. Fine. Thank you.
02:29 Well, Michael, let's kick it off with some awesomeness.
04:45 work so well, doesn't it? Oh, yeah,
04:47 I really don't. I really don't enjoy doing Java Fred, because I'm not a prominent developer. But sometimes I need to provide some kind of a UI interface and as required downright terrible spread. And then yeah, I usually just take some snippets from Stack Overflow and for waiting there. And HTML, it was so much cleaner, I could understand what's going on there. Very, very, like,
06:13 A bunch of other languages I don't want to work in either.
06:17 Exactly. Awesome. Well, there's not a whole lot more to add to this, but it's nice when these emerging technologies are coming along to get some help and examples and other resources. So thanks, Raj, for putting together this awesome lesson.
06:33 Yeah, well, I can't believe I got this topic, you guys. Yeah. Anyway, python 310. So excited. A came out two days ago. It I'm loving it. I've switched. I'm using it at work. I'm using it at home. And it's not like it's new. I mean, one of the things there was a article again, I'll just go through a few topics. One, the logos awesome 310, the 310 large logo, super Gala. I want to sticker like that. There's a couple of videos that I think are good to at least know about. There's the launch party. That was that started off with some awesome hats. They basically actually walked through the entire launch process of going of making 310 live and on on on camera. It's three hours long, though. I only watched a little bit but great hats. This is
07:24 cool. Yeah. So this is by the people who are actually releasing, it's not a party celebrating the launch. It's the actual
07:31 launch. The actual launch, which is awesome was neat. But um temporary and toasted. I think that was a pre recorded thing. But there was a what's new in Python 310 video that I this is more more more consumable at 33 minutes. I def I watched this while I was live while it was being broadcast at first. Yes, a couple days ago. And it's really interesting. This This one's really great. I thought I knew everything that was coming in 310. The thing that I really love about this video is there's Lucas Langa, and Kevin or somebody else at root talked about, you know, the other person was Sebastian
08:12 Ramirez and Brant Boucher. Okay.
08:15 And Lucas, talked about some of the some of the details on Well, a couple of them are talking about the, so I'm getting this wrong. What's the thing? The structural pattern matching? That's it?
08:30 Yes. Super, super switch. Yeah,
08:33 so is structural pattern matching. It's good. It's really cool. I haven't come up with a reason to use it yet. But give me time. But the there was a discussion of why that like a whole a big discussion on this, which was neat. It was a kind of a tutorial right there. And then also a discussion of why Black doesn't work for it yet. So that was the odd takeaway that I didn't wasn't expecting is, if you're really addicted to black, you can't use structural pattern matching and black together right now. They will catch up. But they're, they have two different parsers for Python and getting them all cut up will be. It'll take a little time. So be patient. Nice.
09:15 That, yeah, that's huge. But again, if you want to use if you still want to use black, you just need to the formatting of on the block when you use pattern matching.
09:30 So yes, I have to put it in a different file because you can't put the format off doesn't work in line in the file. I tried that in and it didn't work. Oh, that's,
09:43 that's a bummer. Okay.
09:46 But all the other features of 310 seemed to work fine.
09:50 It's good. Yeah, very nice. Some of the things that jump out that are exciting for me is x pipe y versus rather than x you know, union of x comma y or optional of x versus x comma or x pipe, none those those are nice. These additional type information and better error messages are those are the things that I'm looking forward to you except for I'm not really looking forward to errors. I generally don't like that. But once you're there, I prefer better error messages.
10:18 I think teaching Python is gonna love the error messages. So
10:21 Oh, the the error messages are pretty awesome. Just a few days ago, I was refactoring some code, and I had some one more big complex expression that was like nested data, and I needed to do some asserting and so another Korean footwear, and I guess I miss champagne. And then I would have I had this error, like expression is expected and we're like, what expression it's all like there. And I wasted literally, like about three minutes, figuring out what expression it's missing. And eventually they end up late. I missed one curly bracket. And I really expect I mean, yeah, pattern matching great bra. The pipe painting are awesome. But those specific like little things that are I don't know, I think like really bombed your dev experience. Oh, yeah. Yeah.
11:17 Speaking of better error messages and stuff, I'm planning on just integrating rich, like the traceback stuff and all those kinds of things just into all my apps, because it's just better. It's one line of code at the top. So very nice. Yeah, that's cool. Yeah. All right, everyone, right, right. Yeah. Europe with the next one. Yeah,
11:34 so it's a tool I stumble across a while, um, when I was looking for some kind of a solution for bundling all my all our analysis tools in one under one umbrella. So we have like large code bases, then use microservices though they will have a lot of repositories and of course we would like to use some linking and then we added pipeworks file and then we added another package because we found it pretty useful called vulture that find some unused the code and pointed out that may be to be removed or refactor which is quite mature.
12:22 is a fantastic name for that link. Here it goes in five seconds dead code. Oh my gosh, yeah, it's
12:30 pretty cool. Sorry.
12:31 I just I loved Yeah,
12:33 that's that's one of the latest addition, and then are aware because we deal with the security and the vulnerabilities we decided also to add bandwidth to the whole party. Those are really awesome tools to broad who started to get a bit frustrated. First of all, each and every tool requires its own configuration file. Like profiling, like every linker has its own rules by that style, you want to ignore such stuff which kind of requires customization so we ended up having like four different customization profile file for each store. And that's okay, I mean, once you've done it, it's okay but then people start to get really frustrated with your ci because it became a big flow because all the tools run sequentially so and even more so they become a bit frustrated with all the time all the different outputs so let's say you have issues in pilings and then you have problems with pipe code file and at first we didn't we just start failing once you once you have a cloud firewall and you don't proceed to expire once and then okay yeah, but then you have errors and pipes file and so on and so on. So it was really frustrating. So we said okay, that the okay fails, but let's continue on then. Speed all the arrows once that was done, but still people had some issues and started reading the output because a different format than the like, Okay, what does it want for me? What What do I do and you know, and then the whole thing, the whole experience is okay, I finish working on my PR, I just found out poster then together, you and I, but then I get stuck in this Limbo of fixing all this kind of stuff. So we started thinking, what can improve the user and learned the dev the dev experience so people will get frustrated with the act of wants people protected? Yeah, they start disabling features, and that's something that they
14:42 want, then your ci starts to lose all its value and everything right?
14:47 Exactly, exactly. So I'm kind of stumble on, prospector, and I actually stumbled because it always was always there. It's actually been brought by pi security, the thigh and the Same guide with same organization that are responsible for Pio act and for pipe rock style. Somehow, I missed that whole bundle thing that call perfector. I guess it's a bit less struggler, though we started using it, it bundled all our analysis tools together in one run in one unified output. So it's much easier when you have the output just just to read it and understand what's going on. And the more than that, some bonuses, we discovered some more tools that it provides that we didn't we weren't even familiar with that showed them a case complexity analysis, which provide their points out some kind of like in case you have a very big function with nested conditions was
15:54 nice cyclomatic complexity and stuff like that.
15:57 Exactly, yes. So there's actually a link there inside there that that takes you through Wikipedia and explains how all those things are calculated. But it's brilliant, pretty nice. Some you cannot always follow it through because sometimes Well, you have a complex function at the legacy code. And you don't necessarily want to mess with it. But it's nice to have this information or you can put in in a backlog. So that's something we discovered. There's also quite a Roma if you're developing packages. So if you have like some niche thing, let's say contributer RSP orc, so it will point out all the stuff there and you have the dodgy package that points out if you have like some central invader for just passwords or like AWS keys or some things you may not necessarily want to include in your call me. So a lot of goodies that come with this factor is actually bhandal a lot of analysis tools, which is cool. But as I said for us it really improve our experience because it's one output and one profile configuration, which means instead of having like a configuration file for each of the tools, you have only one tool demo. And more than that you have profile, which means like let's say you have, at some point you would like to run my site. Okay, but in some point, you don't want like, if you are merging to master, maybe you want to check for vulnerabilities at that point, but not on their recommended because they're still developing. So super useful. And surprisingly, is grant faster than each tool on the clock. I mean, it takes some time, it takes some time. I mean, it's not a super fast because first of all, it installs all the required tools for depth in one bundle. And the execution is filled the frame aggregation for all the tools. But yeah, it's really simplified thing. So highly recommended. good
18:15 recommendation. Yeah, in the live stream, Paul ansal has a question. Not sure if you know the answer, is there a way to add a comment to your code? For example, hash no prospector to tell him that a given line is actually not a problem similar to how bandit would disable warnings with hash Nosek.
18:31 Oh, so Chris Carter is just a bundle. It's like behind a fee and just enter the key of the same tool, though you use the same disable piling or disable pikelets file or no key way, though the rules were applied to each tool differently.
18:50 Got it? Makes sense. All right. Am I Up next, Brian? Yeah, thanks. So. So another topic on rich. I feel like we're always talking about rich now. Super fun. Actually just had Wilma googan, who I see out in the audience. Hey, well, on talk Python, so that was really fun. So here's the thing from Avi, Perl, Avi, Python, but you know, we'll still accept it. Just get this last name. Thank you, Avi for sending this over and let us know about it. So kuhnian Tran created this cool, terminal based visualizer for pandas dataframes. So she's into data science and stuff like that. And like many things that have to do with rich and UI, just having us a screen animation is, is really all you need to know whether or not this is useful for you. And so you can just go to the website that will link to the GitHub repo and it's got an animated GIF right on the front there. super nice. So just imagine you're in a Jupyter Notebook and you went to a data frame said df dot head or tail, something like that and you get a little table it comes out. Well here's one with animation and color All that stuff is a rich table, you know, the rich library, generating the table of the data frame right there. So if you're creating something in the terminal, and you want a nice output for a data frame, this is pretty simple. The code that you got to write is super easy. So for example, you come up with data frames somehow. And then you just say, from rich data frame and import pretty phi, and then just prettify your data frame. And that's it. Like, yeah, it's cool, right? You can also apply it to just regular dictionaries and stuff like that. And you can control things like limit the number of rows that come back, how many columns will be shown, in case there's a ton, you don't want to fill the screen, of course, you can transform your data frame. But if you just want a quick like, hey, just show me the first few columns, it'll do that. You can either view the head or the tail effectively, you know, if you're gonna say, give me 20 columns, there's 2000. Well, I think that by default, it shows the first the head, but you can also show it in reverse, and clear the console. So it just fills the screen, things like that. So even control the animation. So not a lot to do with this. But if it's useful to you, I think, I mean, like not a lot of gears and ways to use it. But I think if it's useful to you, you'll really find it.
21:15 Interesting. Yeah. All those pretty color it felt like it.
21:19 Yeah. So super cool.
21:23 So rich, rich has a ton of stuff in it. But that I mean, I use the tables like all over the place because it's just the easiest and produce way to display a table right now in in a CLA application. So awesome. Like love
21:38 of it, love it. Raw into out in the live stream says, well, rich for the win once again, looks great for SSH session. Yes, it does. And I hadn't really even thought about it for that scenario. But yeah, it definitely does. And Jared says to us, Brian, and me, I can't thank you enough for all your podcasts as they as great as they are. The video format is even better. Yeah, Jared, thanks for being here. We always love having people on the show. It gives us a little bit more interactive aspect for all the people listening afterwards. Yeah, that Brian, go for it. So
22:08 yeah, um, I'm gonna go back to 310 for now. So I'm like, except one of the things I'm excited about is the union types, like you said, for one of the the things that was released is union types, so that you can do X or Y, the thing that I really liked about this, one of the things is the optional. So you can instead of stuff you've got I don't have an example here. But if you've got a, you got a function that takes an integer, but it might default to nine, you can now say that the type is int or none, and then assign it the default value of none. So it'd be in two or nine equal none. And that's, and it's really clean. One of the nice things about that is you don't have to import optional from typing. So that's really clean. But I was I was like, bombed, because actually a lot of the projects I work on, I have to support more than just 310. I've got to support 373
23:07 you haven't already moved to 310 you guys are such the laggards.
23:12 Like it's my application. But for that two days. Yeah, if you're supporting Python packages, you want to support more than just one version of Python right? A little bit. I mean, you don't have to. Now of course, if if you want to. And so then I was excited to see that Adam Johnson put out and I was actually I want to shout out who told me about this. Oh, I lost it. Somebody else told me about this. So sorry. But Adam Johnson wrote a article about type hints how to upgrade syntax with PI upgrade. So Anthony, subtly wrote a PI upgrade tool. And what it'll do is it does a lot of stuff. But one of the things that does is it changes this, this union operator or this Yeah, for for types. And it includes was it include the from future import annotations that will allow you to use this, this, this type, Union types and none in everything back to Python? three, seven. So supposedly, I haven't traded on three, seven, but that's the that's the claim. So there's a cool, there's a nice article on how to upgrade your syntax.
23:12 It's like an automatic tool. You just run.
23:12 Yeah, it's a PI upgrade.
23:12 So very nice. Frederick had the live stream says the union pipe really makes everything a lot less noisy and more readable. Love it. Yeah, we're gonna offer Are you gonna suggest?
23:12 I'm like, Oh, the next topic came in.
23:12 Oh, yeah, sure. Oh, I
23:12 actually wanted to.
23:12 I thought you were gonna have a comment on Yeah,
23:12 I have a little comment because I really liked the upgrade because I kind of feel that lately. We have I enjoy type annotations like with each version I mean have like a little bit of change and then you have to comply to the previous one and then like what I would love to see is like some kind of a convention on how to do typing being correctly because there are so many versions of and well because I'm a bit lazy I don't always use pipe on occasion but I know what to shoot and then I use some kind of what I use the tools like a monkey pie and sometimes the pie on the side. So they just add that type of notation the during brand crime, um, and then a barometer kind of, I I then I kinda have some kind of a convention there because I feel like with hyperinflation you can do it in so many way so maybe
23:12 string formatting exactly but
23:12 eventually we all I think we can all agree that F strings is the way to go right but right now we're kind of in a wild wild west with five of the stations because we have the 3.3 and do they all they are evolving like HTML Python version and have something new and then the old becomes obsolete or frowned upon and then your oh you shouldn't do it like that but what I would like to see maybe a tool such as the pie upgrade that will tell me Okay, this is the convention This is how you should be doing your table type painting from now on
23:12 it's a good idea we saw you're doing the old way here's the new way through that
23:12 Yeah, yeah I'm a bit confused with her and I'm lazy I'm I'm confused. In file it's not a built in features though. Like you're using type annotation. I see a lot of fight on a slow low end for them and for me, it's like okay, I'll write my code and then Okay, I'll start using from by painting Yeah, sounds good.
23:12 Yeah, I think pay upgrade is the trick so it does do one of these like the going from uppercase list to lowercase list and switching away from optional and things like that. So
23:12 I may be running this later today is
23:12 some kind of a type on type hinting that formatter this may seem like it should be that's that's what I would like to see. Yeah,
23:12 exactly. Brian, you know what time it is extra time extra time you got anything you want to put up there throughout?
23:12 Yeah, actually I don't have any links for it but I should have had links up but i was uh this is hard for me to believe actually but um, I'm like 2017 A long time ago 2017 2018 I submitted to eat a defect to pi test the PI test project and then I also wrote up a test to describe the defect but I didn't know how to fix it so that was my first contribution to pi test is adding test code but um, this last week I are added to had to pull requests and and they both got accepted and merged so that pi test file actually have my code in it so
23:12 super cool. Cool Hey, I just realized we skipped yells finals thing right?
23:12 Oh no yeah,
23:12 so I'm sorry about that before we get to the rest the extras
23:12 that's that's why I'm so yeah, I
23:12 feel like you've got these these these cool ways to like bring together multiple tools instead of telling people about bandit you're like, here's how to use bandit, all these things are instead of black. Here's how to like do all these different things.
23:12 Yeah, yeah. I kind of like combining things and then make it more general because, I mean, the Python ecosystem is so rich, there are so many things. Yeah, it's nice to bring some stuff together bundle brand, easy to use. So Docker is trumping also i sambal, I would recommend that both brand upgrade, after ascribing a problem or my resentment, even to black formatter. I know it's not a popular, popular take how maybe I shouldn't say it, but until recently, I was correct. It's Robin, I don't enjoy black form, I think I think it looks great. It's more readable. It's nice, broad, I had some major issues with well with myself and colleagues that we can get sometimes over into the app, like, okay, I've tried to write some code, and I don't know if it's a bug, or I'm adding some feature, and I'm done. But then Yay, I want to make it black because it's cool. And then I run black on the model or sometimes if I really want I'll go wild, I'll run it on three prior package. And then I submit my PR and like PR. Well, you can close the single bug fix for the little line I've added for the functionality or the big thing. And then I have live one, I don't know, some 100 changed file because I ran black. Or even if you fill the model, like the whole model looks like brand new. And then if I have to reuse such code, I would say okay, but where do I start? Where do I begin? Because I don't know what
23:12 changes, right?
23:12 And yeah, and it became a real issue, because on one hand, there were a lot of developers that was really like, into black, let us do everything, let's make everything black. Like, let's make everything beautiful. And on the other hand, we will get those huge PR of like, okay, when do they start? And where do I even start? Thought we started restricting black was that we at some point, we as a group, we decided, Okay, no more black. But that's what's also very frustrating. And then I, I had some talks about with a friend of mine, actually, okay, and you should use the darker and darker if we tiny, not a big package that's very lightweight. And what it does is it takes that a little bit more conservative approach doesn't say, okay, does black everything, have a huge PR, it says, okay, you want you to have to convert your code being beautiful and black, but let's make it gradually. And then you have it, then you eliminate this huge PR and huge mass, just change the stuff, you need brahmer of darker dots on the file or even on the entire copy, and then it will format only the changes you made in the file. Okay, so here's, I think, see, nice thing.
23:12 I love that it runs on the last Git changes. And that it's
23:12 actually DOD which which very simple like, I can't believe no one thought of it for real life. So simple. Because what it does with git diff, gets the changes, and then the front black formatting, all those changes. And then you have normal working PR, with nice formatting. And yeah, you want get the whole beautiful black all in one, and you make it gradually. But eventually, I think it's more control more, more constrained. And I think it's better this way. And we started using it a couple of months ago, and I think it has a good progress when we got integrated into our pre commit hooks. So it's kind of seamless. It's not that you need to remember running blackbutt course you can also integrate it in PI charm or VS code. I think you've even been for people who are fond of vim, and so I think of as some kind of a plugin and who would do that. Yeah, I don't know. Who are those people? Anyways? But yeah, so it's simple. Yeah, it's that knife. Made by Apple. It's the main ride on T. and T. co Kahoot. Coahuila. Yeah.
23:12 But if I didn't, Yeah, awesome. I think this is great. Yeah. Paul, out in the audience has an interesting bit of feedback. This would be super helpful if you were starting to enforce code standards on an already existing repo, which is most kind of code. Right? So yeah, yeah.
23:12 If you start in like new projects, though, yeah. Black it all the way. That's fine. Yeah.
23:12 I've heard recommendations before to just have one commit that just does the black thing. But one of the problems with that is you lose sort of the history of when the oil really was last modified. So if a file hasn't been touched in two years, it's kind of nice to leave it as non touched for two years. So that you can you know, kind of see the history but yeah,
23:12 yeah. If you will, yeah, if you'll run black, and the on a five year old kit called basic Look, look, one look like you did it all from the beginning.
23:12 On the other hand, if you want to up your commit status, number of lines changed way more than the rest of the team. You can always do
23:12 that. Yeah.
23:12 All right. I know y'all. You have a couple of things that you want to give a shout out to at the end here as well. So let's just keep going with those.
23:12 Yeah, sure. Um, so I have two things. The first one is actually a colleague of mine, Dan. He's been writing In the book, very interesting book, a bit of a controversial book, if you dive into it, he basically the opposite story, and it's good for some. But in general, when you deal with complex problems with object oriented programming my even make it makes a lot more complicated in terms of debugging and the separation of concerns. And then the preserve some kind of a new way to deal with the data and how we present data, data data oriented programming, I have to admit, I read some of the chapters not all identity initiative book, it's still, it's almost still work in progress, though most of it completed. And you don't have to agree on everything. But the whole approach of the combination of data oriented programming with functional programming, I think there's some benefits to it. And then some complex problems can be solved faster and easier, and would love the bugging sprint. And like, for me, like I have this rule of thumb. If I have to activate the debugger over and over again, to understand what the code does, instead of just reading the code, it means the same thing with the code is not 100%. Right? Okay, because the code should be readable. And I encounter this issues when working with very heavy object oriented code bases, a lot of inheritance and multiple inheritance. And then I went to Django and they use mixin. It is hard. It is hard to design. It is hard to but mostly it is hard to read. And difficult. It's interesting that said I'm not fully like, Oh, I'm not delivering that. Okay, object oriented. So we've gone from the world. Not it's not my stand, but I think
23:12 that stand but it's still it's still around, isn't it?
23:12 Yeah, but that's I'm not? I I'm not completely on board with that. But I think at some point, in some cases, there are approaches that are much more lightweight. In the end the whole thing with data versus cold separation, I think, yeah, I think it's my, I think it's, it's kind of um, yeah, I've kind of changed rewires your brain a bit. After you read the chapter. Or, like next year,
23:12 maybe it's one of those things like functional programming, you don't necessarily do it all the time, but you read it, and it gives you a different perspective, even if you don't totally adopt it.
23:12 Yeah, that's right. Yeah, okay. Oh, yeah. A little bit. self promotion here. Um, so a few months ago, I released my first open source project. Cornell now was actually covered by Brian, I think, two months ago. Yeah, yeah, so I just wanted to do a little shout out to all developers out there who are looking to contribute to a little bit knife with a very nice recommendation. Project, it's only the beginning. What it does is, it's actually record and replay ever for, for mock the mock server that we call real data. And then can be used as part of a CI, and for info purposes, for end to end testing. Because like if you have some kind of an entry point that starts a cascade of events and building salary or whatever, and just that, eventually you reach the airport when you go out and send an HTTP request. So here, Cornell comes in handy. We use it quite a lot. My previous company, and I'm trying to now integrate it in my current work where I think about some potential, and I would call an image not very mature. So I would love like, really, if someone wants to contribute even the title or documentation or whatever, we really warmly welcome all contribution.
23:12 Oh, that's great. Brian asked me on that episode, where I thought the name came from. And I thought Chris Cornell from Soundgarden and all that is that correct? And all those things
23:12 well if you need faith what the faith remind you Oh,
23:12 No idea, I guess. I guess it would, I would guess a traffic light.
23:12 Nope. Does the gray pixel in the corner also belong to the street sign on in a sad statement on our, our digital existence.
23:12 There's been somewhere I'm stumped. I'm like, I don't know. And now next next question, please.
23:12 Roll three times in a row. going vertically. Am I am I am shooting.
23:12 I couldn't find all the mountains. Yeah, the worst is when you find all this stuff correctly, then it refreshes and go find some more of them. You just found them all.
23:12 You seem like you like to find traffic lights here. Have some more.
23:12 board. We got some more lights for you. All right. Well, that's a joke I brought for y'all.
23:12 Well, thanks. And I appreciate you finding them. That's a cool. So thanks a lot, everybody. And we'll wrap it up for today. And thanks, everybody on the stream for joining us. We really appreciate it.
23:12 And thanks, y'all. Thank you, especially for being here.
23:12 Yeah, it was really fun. Thank you. Thanks for listening
23:12 to Python bytes. Follow the show on Twitter via at Python bytes. That's Python bytes as in BYT s. Get the full show notes over at Python byte sarafem. If you have a news item we should cover just visit by them by sarafem and click Submit in the nav bar, we're always on the lookout for sharing something cool. If you want to join us for the live recording, just visit the website and click live stream to get notified of when our next episode goes live. That's usually happening at noon Pacific on Wednesdays over at YouTube. On behalf of myself and Bryan Aachen, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.