Python Bytes - #422 You need 4 spaces
Episode Date: March 3, 2025Topics covered in this episode: My 2025 uv-based Python Project Layout for Production Apps aiolimiter A peek into a possible future of Python in the browser Reloadium Extras Joke Watch on YouTube ... About the show Sponsored by us! Support our work through: Our courses at Talk Python Training The Complete pytest Course Patreon Supporters Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Brian #1: My 2025 uv-based Python Project Layout for Production Apps Hynek Schlawack Discusses uv, a simple pyproject.toml, a simple project layout, and uv.lock as the modern way to ditch requirements.txt files This is the starting video in a series, but it’s already very worthwhile Michael #2: aiolimiter An efficient implementation of a rate limiter for asyncio. This project implements the Leaky bucket algorithm, giving you precise control over the rate a code section can be entered. Brian #3: A peek into a possible future of Python in the browser a.k.a “Secret SPy Stuff” Łukasz Langa A peek at SPy, a new language for Python on the web. Michael #4: Reloadium Hot Reloading and Profiling for Python If you are a PyCharm user please check out Reloadium plugin See also: github.com/mikeckennedy/server-hot-reload Extras Brian: Making an alternate version of The Complete pytest Course Michael: Book: Zero Day: A Jeff Aiken Novel Warp terminal on Windows is out. PyCon Ed Summit announced. Joke: py programmer walks into a bar
Transcript
Discussion (0)
Hello and welcome to Python Bites where we deliver Python news and headlines directly to your earbuds.
This is episode 422 recorded March 3rd, 2025.
I am Michael Kennedy and I am Brian Ocken.
In this episode is brought to you by us.
Check out Brian's PyTest courses.
Check out the ones over at TalkPython training.
We're up to almost 475 hours, 275 hours, not that many, 275 hours of courses over at TalkPythonTour.
There are many tattoos from there, and Brian's book, and Patreon supporters, and
all these things. Thank you so much. Also, we're continuing to improve and involve
our newsletter, which gives you, I think, insights into the episode that we maybe
didn't explicitly call out, and certainly are not in the show, so head over to
PythonBytes.fm, click on newsletter, put in your email. We will be kind and gentle to it, but we'll send you cool
stuff usually the day of or after the day after the show. Yeah. So with that said, Brian, how do
we start our show today? Let's start it with a video kind of. Wait, isn't this already a video
if people want to watch it? Yeah. Yeah. Very mad of you. Yeah, so I am trying to add this to the stage.
What's going on?
Oh, they're wrong.
Anyway, there we go.
Technical difficulties that won't make any sense
to anybody listening.
So we don't normally cover video because it's, I don't know.
I don't know why.
But I don't watch a lot of Python videos, I guess.
But this one is a do not miss. So Henik put out a video called my 2025 UV based project,
Python project layout for production apps. And I am, I was paid attention to this, partly
to see what was he, he was up to, and I like UV. But also, when you watch it,
his example is a fast API app.
In his world, an app is usually really a website app.
Later he's going to go on to talk about Docker,
I think, because this is part one of a series.
But this one's already enough
that I think it's really useful.
And especially in a lot of the,
some of the stuff I deal with,
I think of an app as anything that's packaged kind of,
like it's not a package,
it's not something you put on PyPI,
but it's a bunch of your own code
that you normally would have used a requirements.txt file.
And I like his model better. So I'm going to jump in. I got a couple tabs because it's kind of hard to like navigate.
Anyway, snapshot videos. So I stopped them where I wanted to. So the video is great. It's about 25 minutes long. It's pretty quick to watch.
Here we've got the project layout.
So his project layout is using a source layout.
And really, there's no requirements file.
All of the requirements are in the pyproject.toml.
And instead of a custom lock file or one you manually do,
he's just recommending that you let UV take
care of a lot of the project stuff. And actually even with so and we'll take a look a little
bit more what's in pyproject.toml, but he's recommending that you go ahead and check in
the UV lock. So if you're letting UV handle your virtual environment, it's going to create
a lock file. And if you commit that, then UV run later will use that
and use all of the stuff in the lock file.
And you, instead of running Python,
you clone the repo, run UV run on your project,
and it's gonna grab everything out of the lock file.
It's just like pin dependencies.
It's pretty sweet.
Yeah, I 100% agree with him.
Check in the UV lock file.
And then you don't even have to do UV run if you don't want.
You can just do UV sync, and it will also
use the pin dependencies in the lock file.
And then some systems, they require
to run kind of with their setup.
For example, Pyramid, you need to use p-serve,
and then it's like configuration file or
flask. You can do like flask run or Django. Like, so if you still want to stick with that,
you can just do UV sync. So UV sync will grab all the everything out of the lock file then.
Yes, exactly. And I think it might even create the virtual environment though. I haven't actually
tried that yet. Yeah, it does. Yeah. If you don't have one already, it'll create it. And also, if you already had one and it was out of sync,
like UV sync, that's kind of what the part of the sync does.
If somebody updated some of the requirements,
so the UV lock had changed, then UV sync
will rewrite the virtual environment.
And so he's showing also that his version of how
to specify the Python version is to just specify it
within your PyProject.toml.
And UV will grab that and install it if necessary.
And then also, interesting discussion around version,
because PyProject.toml requires a version.
But with a lot of applications,
we don't really utilize the version,
because it's just code that you're pushing and running.
So he said, just set it,
if you don't care about the version, just set it to zero,
and then people will realize you're not using it.
So.
The world's most common version.
Yeah, and then also a discussion around the separation
of dependency groups that came in recently
that UV handles nicely in PyProject.toml files.
And that allows you to separate your dependencies based
on really what the application needs versus what
you need for development.
And this will work.
Then you can run.
If you're in production, it won't install your,
your like, PyTest and stuff,
but it'll install everything else.
But when you're creating a virtual environment locally
to develop, it'll grab those also.
So very cool to have all of this together.
And then build system, I didn't really realize
that you could specify UV as a build backend and
I'm going to have to play with that.
That's pretty cool.
So, how are you muted?
I put Hatchlane in mind and I believe several people pointed out that Hatchlane is the default.
And the reason that we, when we played with this the very, very first time it didn't show
up with any build backend is because we created in application mode
but I think if we created in package mode there's a way to say like well what really kind of project
you're creating then it specifies the build back in explicitly I think so yeah anyway a lot of
options there but yeah very cool yeah um actually just an enjoyable video too I like what he's doing
there so check it out very Well, let's talk about
async and await. So there's this cool project called AIO limiter, an efficient implementation
of a rate limiter for async IO. And this comes to us from Martin Peters. Martin Peters, at least at one point was the most prolific Stack Overflow Python person.
So that was fun.
And this project is something that got created
as a result of an answer on Stack Overflow by him.
So not a big surprise.
I'll beat on the dead horse a little bit, Brian.
I feel like there's a big missing piece
for async and await in Python. and that is any sort of mechanism or control or
understanding or adjustment or whatever of the underlying running of async code
in general, right? If I call an async function and I say await a thing, how
does it run? Well, you don't know. It might be running in an event loop that
you've created, it might be running in an event loop that you've created
It might be running in and one that you a framework created
You don't sometimes often most the time let's say you don't get a choice on how that loop is created
For example, if you're using fast API fast API creates a loop and says here you can use this one
Hope you like it. You know what I mean? Whereas systems like dotnet. They've got thread pools and
async Io
pools and Contexts and stuff that you can say hey on this one. I want you to limit to 10
So if you're doing work just do 10 at a time when you're done one allow the other ones to come in otherwise cue them
And just make them away right stuff like that is kind of missing so all these projects are trying to
Backfill that kind of functionality into Python's async and await.
And this is cool. So it does give you like suppose you're working on a project and you're using an
external API. The API says you have a rate limit of five per second. If you go over that, we're going
to start failing and telling you status code 429, too many requests, wait however long and try again.
But that becomes like really janky, right?
So with this thing, what you can do is I can create
a rate limiter and say, I'm willing to allow 100 calls
within a 30 second window, or the example I gave,
five calls within a one second window, or whatever, right?
Something like that.
And then you just put that into a async with block,
and then stuff that happens in that window
will be limited by this rate limit. Okay. Cool, right? So it makes it really easy to handle those kinds of things. But often it's not
like I'm gonna make all of the calls here. You know what I mean? It's, I want all the async calls
in the system to be limited in this way, not the ones that I'm controlling the particular function
of, which is sort of the crux of my complaint that I started with. But this is nice, you create one of
these somewhere and then anywhere you use this rate limit as a context manager,
it is subject to that rate limiting. So it doesn't have to be the same function,
it doesn't have to be all the codes are happening at the same time within the
block. So you know that's a pretty nice thing, right? As long as you just put
that in all the places you need it. Like for example one of the problems you can
do is you're getting too many requests you can overwhelm your database and
because they're you're awaiting and do it asynchronously you could just keep
feeding it to the database even if the database is slowing down and slowing
down and slowing down. So like in your data access layer you could just wrap
all of your queries in one of these things that say don't let more than I
don't know 10 per second or whatever is reasonable for your database. That's kind
of low but you know what I mean. Like you can sort of control that. So you might
like have one of these rate limiter for your database and then maybe one for an
external API or... Yes, theoretically and they could be different, right?
Yeah, okay that makes sense. Anyway,, I thought this was kind of cool.
And people who are worried about trying to solve that problem,
then they can use this as one of the tools there.
Computers are so fast, sometimes we're like, it's too fast.
Slow down a little bit.
It's like, let's make it a lot of do all the work
and not wait on any of it.
Like, uh, usually good, sometimes bad.
Sometimes bad.
The thing on the end doesn't like it.
Yep.
Yeah.
And out in the audience, we got a, wow, cool says Aziz.
I had this limit problem a lot.
So awesome.
Hope it helps.
Yeah.
Hope it limits your problems.
It does a little bit.
It will limit your problems.
What's next?
That was weak.
So, um, I want to talk about spy stuff. So Lucas Lange wrote an article about
spy stuff, actually a peek into a possible future of Python in the browser. So there's
a, it's a, it's a kind of a fun article also, but a great picture as well. Some cool picture
of the mountains anyway. And you know, he's. Anyway, and you know, I trust his opinion
because of his involvement with Python and everything,
but this is interesting about a lot of the core Python people
really involved with thinking about the web.
So there's a section about looking back on,
I haven't read this, or seen this,
but apparently there was a Gary Bernhardt talk
about the birth and death of JavaScript.
I'll have to go back and look at that.
And then, but basically talking about the history
of Python and the web.
Wait, wait, wait, wait.
If you have not seen the birth and death of JavaScript,
it needs to go to the top of your list.
The birth and death of JavaScript is a seminal video
that is both hilarious and very, very insightful.
Okay.
Well, the Yavascript is part of the joke.
Okay.
Yavascript.
All right.
Well, then he goes on and talk about Piedide and other things and, and, you know, using
NumPy and Cython and stuff. stuff, but the real thrust here is a new research project
called SPY, S, capital S, capital P, lower Y, I guess.
So that's SPY stuff.
It says, the article says the SPY is a research project
in its early stages at the moment.
Don't attempt to use it yet unless you plan to contribute,
but maybe you do plan to contribute.
It's both incomplete implementation-wise and design-wise,
but so early stages, but it sounds pretty cool.
So there's this, I like the idea.
So there's this, I'm gonna jump down to the demo
and see if we can get it to play.
So, ooh, had video sound too,
but I don't think you hear
that. But anyway, there's a demo of it working, of some shapes shifting around. And that's actually
we're running in the browser already, but you just can't, I guess it's not complete yet. But this,
this idea of having, having things that look like Python. So when you're, when you're,
there's like blue code and red code is the idea.
And the blue code is stuff that just like acts like Python. And,
and that's great for debugging and stuff. And because you can,
people are used to writing in Python. And then there's a redshift model of,
cause that's what we do a lot is like whether we should compile it or not,
but this will, um, uh, like pre compute, uh,
a lot of the stuff that's blue into a pre-compiled version. Anyway, all the little compilation parts to make things run faster. But I really like the idea that
you've got a level where you're running it just as pure Python and then you can deploy it and it
runs as a compiled part. So anyway, I'm probably getting this wrong at early stages,
but we've got links to this article
and then to the spy project itself,
which a lot of activity just recently.
So anyway, I like that.
And mostly, I don't know why I brought this up,
the story of Python in the web browser better and better.
So anyway.
I also bookmark this article as something super interesting
that should, you know, might be worth talking,
and reading up on, so thanks for covering it.
Yeah, and if you get a deeper-
We're on the verge.
You mentioned we could bring it up later again as well.
Yeah, yeah, it's early days,
so maybe there'll be more news on it.
Yeah, I'm very excited about the possibility
of Python in the browser.
It'll uncork some amazing stuff if that really gets running seamlessly.
And really, say in the browser, but really what we're also meaning is that
if we could not have different front-end and back-end languages,
so if we do all the dynamic front-end stuff with Python, it'd be cool. Yep, exactly. Dynamic friend and stuff with Python. Yep, exactly.
Exactly. I think that the browser manufacturers could do
significantly more to make this better. Yeah. For example, every one of them
ships a JavaScript runtime that's optimized, right? Not a single one of them
ships the WebAssembly version of Ruby or the WebAssembly version of Ruby, or the WebAssembly version of CPython, you know,
Piodide, or the WebAssembly version of.NET for Blazor,
or all these things.
And so all of those projects are like,
well, it'd be great to use this,
but it's really slow to download the whole runtime
on each page separately.
Every browser could say,
we will provide and keep up to date as part of our binaries
or just off of the internet or whatever as you download it a
Shared Python runtime a shared Ruby runtime a shared dotnet runtime and so on and they don't yeah, right, but
All these complaints about well the web front end is too slow because you got to download all this stuff like yes
You do now but it could theoretically be that they say well
We're gonna support like an open sort of management of these these binary these web assembly runtimes
You might need to download sure the extras you got to download every time like JavaScript
But the the core runtime of 10 megs will like update that with our browser or just yeah as it changes on the web
I wish they would do that. Yeah Right, know for JavaScript I mean come on now all right
it's like it sounds crazy but at the same time they do it for JavaScript and
they write their own all right they wouldn't even have to write their own
they just got to allow the run of running of others okay enough of that
let's talk about reloading stuff in the browser instead that sounds fun so
there's two projects I wanted to tell you about.
One is the big heavyweight does so much stuff
to help you write web applications,
type in the editor and have that stuff magically change.
For example, by default, if I run a Flask app
and I go over to the,
I run it and I open it up in the browser
and I see the page I'm working on.
And then I go over and I edit the Jinja template.
I hit save and I refresh the browser, nothing happens.
I should go back to Flask, restart Flask,
go back to the browser, reload the browser,
now I can see my changes.
You can level that up one by going to Flask
and say you're running into bug mode.
So if you see any changes, please rerun Flask
and reload the templates
if I edit the templates.
Then you can just edit your thing, save it,
go over to your browser, hit refresh, see the changes.
But what would be nicer if I could have
like two thirds of my screen be my editor,
one third of my screen be the web browser,
and as I type, I see stuff just changing on the page.
So if I put a CSS class on a thing, I don't have to go to the other app and do anything.
It just literally just the changes that apply like every second or so.
Right.
So that's what this reloading thing is, but it does a lot.
So I want to put this out there for people as a cool option.
I'm not sure I'm going to put it out there as a recommendation yet.
So let me tell you.
So for example, it will not just do the experience
I told you about, but it will actually rerun every function.
If you make a change to a function, it will rerun it
and you can actually have it doing like live profiling.
So as you type there, it'll give you a profiled output
of the thing and so on.
So if you kind of want to explore it,
it gives you like that idea more broadly.
So it works there.
It comes with a PyCharm plugin,
which is what the little animation is.
So you can actually see a visual representation
of like the performance time and how it's running
and reworking and so on.
Okay, so that's pretty neat.
Comes with an AI thing.
I'm going to skip that.
I don't know what that is or care.
It has, yeah, so generally,
if you make a change to a function,
it will re-execute the current function,
providing immediate feedback.
And if there's an error, it doesn't die.
It just goes, well, okay, once you fix it,
things are gonna be good and it'll start working again.
So it's kind of durable to that, you know?
And it'll refresh files throughout the entire project,
looking at dependencies, so if I make a change
to like one bit, then it'll change the others,
you know, like with the import or whatever.
For Django, it does exactly what I was telling you,
like as you type, not just as you type HTML,
but as you type Python.
So the example they have here is they're doing a query
for all objects and then they slice it to do a limit, paging limiting type of business.
And as they change the numbers in the slice in Python, the web browser is automatically
updating the results without them touching it.
That's pretty cool.
Yeah, it's pretty cool, right?
Similarly for Flask, it automatically reloads Flask.
But again, it says look, it'll hot reload the Flask, it automatically reloads Flask, but again it says look it'll hot reload the Flask app, but
if you just set Flask debug to be true, Flask will already do that, you know what I mean? So the one
thing it doesn't do is it doesn't refresh the page as you type on one side, the stuff on the right
doesn't change, right? Another thing it does it'll for SQL Alchemy because it's like running
functions over and over and over, it might start to insert, insert, insert into the database so it does these
auto runs and transactions that roll back so it doesn't tweak the database.
Oh, interesting.
Yeah, and it also does hot reload for pandas.
So if you're messing with your data frame or things like that, it'll just
automatically be updating as you type.
All right.
Pretty interesting, right, Brian?
Yeah.
Yeah. I don't know if I talked about before but just since people might want a less
intrusive version of that. So I have this project called Server Hot Reload over on
GitHub and it's a single JavaScript file and if you just include the JavaScript
file in your page it will give you the same functionality for web apps that
will reload the template. So for example, if you just include the JavaScript
at the top of the page, and then Flask,
if you run it with Flask debug,
or Pyramid automatically reloads in debug mode,
you can set that in the config file,
and I'm sure you can do similar stuff with Django.
And then you just browse it on one side,
code on the other, and you just start typing,
and off it goes, and it even detects if you set it up right,
or even reload the page if you change an image
that was being used, and things like that.
So, super cool, but this one, it doesn't go all crazy,
it doesn't require an IDE plugin,
and all that kind of stuff.
Basically what it does is it looks at the response
from the server and says, is the hash of the HTML changed?
If yes, reload the page.
If it's not changed, then don't reload the page,
that kind of thing.
So, anyway, two ways to basically work in your editor,
start typing and having some kind of output web
or in reloading other places.
So automatically changing as you type
so you don't have to manage that.
You're just like, oh, what's this class?
Oh, that looks really great.
No, we need more padding here. Da da da off it goes.
So the server one probably doesn't do the like if you change Python or
Technically, no, it doesn't do that. However, if you set flask to do that automatically,
and then it will re request the page, then yes, it does. You know what I mean?
Okay, got it.
So if you're willing to use the like the framework tools, then it does. Okay. what I mean? Okay got it. So if you're willing to use like the framework tools then it does. Okay okay very good cool. Yeah but it's
nowhere near as intense which I think for some people is a drawback and other
people is a plus depending on where you are. Okay nice. All right that's it for
all of our items isn't it? Yeah it is. Well, what have you got for extras? I got just a pet project of mine
that I wanted to talk about.
So the complete pie test course has been out for a while.
And there's a couple things about it
that I'd really kind of like to change.
So I'm working on some changes.
First of all, if you go and look at it,
it says there's 162 lessons.
That seems a little scary.
The reason is because I've chopped it all up into... There's 16 chapters in the book.
The course covers the entire book.
16 chapters.
Each video covers a section of a chapter.
That's where... Plus welcome videos and stuff.
That's where the 162 comes in
but that's a little there's actually 162 videos which is a little intimidating especially if
if you're you're looking at one and you kind of like there's a lot here but I mean it's all good
if you if you like to go in just like a few minutes at a time that's great but some people
want to just chunk through an entire chapter and like a lunch minutes at a time, that's great. But some people wanna just chunk through an entire chapter
and like a lunch break or something.
So the alternate version that I'm working on
is chopping this up into just chapters.
So most chapters will be one video
and then you can just chunk through
like just watching one video,
you can watch it in a weekend or not a weekend
in like 20 you know,
20 minutes or something like that. There's a couple chapters,
chapter two and chapter three, um, are pretty big writing test functions.
And then fixtures, uh, pretty big concepts. So they're a little longer.
So I'm chopping those not into one video, but, uh, like three videos.
Um, and so, uh, when we,
when I get all done, uh, this,
the new version will be not 162 lessons,
but like 20 lessons or something like that. Um,
and then I'll probably make that the default and I'll just have both of them
available because some people might like the, uh, little, uh,
more granularity and doesn't,
it's not more effort of me to have both of them around. So they'll both be around. Anyway, that's what I'm up to.
Cool. Yeah. I like the small little videos. I think it's the way better reference material.
You want to have to go like where in that 18 minute video was the thing I wanted?
Yeah.
Well, yeah, that's the benefit. The other thing is I like to, for videos, I like to
probably set them at like 1.2 speed
or 1.3 speed the first time, or 1.25, maybe 1.4,
to like get an overview really quickly.
And you have to reset that for every video
and that's somewhat a little annoying.
That's a hassle.
Yeah, anyway.
That is a hassle.
All right, well, let's see what I got for extras.
I got an oldie, something fun here.
So there was a Hacker News thread or Reddit extras. I got an oldie something fun here. So there was a
Hacker news thread or reddit thread. I'm gonna go with hacker news. Pretty sure was hacker news talking about hey could some people recommend
some cool legit programmer fiction books
Hmm, right like I want to I want a spy thriller that has to do with programming, but that's not stupid, right? It's not like, whoa, this is VB6, I know that.
I'm gonna track their IP.
Like, you know what, that's not how it works.
More Mr. Robot, less Jurassic Park or whatever that was.
I can't remember.
So the book that I thought was really cool,
I'll give a shout out to, is by Mark Rostovich,
who is the CTO of Azure.
And apparently I bought this book in 2012,
just to give you a sense.
So it's not brand new, but it is a super cool series as long as you keep in mind like its computer world was
2012 so people can check that out if they're interested also
Warp on Windows. I'm a big fan of warp the terminal. It's been working out super super well
I tried ghost TT or ghosted II or whatever you say that
super super well. I tried ghost tt or ghost tt or whatever you say that. Just I cannot do it. I can't do it. Like it doesn't even let you like select text
with hotkeys and stuff. It just puts like control H and stuff in there and then
until you can work with it as an editor. No. I can't do it. So I mean I know
there's some way like you can hold shift and arrow but you can't do like
control shift arrow to do like word by word and you some way, like you can hold Shift and Arrow, but you can't do like Ctrl Shift Arrow to do like word by word. And you can't do, like you can do Home, but you can't do
like Shift Home. These are like really weird like editing stuff where like some of it just starts
putting escape characters into the thing. I don't remember exactly enough what it was because when
I saw it, I was like, okay, we'll come back to this some other time. Anyway, if you were on Windows,
you're looking for a better terminal, and I know Windows has fewer options and less good options than the other places for a variety of terminals.
Like there's Windows Terminal and then, I don't know, is there anything else?
I'm not sure.
There's definitely a command prompt.
PowerShell runs within Windows Terminal.
You can run GitBash or PowerShell or whatever DOS-like stuff.
You can run all that in Windows Terminal.
Oh, right.
OK.
Right?
You can do the same in Warp.
You can choose, do I want PowerShell,
do I want Git Bash or whatever.
But the thing that is the outer bit of it, the app itself,
there's not many options.
So this is a cool thing that people can check out.
I'll link to the video because it's fun.
But you can just go to warp.dev or wherever it is.
Okay.
Our friends over at teaching Python podcast,
they are participating and being part of the PyCon 2025
education summit.
And they're pointing out that, hey, hey, hey,
the applications are going to be,
you know, send in a proposal very, very soon.
So that was, I think, last Friday and today is Monday.
So it just recently opened up and they said
the main theme is in the age of AI,
how do we maintain the creative, empathetic,
and critical thinking skills we need
to make us human and great coders?
We wanna know, and so there's a whole bunch
of ideas around this.
So we've got Kelly and Sean and a bunch of other people
participating in this.
So if that resonates with you, check it out.
No, I was just chuckling because even before AI,
we hadn't figured that out as far as I could tell.
But yeah, I don't really know the answer.
So I'm going to ask ChatGPT.
I'll get back to you.
OK.
Yeah, one more extra here real quick I just noticed that Grannion which is powering Pythonbytes.fm
by the way and many many other things just came out with their 2.0 release
right there seven hours ago how's that for French breaking news
doot doot doot doot doot doot doot far as I can tell there's a do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do the CLI of like how you specify certain constraints and stuff. That's easy enough to fix because it tells you this constraint,
such and such, but I think there's something going on where at least all of
my Fast API apps stopped working when I switched this,
but all the other ones like Court and Flask and Pyramid all work fine.
Interesting.
We don't know why.
And Court is async first just like Fast API.
So I don't know what's going on, but they were not having it.
So I just pinned the version to less than two
for those until whatever happens,
you guys figure it out.
So there's just a little PSA.
All right, with that.
So seven hours ago, you've already tried it?
Not on purpose.
I tried it three hours after it was released.
I needed to ship something else,
but my deployment process is check something in the Git
and then have it go rebuild the Docker images and restart them.
And that's all.
Check all the dependencies.
Is there anything we can update?
Does Ubuntu have security fixes we need to apply?
Can we update the web server in case
there's a security fix for it?
And then we'll rerun the dependencies.
And we'll restart it.
And then it didn't restart.
I'm like, wait a minute.
What?
What's going on here? This is not good
So that's how I learned that there's a new release of Grandia. Yeah, okay
You know, I mean, it's not like I was like, oh I got to try it that quick
It it tried itself on me and then it didn't go so well. So I scrambled to fix it. Okay. Yeah. Yeah. Okay joke
I'd love a joke
Tabs or spaces this one has to do with tabs or spaces
I'll tell you a joke before the joke a pre joke if you will to get everyone in the mood
This is like the bad joke the bad comedian that shows up before the one you actually came to see so we were at PyCon
I
Don't know. I think this might have even been in Portland
This was a while ago and there was some company that was clearly not very tuned into Python. They were just a coder company, right? And they were like
coming to sell their coder tools to the Python people. And so as they wanted to make a spicy
t-shirt and the spicy t-shirt said tabs are spaces fight. Like this is the stupidest shirt
I've seen at the whole conference. I mean, tabs are basically disallowed. They're not
exactly disallowed, but they're pretty much disallowed.
Like that's not an argument, it's over.
And you're like, you're trying to set up as a divider.
Like you could do two spaces, four spaces and fight,
but you can't do tabs versus spaces at a Python conference.
Anyway, but people are going around those shirts
nonetheless.
I think I got one to cut the lawn in.
Okay.
Well, let's, while on that topic,
two spaces or four spaces?
Four.
Unless I'm doing JavaScript, then two.
Because for some reason, the tools
seem to default to two for JavaScript.
You?
Like, four usually.
But I'm noticing that I'm using two frequently as well.
OK.
Very contrary.
OK.
You're an enigma wrapped in a fuzzy cloud. Okay, how about this for this is the real joke?
So I don't know if this is better or worse, but this is what people came for code puns. You ready Brian?
Yeah, a Python programmer walks into a bar and opens a tab the bartender tells them to sit at the table since they will need
four spaces
That's that's what I got for y'all.
No it's hilarious, see?
This is why people listen.
Yeah, yeah, yeah.
Oh no, I'm like, I'm advertising it poorly.
That was hilarious, man.
Good joke.
Now there's actually a bunch more here.
We've talked about this place before, right?
Yeah.
Let's see.
They're not all good. Why did the for loops stop running? It took a break.
Yeah.
How do you comfort a JavaScript bug? You console it, like console log and so on. There we
go.
No, it's just, it's good. Thanks. Yeah.
It was hilarious. I know.
Yeah.
I hear the flaws. No, not really. But that's what I brought anyway.
No.
Good talking with you again.
And thanks, everybody, for listening.
Yeah, you bet.
Bye-bye.