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 pytest
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 pythonbytes.fm/courses. And if you're
looking to do testing and get better with pytest, check out Brian's book at pythonbytes.fm slash
pytest. Enjoy the episode. Hello and welcome to Python Bytes, where we deliver Python news and
headlines directly to your earbuds. This is episode 267, recorded January 19th, 2022. That's it. I'm
Brian Okken. I'm Michael Kennedy. I've got a cool green screen today. I know some days we have cool
stuff to talk about and cool things to share, but you're taking the next level. You are live streaming
and recording right from the beach in Hawaii. So yeah, I'm looking out at surfers right now. So
it's nice. It's, you could probably handle doing it more than one week, right? You could just do this
for a while. Yeah, we should, I should move here about a month every year. That'd be great. But anyway,
let's move on to our topics. Michael, you want to talk about boxes? I really do want to talk about
boxes. This is such a cool library that I found. So here's the thing. We have Python classes and we
have dictionaries. Where's all the data stored for most classes? In the dunder dict, right? Which is a
dictionary of what is your field? Here's its value. Each instance of the class, each object gets its own
instance of that dictionary, right? Yeah. And yet when we have a dictionary, we can't treat it,
we can't get the values of the dictionary in the same way that we do have a class, a class, you say
thing dot field. Well, wouldn't it be nice if you could go to your dictionary and say it has a key dot
name. So just D dot name to access it. That's the basic idea behind this thing called box by CD
Griffith. And that enough, that was enough to get me interested and think, all right, this is a cool
idea that I would love to play with and maybe I should use it more. But then I started to look a
little bit further. So if you go down here, it says, all right, well, sometimes these keys, they have a
structure that won't allow you to treat them that way, like a space or a colon in the example, spaces and
colon. Yeah. So for example, they have a key that is the name of a movie and then data about that
movie. So Robin hood spaces, colon men in tights with spaces. And by default, it'll actually convert
that into something that you can use by just, you know, replacing spaces with underscores and colons
just go away and stuff like that. Oh, that's awesome. You can still do that, which is cool. But there's a lot
more stuff. It says, check out the box GitHub wiki, which is right on the homepage, the GitHub that I
linked to. And there's all sorts of things. So they show, start by showing just the basic stuff, like
here's a box and you just, you can create it through keyword values or pass it a dictionary. It'll
initialize out of that. So they've got like funny movie equals something. And you just say
my box dot funny movie, just like it was a class. And that was like, I described the first thing.
However, there's more that you can do with it. So if you go over to the types of boxes,
they have conversion box, default boxes, box dots, camel killer box, which is awesome.
Frozen boxes, converters. So not just only will it work in all these ways, which I'm about to describe,
it will convert to and from dictionaries, to and from JSON, to and from YAML, to and from message pack
and CSV. Okay. So let's go to the types of boxes and check this out. So by default,
you get the conversion box, which is what I described where there's a space that'll put an underscore.
Yeah.
All of them you can access in this key value way. It's just a matter of what happens to the keys,
if there's a way to make them more accessible, but you can turn that off.
You can have, you know, a default dictionary, right? Where if the thing is not there, instead of
throwing a key or it'll create whatever you say the default is like create a list. Cause I want to add up
things or create, start with the number zero. Cause we're trying to count each one of those as we
build it up or something like that. Right? So it can also be a default dictionary. They call that a
default box, which is cool. And it can also do what it calls a box dots. So in a string, you can traverse
the hierarchy of the stuff contained in the box through the dot notation. So you could say, you know,
my box dot a dot B dot C, and it has this fluent interface where the thing that it returns from
each level is either a primitive thing, like a number, but if it's a sub dictionary, it'll return
a sub box, I guess. Right. So you can keep going on it. You can also then just say, quote, a dot B dot C
to traverse that hierarchy as a string. If that's more programmable, this one is great. Are you working
against an API or some data source that is written in a different language style? So especially I'm
thinking C# here where it's not lowercase and underscores as a separator, but it's capitalization
camel case. Like the example they have is pesky and annoying keys, which is capital P, capital A,
capital A, capital K, all one thing. And like, if you're going to say dot the thing, well, guess what?
You're going to have to write that in your code, right? Yeah. Unless you make it a camel killer box
and then it converts it to snake case pesky underscore and underscore and annoying and keys.
So if you program against an API that's written in another language, you can still do this Pythonic
code, which is that's amazing, right? Yeah. I like that. That's great. I know it's a good,
a good name. I mean, I would, it's, it's a fun thing. I personally wouldn't recommend it because
then your code, you're, it's hard to look up the documentation because it'll be wrong.
Things like that. Yeah. Yeah. Maybe something more in the affirmative, like snake case converted or I
don't know, whatever. They have a frozen box, so it's unmutable and hashable, which is pretty cool.
Yeah. A recast. So you, if you put in strings to this key and that you want it to be numbers,
it'll always convert it to a float or whatever. So those are all pretty awesome. And then it'll even
do things like put a prefix for stuff that couldn't be valid, non quoted symbols, right? You could,
you can say dot name, but you can't say dot three 27 name, right? So you can say, put an X.
So it's X three, one, seven or whatever. all those things are pretty awesome. let's,
let me go back here. The other thing is just the converters, right? So there's all the converters
you might go to dictionary to YAML to Toml, and also from all those things, which I think is pretty
neat. So what do you think? Like it? Yeah, I do. And there's, there's times where I've really had
wanted to conveniently just create something with a dictionary, but I wanted to use dot notation.
So I've used like a name tuple or something like that. And, and this, this is actually,
this does it for you. So nice. It's really nice. And I've done stuff like that as well,
where I'm like, all right, I'm going to create an old class. It derives from dictionary and just give
it a set adder, get adder. So you can do the dot thing on it. But this seems to have just so many
more other features on top of it that I don't think I'll ever do that again. I'm just going to use
this box thing. It seems so much better. Nice. It's cool. Yeah. So I think there's just a few
comments that I got to bring in. Yeah. Roman Wright out there points out that the setting default box
is not the default setting, which is pretty awesome. Yeah. Chris May points out that, that for this,
someone needs to think outside this package to get something outside the box, right? To get something
really, really amazing. and, just, you know, Brandon brainers a little bit jealous of
your green screen. Hey, that Brandon's the one I had, I had on as a guest for testing code recently.
So hi Brandon. Right on. Yeah. Very cool. So, all right. well, what's next? What's next is a
mocking sort of mocking. So Adam Johnson has an article called, making simple mocks with simple,
making simple mocks with simple namespace. And I had never heard of this. So I'm really glad he
wrote this article. It's really pretty great. Oh, do I have the wrong? Oh yeah. Let's just cover
this one. Need my notes. Nevermind. so Adam's actually been crushing it lately. He's got a lot of
recent blog posts. So good job, Adam. the simple namespace is pretty neat. It comes from
the type standard library. So it's not an extra package you have to have to bring in, which that's
cool. But one of the things that, so it's like, normally we use unit test mock, or you can
to mock something. But one of the problems with mocks is by default, if you misspell something,
it's going to be fine. It mock just lets you do whatever attribute access you want. And that's
usually not something you want. So, right. Usually the mock is like, let me just get in the way
and just let things keep working no matter what. Right. And just don't do anything unless you say,
return this value for this function call or something. Right. You can pass in specs.
and, and if you have a known object that you're mocking, you use specs and that, that works, but
sometimes you don't need that much of stuff. So simple namespace is a thing that just lets you
fill in attributes and then it works to access them. It works kind of like a name tuple or something
like that, but the usage of it is super simple. And then, and then you can pass this around.
And so in the, in the parlance of, of like testing, this would be for a fake or a stub,
uh, not really a mock cause you don't interrogate it. But if you just need to fill it, have something
that, that, you know, walks like a duck and quacks like a duck, you can use one of these to
create a duck, and have it get passed in. It's pretty cool and super simple and really easy.
Love it.
Yeah. It seems a lot like just what people would have expected mocks to do if you described it.
Yeah. like it, so, when he has a, it's a great quote, it's as simple as possible with no
faff around being callable or tracking usage or something. So, in, in a lot of, sometimes
with mocks, you, try to interrogate. So you have a function call and you interrogate the mocks
to say, did it get called by my code? These don't do that. You can't do that, but it, it, as long as,
but you set it up with the attributes you want passed through. and it's pretty,
just pretty neat. I'm going to use these all the time now. So yeah, it looks fantastic.
Very nice find. All right. For the next one that I want to talk about, let's go to space.
Space.
And embedded things in space. So this is pretty fun. this is an article on CD net talking about,
uh, raspberry PI. So apparently the European space agency has uploaded and installed and configured
two new raspberry PI's and not just any raspberry PI's there. These, what is it? Astro PI. That's
what it is. These are, regular, raspberry PI four boards, model B's with eight gigs of memory
that have been hardened for space. Okay. Wow. Okay. And the whole goal of having them up here
is so that students and kids can write code and run experiments and just play with automation,
but literally using the sensors of the international space station and actually writing Python code and
machine learning stuff that runs up there in space. Isn't that cool?
That's incredible.
Yeah. Yeah. So apparently there's 500 student programming teams in Europe who are all participating
in this thing called the European astro PI challenge, which is like an education focused, competition
or startup or whatever. Okay. Yeah. So out of this world, it's out of this world. Absolutely.
It's really cool to see Python in space. Right. And, here's just more of it. Right. So raspberry
pies, because you can, you can practice your stuff at home and then have it go up there. Neat. Yeah.
Very cool. So you have things like the humidity reading and board the ISS and, the various
sensors and things on there that you can work with and then just do sciencey things. I mean,
when I was a kid, the science fair was like, well, let's make a little volcano that erupts and like,
it was this stuff out of paper mache. And you know, these kids get a right code that runs in space. That's,
that's the next level. Yeah. I admit that I've never done the volcano thing though.
I kind of, I should do that. Yeah. I haven't either very much. I mean,
I did some paper mache thing and I think I had a failed volcano once, but that's about it.
Anyway, I just think this is really cool. And it's a neat use of raspberry pies. It's a cool way to
take like a semi-modern computing environment, put it somewhere neat where it has access to real,
the real world and let kids and other researchers write code on it without going,
yeah, we're not going to install your program on the ISS. No, no thanks to that.
This is so neat. I'm blown away. I would have never thought that something like this was going
to happen in my lifetime. It's nice. Yeah. Yeah. So many neat things. All right. Well,
that's, that's all I got to say about that, but definitely fun.
So one of the things that new, new coders have to deal with it. And unfortunately it's,
it's hard to tell them ahead of time how to deal with it is tracebacks. So tracebacks are,
they're just part of life with coding and Trey Hunter has a article called reading tracebacks in
Python. And it's a really great, simple introduction. I love it. One of the things I want to comment on
is just, just the order in which we teach people things and it teaching people how to do
tracebacks is something that it really needs to be early, maybe like right before testing and right
after the hello world. But seriously, tracebacks happen so fast. And, and when you start coding,
uh, an assertion happens that you don't catch and you get a traceback and people panic and go,
oh my God, I suck as a programmer and you don't, it's not overwhelming. Just kind of walk through
it simply. And that's what this article is about is how to walk through it simply. And so we're going
to, it's, if it, if people are new to Python listening to this or how to teach people, you just
teach people to start at the bottom. You read the last line first. So the last line in traceback
is the, error message. Let's, scroll to one on here, which is good to know because that's
not true for other programming languages, the errors at the top and it, it's kind of inverted.
Oh, really? I forget, but yeah. So the last line is the exception and then, and then also the
message for the exception, if it's, if it's there and then, and then you read up and the next two
lines up are, you've got a file name and a line number and, and then a copy of what the line is.
and if, and that's, that's the place where the exception actually happened. And these two double
things, those two lines, the line is called, what do you call it? They're the, stack trace,
the stack, whatever. Yeah. Call stack. Yeah. It's, this is the call stack. and that's even more so
because you get lines within functions, right? Not just the, yeah. Yeah. And then, and then
if you don't understand why you have an exception there, you just keep going up, you keep going up
to, and sometimes the exception happened, not in your code, but in some, some third library
call that you went called. So you're not going to debug that. So you have to debug your, your code.
So you, it's good to go up enough to where it's in your code. And then if you can't figure it out,
you just keep going up. and this, this example is actually not obvious to me what was going on.
So I'm glad he walks through it. So Trey walks through how to read this and it goes up to,
the fact that, so this is the example has a type error because you can't, can't Nate a string
to an integer. and that's weird because it doesn't look like it's trying to do that. But,
then he walks up to find out that the function is actually taking the standard input,
um, and passing it in as a number and one of the arc Vs and you have to convert it to an int first.
But so that's a, I'm glad to use that example because people new to command line interface,
uh, coding often forget that, that the input is usually a string, even though you pass in a five,
it's still going to be a string with a five in it. right. It looks like a number,
but it's not a number. Yeah. So you have to convert those. and a reminder here,
this is user input even in, so in this case, it's not going to be harmful just to convert it to an
int, but, even command line in inner input is input from a user. So you have to sanitize it if
you need, if you're doing anything like with a database or something. So.
Absolutely. Oh, that's, that's great. I think definitely that's the kind of thing you need
to start with when you're teaching people Python, like almost before you teach them to code, like
how to, if you run into an error, here's how you understand it a little bit. And here's how you
Google it or go about finding some way to fix it. Yeah. And if you start, especially if you start at
the top, it's going to be a mess because if you've got a call stack, like 50 functions deep,
hopefully not, it's going to be a really big trace back and you don't want to try to
untangle all of it. Just start at the bottom. Yeah, absolutely. And Dean out in the live stream
says, you know, when you use some Python wrapper on top of a Java microservice and you get a 500 line
exception, you're like, what have I done wrong to deserve this? Yeah. That's like the advanced
version of this. Yeah. Speaking of advanced, how about some intrigue? Ooh, yes. So you and the
listeners may have heard of this person who turned out to go a little bit bonkers on their open source
code, luckily in npm and not Python. So JavaScript space. So there's colors and JS, which are two
widely used, no padding margin npm libraries used for JavaScript and no JS. Well, this developer,
Marak Squires, in first, they thought it was a supply chain vulnerability and somebody hacked the
account. But it turns out, no, no, no. Marak intentionally corrupted both of his libraries.
So they ran in an endless loop, spitting out random political messages while it would loop around and
just fill the screen with garbage. So initially thought it'd be a hack, but political and personal
messages included in the code and on his related websites indicate that it may be the work of a
disgruntled, lashing out developer. Wacky. Wacky. Okay. So that's not, I was not going to cover that.
I saw that and I thought that that was pretty interesting. And then Mike LaFontaine points out,
oh, Brian Krebs, the security guy. I just noticed that this Marak Squires seems to be the same fellow
who sabotaged two of his own popular open source libraries next week. And he links to an article on,
in my post, residents of Queen Holmes with suspected bomb making materials charged for some sort of like
terrorism type of thing. So the same person who sabotaged their, their npm packages, then was like in the process of
making bombs and it just kind of shows you an interesting spectrum of where all this stuff lands.
That's crazy, huh?
Oh yeah. Weird.
Yeah. Yeah. Very weird. Oh, I also forgot to point out, this is a, an extra, extra, extra section. So
short, I got, I got more stuff, but the first one is the guy that went and messed up all the stuff on NPM
and everybody's dependencies recently has now been charged with creating bombs in Queens, New York. So yeah,
there's that. Okay. Here's one that's really positive. Andy Griffiths, don't know this person, but they posted
something incredibly simple that is super helpful when you're building a websites and trying to design them.
You know, you can go to inspect element and you can like hover over different parts of your page and highlight and
it'll show, okay, this is actually the div here that is containing this and it has a margin. And so that's why it looks
like that. Yeah. This guy posted, Hey, struggling with layout, turn on CSS outlines.
It's a superpower. And all you have to do is write this incredibly simple CSS star is the CSS selector
outline colon one PX solid red. And what you get is your entire site now highlights all the elements on
the page. So you can figure out how to style them. Oh, that's pretty cool.
Given the amount of work. Isn't that amazing? Yeah. Yeah.
So I definitely think this is something I'm going to try to use when I'm working on design and stuff,
because it's just so, so much easier than trying to like hunt around with like the debug tools. And then,
you know, you know, you reload the page and it changes and all that. So quick tip for people there
who do web stuff, Python 3 10.2 is out and there's actually a decent amount of stuff shipped in it.
if I do some quick scrolly, scrolly, I would say that's like 30, 40 changes and bug fixes and so on.
Wow.
So things like fix hang in run test underscore impede due to race condition or fix this thing in
documentation or, fixed hash lib used for security option to work correctly with the new version of
open SSL, fixed memory leak in pyval.eval code EX. That sounds like it might be used a lot of places
and using the conjunction with the word memory leak, that might be good to fix. Anyway, I already installed
this on all my servers and have it run in production and it, nothing seemed to catch fire. So that's good.
Yeah. Very good.
Yeah. So, Python 3 10.2 is out. That's cool. All right. one, I think one more thing, two more,
two more things related. I'm doing a YouTube series on a bunch of little short Python lessons,
and I've got about a hundred videos I want to make and I've made five of them and published or scheduled
them to go out already. So, I've got a list. Don't do this thing. Anyway, a bunch of little
tips like parsing data with Pydantic or counting the number of occurrences of items in a list, or
you've got foreign loops, convert them to list comprehensions. These are all like
four minute videos that just teach you something really quick and Python. So if people are interested
in that, they can click the link and then subscribe to my personal channel, not the Python bytes
YouTube channel, which is awesome, but doesn't have this content, to get more of those.
So that that's fun. Cool. How do you find time for all this stuff, Michael? You're like everywhere.
I've been, I've been wanting to do some of these YouTube videos and just try and explore some of
the ways in which people are like presenting and teaching coding for like six months. And I've just
decided I'm just going to take two days and just going to do it because I've been putting off for like
months. So there's that speaking of time. I also,
I am controlling our stream and doing all sorts of fun stuff with like this device called a stream deck,
which you may have heard of the stream deck. You have one too, right? But just not Hawaii.
Stream deck is this little device here that, lets you basically set up a bunch of buttons and
control things, which is super fun. And it's built for streamers and whatnot. I decided to see what you
could do if, let's see, hold up the wrong link. I decided to see what you could do around,
um, the stream deck and software development. So, so far I have two profiles, one for PyCharm,
where you can control all sorts of things like click a button on your little device and it'll show your
PRs or switch the select modes. You can write and call it multi columns and all sorts of stuff. And then
also one for Jupyter that are like launch Jupyter and insert, insert your standard imports and add
cells above and below and rerun them or show me the command command palette and stuff.
- Neat.
- So yeah, that also has a video on it as well. And people can check that out, but I've,
I've got this YouTube profile, I'm not YouTube, GitHub profile, repository where it has all the
profiles for, the stream deck. So if you want to download it, play with it, customize it,
those are up there as well. All right. That's it for all of my extras. You got any yourself?
- yeah. So I wanted to talk about, so this is a cool article by David Amos. so David's
awesome. He's one of the, one of the gang, the people at real Python, but, it's the articles,
three things you might not know about numbers and in Python. And, one of the, I don't know where
the line is. Oh, it's near the top. It's so awesome. He's got a line that says,
there's a good chance that you've used a number in one of your programs. Yeah, I think so.
- This is, I was, I can get behind that statement.
- Yeah. So one of the things that like strings have, strings have bug, like functions
attached to them. They've got methods. and I, you know, we know that it's kind of different than other
languages, but numbers do too. And, this is something actually I didn't, didn't occur to me
that, that you can do like two bytes and stuff. So there's, there's functions that you can call on a
number. There's a trick though. You can't do like 255 dot two bytes. You have to put it in a variable
name so that it doesn't think it's a decimal point. and you also, or you can put parentheses around it.
So you can do 255 with parentheses around it and then call, to bytes or something like that.
So there's, integers have two bytes. so you can convert it to bytes. You can use the class,
uh, class method from bytes, and you can also do like bit length and a bunch of other functions
that are pretty cool around integers, which is neat. And then floats have their own methods. Floats have,
uh, like, is an integer or is integer ratio, which era as integer ratio. So it'll convert
it to an integer ratio. That's pretty cool. Oh, wow. Like the, some sort of approximation
and rational numbers. Like, yeah. So, yeah, I don't have, I don't have that example pulled up,
but no, but that's cool. There's some, I'm no idea about this stuff. Yeah. I've got a bunch. There's a,
there's a, there'll be some links in the show notes to the Python documentation for these.
it's pretty nice. the, the, okay. So that's the first thing that you should know about
numbers is there's methods there. So look them up in the documentation. and I'll, we'll have links
to the documentation. And then the second thing you should know about numbers, second over the third,
is numbers have hierarchy. So, there's, there's four, four abstract types in, in Python
for numbers. There's complex, real, rational, and integral. So complex is the complex that most of them
only have one type in it. Complex, the, abstract type of complex has complex. Real has float.
Rational has fraction, but integral has both int and bool. So that's neat. their bool and ints are
related. And then, but then we also have these, decimals. yeah. So there's, I wanted to find
his stuff on decimal. Decimals don't fit. So decimals have their, they're not really part of this hierarchy
at all, but they're, they're their own decimal class. So there's not, there's not an abstract class,
but that's okay. Decimals are great. And people should remember decimal is around if you have,
um, if you're working with money or something like that, use super precise science. so yeah,
these are good. also, because these are just normal types, numbers are extensible. Oh,
yeah. A comment about floats are weird. Yeah. those are always weird. Those are weird. Yeah.
The numbers are extensible since these are class classes. You can, you can derive from them.
but he comments, which is good. You have to be really careful because if you, want to extend
a class, there's a whole bunch of dunder methods that you have to make sure work right. So maybe you
don't want to extend it, but you can, you can make your own numeric types. So just the third thing.
Anyway, kind of a neat article. I'm trying to wonder what you might actually create those for. I mean,
maybe you might, well, maybe we'll create an integer that has a bounds and is an error if you try to make
one too large or something. Yeah. I'm not sure. But there's cases.
I'm thinking on the spot here. Yeah. Yeah. another thing that's amazing is a complex numbers
are natively built into Python. Yeah. And that's, that's really great. And that's essential for a
lot of scientific and, and you know, measurement work and stuff is to have complex numbers around.
They're truly amazing. All right. Well, I think that's all. I mean, I already did my extras. I
skipped your set here, your articles to ask you about your extras. Do you have any actual extras you
want to cover? I don't have any actual extras. Have you had any dangerous encounters with like
warm water? Have you maybe stubbed your toe on a rock or was there a turtle that came by or
well, so they run into it like an eel. There are eels in the core in the reefs there that you
might want to stay. So I've, I've only been here a couple of days so far. We've been, I've been swimming
a couple of times right out, right. Like you can, you have to look down, not across to see the beach from,
from where I'm staying. and so I went swimming right here. it's got, it's kind of fun because
it drops off right away. So there's a little beach and then it drops, it drops deeper right away.
And that's, but it's not like a big current. So you can swim really with only going out a few feet,
which is nice. And then we went to another beach that was like shallow for a long time,
but then it had coral and stuff. And that was really fun to scuba diet or to not scuba, but,
snorkel over, and look around. But if you're just wanting to walk out,
that coral is like tough to walk on and it hurts. Yeah. That stuff's super sharp. Yeah. But
having, having a lot of fun. Awesome. Good to hear. Well, I think we should round it out with,
uh, one or two things here. We got, some jokes. Now I saw Josh out in the audience and he sent in
some jokes, which we'll make part of this soon, but, I didn't have time for this episode. So we got
four. Oh, really? Book covers. I love these. Not the O'Reilly. Cause you know, the O'Reilly books,
they always have an animal and a title and whatnot. So, oh, really are takes that kind of,
puts a funny spin on it. I'll do this first one. We got 40. Maybe we could do two each. So the
first one here has a platypus on the screen. It says the little subtitle is the quote is the original
developer isn't here for a reason. And the title is losing your will to live a code maintenance guide.
Yes. Written, written by the intern.
The intern. All right. You want to take this one? so the title is, expert vague
understanding of computer science, probably be able to explain a sorting algorithm if it ever comes up.
by the practical dev. Yeah. By the practical dev. Very good. Very good. Okay. The next one
is an elephant. Very proud speaking out loudly. It depends. The definitive guide, the answer to
every programming question ever conceived. It's a short book. Exactly. All right. bring it,
bring us home with this last one. Okay. So, works on my machine, the definitive guide,
how to convince your manager. yeah, I love it. Very good. Very good. Yeah. Well,
Brian, everyone listening, almost everyone is jealous. I'm sure there's some people in Hawaii,
like, yeah, I just go there every day, but most other people are probably jealous,
where you get the record from today. So thanks for making the time. Thank you. it's fun.
Always fun to be here with a Python bytes people. Thanks for listening to Python bytes. Follow the
show on Twitter via at Python bytes. That's Python bytes as in B Y T E S. Get the full show notes over at
Python bytes. If you have a news item we should cover, just visit Python bytes.fm 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
Brian Okken, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and