Python Bytes - #267 Python on the beach
Episode Date: January 21, 2022Topics covered in this episode: Box: Python dictionaries with advanced dot notation access Reading tracebacks in Python Raspberry Pi: These two new devices just went live on the International Space... Station Make Simple Mocks With SimpleNamespace * Extra, extra, exta* 3 Things You Might Not Know About Numbers in Python Extras Joke See the full show notes for this episode on the website at pythonbytes.fm/267
Transcript
Discussion (0)
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 TalkPython 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 TalkPython Training.
Visit them via pythonbytes.fm slash courses.
And if you're looking to do testing
and get better with PyTest,
check out Brian's book at pythonbytes. 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 Akin.
I'm Michael Kennedy.
I've got kind of a, 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, uh, yeah, I'm looking out. I'm so 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 dunderdict, 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 get the values of
the dictionary in the same way that we do have a class. A class, you say thing.field. Well,
wouldn't it be nice if you could go to your dictionary and say it has a key.name, so just
d.name to access it. That's the basic idea behind this thing called Box by C.D. 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 of spaces and colon. 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.
Oh, 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.
It'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 because I want to add up things or create start with
a number zero because 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 a default dictionary. They call that a default box, which is cool.
And it can also do what it calls 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 sharp here where it's not lowercase and underscores is the separator, but 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 name.
I mean, kinda. Frozen box.
I would, it's a fun thing.
I personally wouldn't recommend it
because then your code,
it's hard to look up the documentation
because it'll be wrong, things like that.
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 if you put in strings to this key
and 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.
Uh, 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 times where I've really 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 um 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 own 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
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 right out there points out that the setting default box is not the default
setting which is pretty awesome yeah chris Chris May points out that for this,
someone needs to think outside this package to get something,
outside the box, right, to get something really amazing.
And just, you know,
Brandon Branner is a little bit jealous of your green screen.
Hey, Brandon's the one I had as a guest for Testing Code recently.
Hi, Brandon.
Right on.
Yeah, very cool.
All right.
What's next?
What's next is mocking, sort of mocking.
So Adam Johnson has an article called
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? Yeah, let's just cover this one need my notes never mind um so adam's
actually been crushing it lately he's got a lot of recent blog posts so good job adam um the uh
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 uh which that's cool but one of the things so it's like normally we use unit test mock um 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.
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 if you have a known object that you're mocking,
you use specs and 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 uh of like testing this
would be for a fake or a stub uh not really a mock because you don't interrogate it but if you just
need to fill it have something that that uh you know walks like a duck and quacks like a duck
you can use one of these to create a duck um 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 um like it so uh when he has a
is a great quote it's as simple as possible with no faff around being callable or tracking usage
or something so um in in a lot of sometimes with mocks you uh 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 you set it up with the attributes you want, pass through, and it's just pretty neat.
I'm going to use these all the time now.
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 ZDNet talking about
Raspberry Pis. So apparently the European Space Agency has uploaded and installed and configured two new Raspberry Pis.
And not just any Raspberry Pis.
They're these, what is it, Astro Pi?
That's what it is.
These are regular Raspberry Pi 4 boards, Model Bs with 8 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 AstroPie Challenge,
which is like an education-focused competition or startup or whatever.
Okay.
Yeah.
Very cool.
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?
And Raspberry Pis.
I know.
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 science-y things.
I mean, when I was a kid, the science fair was like, well, let's make a little volcano
that erupts and like oozes stuff out of paper mache.
And, you know, these kids get to write 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 that I've never done the volcano thing, though. I kind of 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 Pis.
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 just 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 coders have to deal with,
and unfortunately it's hard to tell them ahead of time
how to deal with it, is tracebacks.
So tracebacks are just part of life with coding.
And Trey Hunter has an article called
Reading Tracebacks in Python.
And it's a really
great simple introduction i love it um one of the things i want to comment on is um 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, right after the hello world. But seriously, tracebacks happen so fast.
And when you start coding,
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,
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 a traceback
is the error message let's uh scroll to one on here which is good to know because that's not
true for other programming languages the error is at at the top and it's kind of inverted.
Oh, really?
Yeah.
I forget.
But, yeah.
So the last line is the exception and then also the message for the exception if it's there.
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.
Um, and if, and that's, that's the place where the exception actually happened.
And these two double things, these two lines, the line is called, um, uh, what do you call
it?
They're the, uh, stack trace the stack, whatever.
Yeah.
Call stack.
Yeah.
It's, this is the call stack.
Um, and that's even more so because you get lines
within functions right not just the yeah yeah and then uh um 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 the
exception happened not in your code but in some some 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 um 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 um the fact that so this is the the example has a type
error because you can't concatenate a string to an integer um and that's weird because it doesn't
look like it's trying to do that but uh then he walks up to find out that the the function is
actually taking the standard input um and passing it in as a number and one of the argvs,
and you have to convert it to an int first.
So that's a, I'm glad you used that example
because people new to command line interface coding
often forget that, that the input is usually a string,
even though if you pass in a five,
it's still gonna 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 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 traceback
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.
Nice picture.
Yes.
So you and 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, Marek Squires,
first they thought it was a supply chain vulnerability
and somebody hacked the account.
But it turns out, no, no, no.
Marek intentionally corrupted both of his libraries.
So they ran an endless loop
spitting out random political messages
while it would loop around
and just fill the screen with garbage.
So initially he 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 Myrick Squires
seems to be the same fellow who sabotaged
two of his own popular open source libraries the next week.
And he links to an article in my post,
residents of Queen home with suspected bomb making materials
charged for some sort of like terrorism type of thing.
So the same person who sabotaged 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?
Yeah, weird.
Yeah, yeah, very weird.
Oh, I also forgot to point out, this is an extra, extra, extra section.
So short, 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.
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 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 uh 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 reload the page and it changes and all that so quick tip for
people there who do web stuff python 310.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.
Fix memory leak in pyval.evalcodex.
That sounds like it might be used a lot of places.
And used in 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 running production,
and 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 things.
Related.
I'm doing a YouTube series
on a bunch of little short Python lessons
and I've got about 100 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 make this a 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 in 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's fun.
Cool.
How do you find time for all this stuff, Michael?
You're like everywhere.
I've been wanting to do some of these YouTube videos and just try and explore some of the ways
in which people are 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 um 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.
I pulled up the wrong link.
I decided to see what you could do
around 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 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 not youtube uh github profile
um repository where it has all the profiles for uh 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 are three things you might not know
about numbers and in python and uh 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 um uh there's a good chance that you've used a number
in one of your programs yeah i think so this so. This is, I could get behind that statement.
Yeah, so one of the things that,
like strings have functions attached to them.
They've got methods.
And we know that.
It's kind of different than other languages,
but numbers do too.
And this is something actually didn't occur to me
that you can do like two bytes and stuff.
So 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 uh to bytes or something like that so there's uh 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 like a,
is an integer or is integer ratio or as integer ratio.
So it'll convert it to an integer ratio.
That's pretty cool.
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 have no idea about this stuff. Yeah. I've got a bunch, there, yeah, I don't have that example pulled up.
No, but that's cool.
I have no idea about this stuff.
Yeah, I've got a bunch.
There'll be some links in the show notes to the Python documentation for these.
It's pretty nice.
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 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 four
abstract types in Python for numbers. There's complex,
real, rational, and integral. So complex is
the complex.
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.
But then we also have these decimalsimals um 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 uh there's not
an abstract class but that's okay decimals are great and people should remember decimal is around
if you have around if you
have um if you're working with money or something like that use super precise science um so yeah
these are good uh also uh because these are just normal types um numbers are extensible oh yeah
a comment about floats are weird yes um those are always weird floats are weird yeah the numbers are extensible since
these are classes you can you can derive from them uh but he comments which is good you have
to be really careful because if you uh 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 this is the third thing.
Anyway, kind of a neat article. 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 complex numbers are natively built into Python.
Yeah, and that's really great.
And that's essential for a lot of scientific
and 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 you could run into like an eel? There are eels in the reefs there that you might want to stay with.
So I've only been here a couple days so far.
I've been swimming a couple times right out.
You have to look down, not across, to see the beach from where I'm staying.
And so I went swimming right here.
It's kind of fun because it drops off right away.
So there's a little beach, and then 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 dive or to not scuba but uh
snorkel over uh and look around but if you're just wanting to walk out,
that coral's like tough to walk on and it hurts.
Yeah, that stuff's super sharp.
But having a lot of fun.
Awesome. Good to hear.
Well, I think we should round it out with 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 because you know, the O'Reilly books, they always have an animal and a title
and whatnot. So, oh really art takes that kind of puts a funny spin on it. I'll do this first one.
We got 40, we could do two each.
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 by the intern.
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 yes it depends the definitive guide the answer to every programming
question ever conceived it's a short book exactly all right uh bring it bring us home with this last
one okay so uh works on my machine uh the definitive guide
how to convince your manager uh 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 people are probably jealous where you get to record from today.
So thanks for making the time.
Thank you.
It's always fun to be here with the 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 PythonBytes.fm.
If you have a news item we should cover,
just visit PythonBytes.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 Livestream
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 Ocken, this is Michael Kennedy.
Thank you for listening and sharing this podcast with your friends and colleagues.