Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
your earbuds. This is episode 208, recorded November 11th, 2020. I am Brian Okken.
And I'm Michael Kennedy.
And it's getting cold outside.
It is getting cold outside. I feel like winter is coming. I went out on the deck and I'm like,
well, there's something wrong with my deck. It's really slippery. Oh, that's ice.
What a weird time of year it is.
Who do I call to get this fixed?
Exactly.
There's got to be some sort of contractor I can get to.
I'm sure there's something wrong with the sun. We're going to need some help here.
Yeah. This episode is brought to you by us. We'll tell you more about what we're
doing other than how you can support us a little later. But first, I want to,
speaking of cold, I want to talk about something called pip Chill.
Ooh, icy.
Have you heard of this before?
I have heard of this. I've just heard of it, but it looks fantastic.
Yeah.
This drives me crazy. This whole new change with Pip, where pip is super,
super picky about the dependencies and then having things like Dependabot or other automatic
tooling upgrade stuff as things come out. If they ever get out of sync, then pip will break in some
ways. Like for example, Boto 3 and Boto Core have been driving me crazy. And it sounds like this would
fix it.
Normally you build up, you've got like a requirements.txt file, or you've got your, the versions that
you're working with, you want to put those in a setup or some sort of way to capture it.
One of the ways you can do that is pip Freeze. And if you already have an environment, like a virtual
environment set up, with everything you need, you say pip Freeze, it spits out all of the things that
you have installed and all the versions that you've got. Now there's different variants that you can do with
Pip Freeze also.
You know, people often talk about that as having stability. Like you don't accidentally get a
change that's pushed in the future that's a breaking change. And to me, I never appreciated that.
Like that never seemed to be something I cared about. But once things like GitHub started saying,
there's a new version of this, or the thing you have installed, there's a security vulnerability
that if you don't upgrade, you're subject to on the web, which is a bad place to be. Then putting
that version information in there explicitly allowed me to know, oh, I need to go and update the server
because there's this critical vulnerability that GitHub told me about. That's what won me over to
putting the pip Freeze style with versions in there.
Oh yeah.
Yeah.
And I think that's good. But you might want to just have the version, the thing that you're
really using. Like, let's say you're using black. Do you want to list black or do you want to list
black and all of its dependencies?
Yeah, exactly.
And Freeze just gives you everything. And so what pip Chill does is it just shows you the stuff that you
installed. So like, let's say if you installed just black and you ran pip Freeze, you'd see a whole
bunch of stuff. But if you run, if you now install pip Chill, Pip-Chill and run pip Chill, you'll get
Pip Chill also. It'll tell you that it's there. But it also just shows you black and what version of
black you have. So if you've, you're hopefully black itself is specifying enough dependencies that make
sense. There's definitely times where you want to have everything, all the versions nailed down,
like you said, for security updates and stuff like that. But there's a whole bunch of times where,
like for instance, I've got internal projects where we actually have, we actually vet all of the
versions and put them in a different repository, but different combinations. We want, you don't need
to be that specific. So pip Chill is a way to just list the ones that you've installed. And I think
it's really cool.
I think it's really cool too. One of the things that's neat is it toggles between this, here's what
you installed and here's everything, which is what you're talking about with pip Freeze. But there's
another mode where you do dash V and it'll show you the stuff you installed. And then it'll show you
commented out, but present. These are all the things, the libraries and their dependent,
their versions that were installed, but are not top level. So they're commented out.
And then there's a little comment like installed as a dependency of Jinja2 time or installed as a
dependency of cookie cutter. So you can do that to get a look and say, Hey, well, what is my virtual
directory look like? Why is this thing here? Oh, I see. It came from this other place.
Yeah. And then also if you, you can have that with or without versions. And so you can,
if you know, there's a dependency vulnerability for particular thing, you can say, well, which,
what version am I getting? So yeah, it's good. Yeah. Yeah. This is really nice. I'm liking it.
You've got like a version checker thing that tells you if there's like vulnerabilities, right?
Yes. What are you using? Well, if for vulnerabilities, I think just having a pinned
version in a requirements.txt file is sufficient for GitHub to say there's a problem. So like any
requirement file is pinned. But if you sign up with dependabot, which is, there's some things that are
super, super annoying about dependabot. But what is nice is that it will show you anytime there's a
thing. So you say like a weekly notify me of updates to my requirements file. And so every Monday
morning I get a list of like, here are the updates that I could upgrade for like my web framework or
database access or whatever. And like put in the automatic PR for it. It'll show you like the change
log and then you can accept that and it'll update your, your requirements. Yeah. Okay. And then
there's also a workflow that some people use that have a, like a smaller, like a requirements in or
something. It's just a list of list of packages that are using, and then they'll just get the latest
of whatever those few things and then test it and then freeze it. So you've got like a, like a two stage
thing. So you, the, what you deploy is a frozen set of package lists, but, and all the versions, but
you've got some other way to do just how to generate that, which ones you should install.
So, right. Yeah. Yeah. That's an interesting way to do it. Cause then you basically have just pypi and pip
just giving you the latest. Yeah. Yeah. Just to round out the thing that is super duper annoying about
dependabot is like on Talk Python Training, that site has 30, 40 packages. It's using. If you count up the
dependencies, pip freeze, not pip jail freeze. And every change is its own PR. And I swear almost
weekly, I am merging, I'm manually merging merge conflicts between dependabot and dependabot. It's
like, well, this requirement line and that requirement line changed. And like, they won't give it to you as
one, just here's the changes for the week. It's like, no, no, no. Here's a bunch of changes and
you'll probably be in here merging this manually. So enjoy that. Anyway, it's still really cool to have
it automatically. I do like this idea of it just kind of like some part of the CI going,
this is what I depend upon, install what I need, generate the pinned versions. Cause then when you
go to production, you say install pip dash R, it will actually, you know, upgrade the stuff that
needs upgrading rather than fulfilled. One of the requests I have for the people working on pip chill
is I think an option to not list itself would be good because I'm just installing it so I can run it.
That actually makes a lot of sense to just omit self.
You can like pipe it through a dash V or something, but maybe it's like some kind of worm and its goal is to just get into all projects. And by listing itself, it's just going to slowly make its way out.
Speaking of problems you might want to avoid, not that that is one, but one that you might is if you work on windows, which from the stack of workflow survey and the PSF survey, we found a very significant number of people in the Python space do that.
And I've heard people in Python talk about this thing called numpy. You heard of numpy?
No, numpy is something that definitely is the foundation of the many, many, many data science libraries, right?
Well, big news sent in by Daniel Mulkey. Recent windows update broke open BLAS, which is a dependency of numpy.
Speaking of dependencies. So effectively, if that doesn't work, numpy doesn't work. That sounds less good.
Yeah.
Yeah. So there's a whole long developer community thread. I mean, long, we'll talking about it, suggesting fixes that may or may not be fixes, et cetera, et cetera.
It starts like this. I'll just read the quick overview. So people know what to be on the lookout for.
I'm a numpy developer. We've been trying to track down some strange issues where after updating to windows 10 to zero zero four, suddenly code that worked no longer works.
Here's the numpy issue and the corresponding issue in open BLAS. The problem can be summarized as when calling F mod, something is changed so that much later calling open BLAS assembly routine fails.
And we're way down here, Brian. The only difference I can see is that in the register that Visual Studio exposes after the call to F mod, ST zero is NAN.
Don't bug that people.
Yeah.
Jeez.
But the fact that it doesn't work is not ideal. So Steve Dower and some of the other Microsoft people commented there, there's a fix later to take until January, 2021 to be released.
But Matt P posted a workaround says for all of those at home following along and looking for a quick fix. NumPy has released a bug fix.
One 19 three to work around this issue. The bug fix broke something else on Linux. So we had to revert the fix in release.
One 19 four. So the fix on Windows that work around on Windows broke the Linux version. But as a Windows person, you may not care.
So on Windows, you could pin it numpy equal equal equal one dot 19 dot three for now and just don't put that into production on Linux. Sounds easy enough, I guess.
Yeah. I mean, if you're a package maintainer, this seems ugly. But if you're like an end user, I'm either installing it on Windows or I'm installing on Linux. It's not a problem.
Yeah. I don't know if pip actually has a platform flag like pip in the that are, you know, the requirements. Can you specify this platform gets this requirement that platform gets I'm guessing no?
Well, no. I mean, it's part of the wheel. So the wheels can say this wheel is appropriate for only certain platforms.
Yeah. But if you're building an application, not something that's on pip. Yeah, I don't know. I don't know how to do it. But you can. This is like a fix. But just be aware that that will make it not work on Linux. So yeah.
Anyway, I just want to put this on people's radar. So they're not down looking at registers going, why is ST0? Man, that's odd.
I'm glad I don't have to do things like that.
We can all be thankful we don't have to do things like that. I mean, that's why we work in Python, right?
Well, let's reverse it. I'm really grateful that other people are looking at that. So I don't have to.
Yes. Thank you, people. Speaking of thank you, Brian and I are both doing a bunch of stuff online and people often ask how they can support us, support the podcast and just get better at Python.
And we're trying to help people do that, right, Brian?
We are. Yeah, lots of ways. One of the things we're doing is this podcast. I mean, if people want to just support us directly, there's a Patreon link in all of the show notes. You can donate. We have like 60. I just checked. We have 65 people doing this now. That's awesome. Thank you, everyone.
And you're teaching some classes.
I am. The most recent one that I worked on should maybe, maybe be on. It's completely done. I just put my head down and did the whole thing. It was like a four and a half hour FastAPI course for building APIs with FastAPI.
So I'm really excited about that one. And hopefully it may even be out. But people can just talk out, check out training.talkpython.fm. And it'll be over there soon if it's not by the time you hear this.
Yeah. Nice. Indeed. I'll just keep plugging away at it, man.
Just keep plugging away.
This is going to be the 30th course that we've created over there. And we're not done. We're going to keep plugging away.
Keep plugging. Maybe you need a plug-in architecture.
Maybe I do. Tell me about it.
Well, so one of the things I love about pytest is the plug-in system. So you can, I mean, plug-ins can provide extra fixtures, extra flags. They can modify the output. They can do all sorts of fun things.
Anyway, the plug-in architecture that pytest uses is not built into pytest. It's something called Pluggy.
And there weren't, I mean, there are a couple little how-to guides, but they were kind of sparse and I was having trouble.
I wanted to do a plug-in in a little application before and struggled.
But now here's apparently two Python talks.
One of them held at PyGotham and one at PyCon India and an article around it.
So the article is build plug-ins with Pluggy.
It's kind of a nice article. It starts with a small command line application that you, it like looks for books or something.
And it has one output format.
And the argument is like, wouldn't it be cool if you could have more different kinds of output?
And one of the ways to do that in an application is to have allow plugins so that anybody can extend the application to look for a different format.
Yeah, one thing that's really nice about that is you don't have to understand the whole program and all the code to like contribute to it.
You just have to understand that little tiny plug-in interface.
And if you can handle that, then you basically can extend the app.
Yeah, and one of the beauties of those sorts of things.
So I've written plugins for pytest and I don't understand the internal architecture of pytest.
And I don't really understand how to do the plug-in system that well.
I mean, pretty good.
But you can take something that's already done and copy it.
So you can say, oh, here's another one that also changes the output.
I want to, I can copy that and change it myself.
Yeah, nice.
Yeah.
This is kind of how that works.
It took part of the system of the application.
And he walks through how you would change the architecture to instead of doing the formatting internal, you could do it as a plugin.
And then it talks about the different architecture of Pluggy because you've got a host and a plugin and hooks and hooks specs and all sorts of stuff like that.
And it's actually easy to get lost through this if you're just reading it.
But I suggest walking through the code as he's doing it and actually running the stuff and looking at it.
And there's not really any super easy ways to do plugin systems in Python.
I don't know if any language has a better system.
But plugin is pretty good.
If you follow along, you can kind of get with it.
Yeah, very cool.
I haven't looked to see if the talks are online yet, but I'm looking forward to watching this if they do go up.
I suspect they probably will in the modern age of everything being online.
Yes.
Yeah, probably.
Awesome.
So let me talk about a little query syntax that I've been wanting in the Python space for a long time.
And you almost have it.
It's so close in some ways, but so far in others.
For example, with list comprehensions, generator expressions, all those types of things, we can do a lot of in-memory data-like things, right?
We could go and say, if I got a list of numbers, I could get the square of the number for all the numbers.
If the number is like, you know, every number that's odd or, you know, some weird thing like that, right?
That's sort of a query type of thing.
There's like a where clause.
There's a from clause.
There's a select transformation bit.
You could even do like paging with slices on the end of it.
So like skip three pages of five.
So, you know, slice 10 comma 15 or something like that.
Except there's a few things that are just not there.
The one that drives me the craziest the most is like a sorting, by the way.
Like if you could just do like an order by in a list comprehension.
Oh, that would be nice, but you can't.
And you also can't put a dot sort on the end because that returns none.
So if there was some way to put like a little bit more together, that would be great.
And one of the probably the best implementations of this, I would say across all the languages,
is this thing called link, language integrated query in C#.
Yeah.
And I know it's not about C#, but studying that there's a really interesting way of basically
taking lambda expressions, applying them to collections and doing those database like things,
but much more where you can do like joins and you can do other sorts of operations that are
like paging or like filtering by type and all kinds of neat stuff there.
So Adam sent over this project that he ran across called link it, which adds link type of
in memory query syntax, like almost database syntax to Python lists.
Okay.
So like, for example, if you had a list of programmers, you could say programmers where
E, you know, lambda V goes to eat out experience grade in 15, except for Elon Musk, where it's
the type of this type of a person for, you know, category of developer take three to get only
three of them skip.
You know, you could skip like two times three to skip two pages and three to get the third
page of them.
You could select just out there variables and then apply more queries to that and do this
really cool fluent interface on top of these collections, which I think is just super neat.
And I really like this interface.
So if people like this fluent style programming and they kind of think in data database type
of thinking, here's a really cool way to apply that to Python.
This is kind of cool.
Yeah.
I like it a lot too.
I like it a whole lot.
So previously, and by previously, I mean, really previously, I don't remember exactly.
Let me see.
Use our little search over at Python bytes back in episode one Oh six.
So what is that like three, four years ago or something like that?
We talked about this thing called ASQ from 60 North, which is a cool project by, well,
the guys at 60 North who do a lot in Python.
And it basically is a similar type of thing.
It adds link queries to it.
But one I didn't like what didn't spark joy in me, I guess on that one is you had to like
convert everything to this query object.
And then you could do queries on it that you could convert it back to a list, which is like
so close, you know, but what's neat about this other project, this link it project is it is
the things that you do the queries against are a super class of list or derived from list.
So anytime a list is expected anywhere, you could just pass the result of this around.
You could do like conversions like now it's a queryable thing.
Oh, now it's not anymore.
Now it is again.
Right.
It's kind of always this thing that can stand in as a list, but actually has this query
capability, which sounds minor, but it seems like a big usability benefit actually.
Yeah, definitely.
Because yeah, you want to be able to write functions that can return this and send it to
maybe you want one of these objects again, so you can do further queries.
Exactly.
Or you can pass it to something that expects a list.
That's good.
Yeah, it's pretty good.
And if you want to upgrade a regular list to a list, you just, you know, pass it to the
constructor of this like derived list thing.
And then now it's like this queryable list.
So it's not quite as nice as some of the like true language built in functionality.
But still, this is quite neat, actually.
Yeah, I think I'll play with it because I think that there's some use cases that aren't obvious
until you start playing with it.
And it's really legible, right?
Like I would like to from this group where these are true, select this thing where that
is true about the sub thing you got, right?
Like it's it's a pretty natural way of reading codes.
I kind of like it.
Yeah, I'm just chuckling about your example, though.
I'm sure you didn't make it up.
But no, this comes from the documentation.
What is it?
So I've got programmers.
I'm looking for somebody with greater than 15 years of experience.
I don't want to Elon Musk.
Something AV type.
I don't know what that is.
Yeah, I don't know what that is either.
Take three random people, I guess.
That's the first three.
It's like limit three.
Yeah, the first three.
If there could be thousands, just give me the first three.
First three.
Find out what they had for lunch.
And if it was a hot lunch and it was not from Pizza Hut, get the last one and get the
last slice of the pizza by the.
Yeah.
So what do you end up with?
I believe it's a list of pizza slices which correspond to the last slice of pizza each
programmer ate.
Oh, OK.
I think I haven't read it yet.
I got to write some code to make that happen.
But yeah, I think that's what you end up with.
Yeah.
OK.
Cool.
Anyway, yeah, pretty neat.
But this idea of having this sort of natural query language that mimics databases but is
in memory.
Could have some legs.
I like it.
Yeah.
What you got for the last one here?
The last one of yours?
Well, this one is, I just thought we should announce this because it sounded pretty neat.
Although the details of it are a little over my head.
But so there's a Spotify deals with music, right?
Yes.
Probably a lot of music.
So one of the things they talked about, and I'm going to cut to the chase, it's an application
or a framework called Clio.
I think I'm pronouncing that right.
K-L-I-O.
For processing audio files or they say any large or any binary files, especially large ones at
scale.
Things like, you know, maybe like pictures or any other binary data.
Anyway, so it's an application.
It's used for pipelines.
It's intended for large-scale input and output of all these files, scalability, reproducibility,
working with pipelines and streaming and batching.
And to try to get it to be easy to use and easy to read so that you can have a close collaboration
between researchers and engineers.
It's Python-based.
It looks pretty cool.
And for a lot of people doing research and data pipelines for these either audio files or
vision or pictures or something like that, this might be cool.
Yeah, it could be all sorts of stuff, right?
I can imagine anytime there's a bunch of computation and a bunch of steps, people collecting the
data, someone's going to analyze the output on the other end.
It might be a pretty neat use case.
Apparently, it's built on top of Apache Beam.
And so it's also cloud agnostic.
It's intended to work with cloud services, but you can use lots of different ones.
I'm linking to a couple announcements and an article about it.
It looks like a large effort and probably a large effort for Spotify to make it open source.
I think that's pretty cool that they're trying to have this be around.
One of the articles says this might be useful for people doing, like even comparing, you know,
dolphin songs or something.
There's a lot more use cases other than just music to deal with audio files.
And it's kind of neat.
Yeah, quite cool.
Is this the project that Lynn Root was working on?
I saw her posting about, I think it was her.
She was posting about something.
I don't know.
Anyway, it looks like a really cool project from Spotify.
Does she work on Spotify?
She used to.
I think she still does.
I just tried to pull up her GitHub repo, but I couldn't find it.
Her Twitter account, but I couldn't find it for some reason.
Anyway, yeah, this is neat.
I'm a little bit surprised they open source this, but at the same time, it seems useful.
Why are you surprised?
This seems fairly proprietary?
No, no, it seems, I guess, like a little mix of a somewhat specialized for their world a little bit.
And then, you know, not at all related to like what Spotify does.
You know, like it's not, I don't know.
It doesn't seem like it feeds back anything to Spotify necessarily.
But I mean, it definitely looks useful.
So quite cool.
Okay.
Yeah.
Nice.
And nice to see Spotify doing that.
Also nice is getting feedback from listeners, right?
Yes.
Say like a good quarter of our entire history of our show has been like, and did you know about this?
I'm sure you do.
You just didn't cover it.
No, we didn't know about that.
But thank you.
Now we do.
And so Marco Gorelli sent in something and says, hey, recently you mentioned that it would be really cool if you could have a Jupyter notebook that just was more of a report thing.
You could reveal the code, but by default, the code cells are collapsed and hidden.
So you can just go through it.
And if you say like, oh, I actually want to see the code for this particular part, show me.
Yeah.
So he sent in article, I guess, walking through how you would do that with a notebook.
So he's like, hey, I actually wrote something about that.
So here you go.
In case people care about that.
So the idea is basically set up a Jupyter notebook.
I'm reading this right.
Set up a Jupyter notebook.
You can tell it to build an HTML file that is like a static HTML file with all the data that's in there.
Or to save like you would see on GitHub or something where it's not actually live and computed, but you see the output and you see the cells.
Right.
And then go tweak that HTML file.
I think you tweak the HTML file to just add a little bit of code that will use some JavaScript to collapse those.
So then you can just share that HTML file and people can toggle stuff open and closed and they get more of an article style output.
Oh, nice.
Yeah.
So nothing super deep or whatever, but it sounds like you're in that space.
You're like, I really wish I could share this notebook.
But that 30 lines of Python, it needs to be there.
But it's not exactly what I want people to see.
I just want them to see the steps.
I think this is pretty neat.
Oh, that's cool.
Yeah.
Definitely useful.
Short and sweet, indeed.
I love it when that happens.
When people, we come up with, we're like, I wish this could do this.
I wish this existed.
Did you know it does?
It does.
Yeah.
Exactly.
Well, that's our six items.
Do you have anything extra to talk about?
I do have a couple of things that are all small little things.
One, there was this tweet I was mentioned in.
Let me just read the tweet to you.
And you just tell me how you feel about this.
Okay.
So Michelle A. Renard tweeted,
The difference between Western and Chinese societies can be compared to M. Kennedy's difference
between Software 1.0 and Software 2.0.
And it links to the Sanders Media Showdown article.
What?
So I saw this.
I was like, okay, this is weird.
Like we get copied and all sorts of things.
Like, hey, we're going to copy 20 people that talk about stuff on Twitter because we publish
this article and we want you to cover it.
And I'm always like, yeah, not so much.
But if you hover over this, it says, this is actually an AI bot pundit trained to sound
informed and profound.
The content mine, the links is popular and no tweet is the opinion of the author of the bot.
I just thought it was really weird that there's like this AI bot going around on the internet,
using like machine learning and stuff to just randomly be a pundit.
Weird, right?
Yeah.
Anyway, Michelle A. Renard is out there.
People do all sorts of weird stuff on Twitter.
Yeah.
But randomly like mentioning just other random people on the internet, like, hey, that person
over here, we're going to compare.
Anyway, I just thought it was funny and amusing.
So I put it up there.
Yeah.
It would have been even, I guess, more to the point if they would have said the difference
between like Python 2 and Python 3.
I know.
Well, I'd be one of the bot.
Even if it was software 2 and software 3, it would have been closer.
Yeah.
Pound software.
Yeah.
Hashtag software.
And also, Apple just had their big event a little bit ago.
Have you got your new Silicon Mac?
Have you ordered it?
Silicon Mac?
No.
Apple Silicon?
No, I have not.
No.
Have you?
I ordered a new Mac.
I actually was thinking about getting one of those, which was really interesting because
it's just, I think it's going to have a lot of knock-on implications.
Like, for example, if you're shipping C code as part of, say, like a wheel, will it also,
do you now have to deal with like different platforms on the Mac?
Will your package actually work on a Silicon Mac?
I don't know.
I don't either.
But it's going to be interesting.
I mean, the stuff needs recompiled.
So I'm mostly wondering what these Apple Silicon Macs will mean for Python and its packaging
ecosystem.
Are we going to run into a place where like, well, you can't use NumPy on the new Macs
for like three months?
I have an idea.
Okay.
I think if we get a whole bunch of Patreon followers, they can help us buy each of us
one of these things.
And then we can test stuff for people.
Yeah, there you go.
Perfect.
Actually, I did buy a new-ish 16-inch MacBook Pro that's still Intel because I was hoping
to get one of these new shiny ones.
But, well, if you're not going to make a new one, my current Mac is sort of dying.
So I'm going to have to buy something.
So actually, the whole talk about that actually encouraged me to buy not the Apple Silicon
one.
But I'm pretty excited to see where that goes.
They've got some like huge ML performance speed ups and a lot of interesting things.
Like the new MacBook Pro, I think, has 17 hours of battery life, 20 for video playback or
something insane like that.
That's incredible.
I've got like six.
I know.
The MacBook Air doesn't even have a fan.
Like it literally, it can't make a sound because it has no mechanical pieces besides typing,
I guess.
Anyway, just wanted to shout that out, put that out there and see what people thought
about the new Apple Silicon being like a different app compilation type and what that's going
to mean for Python and think about it.
I mean, I guess it really comes down to what happens to CPython, right?
Because it'll run under emulation mode if it's not.
But if they upgrade CPython to run natively on Apple Silicon, then what does that mean for
packaging?
Could be like a whole deal.
I don't know.
Yeah.
A whole big thing.
Yeah.
Hopefully not.
You shouldn't joke about it though.
It's not funny.
Everything's funny.
All right.
Then tell us a joke.
This was sent to us.
Not sent to us.
It was just sent out by Data.
D-E-T-A-H-Q.
It's a new database.
They're doing some interesting things.
They just posted out 10 E engineers are the future.
So engineers with 10 E's.
Beautiful.
I've got one for you as well.
This one comes to us by Richard Carnes.
I don't know.
This one's a little bit political, but we could probably pull it off, don't you think?
A little sensitive.
Anyway, why did the data scientist get in trouble with animal welfare?
Because she was caught trying to import pandas.
Oh, dear.
Pretty good, right?
Yeah.
Thanks, Richard, for writing that one for us.
That was a good one.
Caught trying to import pandas.
You know it's SPD.
Come on.
Oh, that's funny.
Indeed.
Well, thanks again, Michael.
Yeah.
It's fun as always.
Same time next week.
Yeah.
I'll do it again.
Bye.
See y'all.
Thank you for listening to Python Bytes.
Follow the show on Twitter at Python Bytes.
That's Python Bytes as in B-Y-T-E-S.
And get the full show notes at Pythonbytes.fm.
If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.
We're always on the lookout for sharing something cool.
This is Brian Okken, and on behalf of myself and Michael Kennedy, thank you for listening
and sharing this podcast with your friends and colleagues.