Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#453: Python++

Published Thu, Oct 16, 2025, recorded Thu, Oct 16, 2025
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Connect with the hosts

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.

Michael #1: PyPI+

  • Very nice search and exploration tool for PyPI
  • Minor but annoying bug: content-types ≠ content_types on PyPI+ but they are in Python itself. Minimum Python version seems to be interpreted as max Python version.
  • See dependency graphs and more
  • Examples

Brian #2: uv-ship - a CLI-tool for shipping with uv

  • uv-ship is a lightweight companion to uv that removes the risky parts of cutting a release. It verifies the repo state, bumps your project metadata and optionally refreshes the changelog. It then commits, tags & pushes the result, while giving you the chance to review every step.”

Michael #3: How fast is 3.14?

  • by Miguel Grinberg
  • A big focus on threaded vs. non-threaded Python
  • Some times its faster, other times, it’s slower

Brian #4: air - a new web framework built with FastAPI, Starlette, and Pydantic.

  • An very new project in Alpha stage by Daniel & Audrey Felderoy, the “Two Scoops of Django” people.
  • Air Tags are an interesting thing.
  • Also Why? is amazing
    • Don't use AIR”
    • “Every release could break your code! If you have to ask why you should use it, it's probably not for you.”
    • “If you want to use Air, you can. But we don't recommend it.”
    • “It'll likely infect you, your family, and your codebase with an evil web framework mind virus, , …”

Extras

Brian:

Michael:

Joke: An unforgivable crime

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:05 This is episode 453, recorded October 16th, 2025.

00:10 And I am Brian Okken.

00:11 And I'm Michael Kennedy.

00:13 This episode is sponsored by us.

00:15 Check out Talk Python training.

00:17 Check out the complete pytest course and other stuff over it.

00:21 So we've got talkpython.fm and Pythontest.com is where you want to head.

00:26 And also, we want to thank our Patreon supporters because, yes, this episode is sponsored by us, but we don't really pay ourselves.

00:34 You guys do.

00:35 And the Patreon people do throw a few bucks our way.

00:38 And we really appreciate that.

00:40 So thanks.

00:41 Also, love getting tips and extra topics and stuff sent our way.

00:46 It doesn't matter whether we've heard it or not.

00:49 It's okay to just send it.

00:51 If you think it might be worth talking about on the show, send it our way.

00:55 and you can connect with us on Bluesky and Mastodon and all of the places.

01:00 Yeah, more often than not, Brian, people say, I'm sure you've heard of and we haven't heard of.

01:04 We haven't heard of it yet.

01:08 Because unlike you guys, we don't have a good news podcast

01:12 around Python to listen to.

01:14 Exactly.

01:15 If you'd like to be a part of the show or watch past recordings,

01:19 head on over to pythonbytes.fm/live, and you can be part of our audience.

01:24 uh we've done a couple that today's a thursday at 10 sort of a day um and various reasons but

01:31 usually it's monday at 10 we'll let you know if that ever changes but you don't have to

01:35 just memorize that because um at python by set of m slash live it'll tell you when the next one is

01:41 and uh speaking of next ones we should talk about something interesting michael what do you got for

01:46 yes um you know we've got pypi and just for new folks out there not pi pi not pi not pi pi uh

01:54 That's happening less.

01:55 People used to say, I installed it from PyPy a lot, and that's not so much the thing.

02:00 But the next one, IPI++, well, 1+, it's not quite a C++++.

02:07 Do you wish that Python had++ instead of plus equals 1?

02:11 I don't really increment that much, actually.

02:14 Okay, your numbers just stay the same.

02:16 That's fine.

02:16 Well, I mean, in C++, we increment it all the time because that's how you do for loops.

02:21 True.

02:22 Yeah, that's a good point, actually.

02:23 Yeah, you shouldn't be doing that in a for loop.

02:25 No.

02:25 No.

02:26 Okay.

02:26 I don't miss it that much.

02:28 But, you know, plus plus used to be sort of the next thing.

02:30 So I want to talk about this thing called PyPI plus the next one.

02:36 So this is just a different UI on top of PyPI search with some extra information.

02:41 And I ran across this and I don't know where I saw it, but it's really neat.

02:46 I really like it.

02:47 It's discover all the packages with interactive pendency visualization.

02:52 So you can come in here and you can put in something like content types.

02:56 I talked about that recently.

02:57 This is a little library I have that given a file to tell you what like web

03:01 content type or MIME type it needs to be and vice versa.

03:04 As the little thing says, and you click on it and it says, well, what is it?

03:08 Look, it shows you the author, the version, the license, the size,

03:12 how many things pinned upon it.

03:14 Look at this.

03:14 So you can expand the section to see where it is and it's spinning and

03:19 spinning and I don't know what it's looking for.

03:21 But this dependence, I believe that means there's another package out there on PyPI that depends on my package.

03:28 Yeah.

03:28 Which is kind of cool.

03:29 You can also bump through the different releases and show you who is dependent upon these releases even.

03:35 It gives you a score.

03:37 Come over here, a health score of your project.

03:38 So this is something people ask about a lot or want to know about a lot.

03:41 Like, how do I decide if a library that I'm looking at or that Michael or Brian recommended is a good thing or a bad thing?

03:48 I mean, obviously malware is something you should consider and supply chain attacks,

03:52 but just is it well-maintained?

03:54 Is it a good choice to build upon, right?

03:57 And so this has a rating, and apparently my content type thing is 93 out of 100,

04:02 and it's getting dinged for mostly because it's pretty new.

04:06 It's not that old.

04:07 It's only got five releases, and I think I created it beginning of the year or something like that.

04:11 Yeah.

04:12 And it also has no documentation.

04:14 I mean, it has documentation in the readme, but it doesn't have a read the docs documentation

04:18 separate from what it just says in the readme.

04:20 You know what I mean?

04:20 Yeah.

04:21 And so that's bringing down its score, but it still has got an A, which is 93 out of 100.

04:25 That's pretty good.

04:26 What do you think of this thing?

04:27 Actually, I was poking around on it on my own.

04:31 Search for pytestCheck.

04:33 Because one of the things, I've got more dependence on mine.

04:37 Okay.

04:37 And, well, you can do, I'll just, I can pop it up also.

04:43 I got it.

04:43 Buy, desk, check.

04:44 One of the things you can do is this the first one.

04:47 I got an A.

04:48 Yay, 96%.

04:49 Yay, 96%.

04:50 You probably have documentation.

04:51 No, you don't.

04:54 What?

04:55 But it's also, like me, it has, well, you've got a lot more dependence, right?

05:02 Yeah, one of the things I think is kind of neat, the dependence is fun.

05:05 I didn't really know how to look for that before.

05:08 There's probably a way.

05:09 But rating the dependencies also, because there are dependencies,

05:15 the things that you're bringing in have a score also, and you can look at what their score is,

05:22 and you can just traverse down the dependency tree.

05:28 And that's kind of cool.

05:29 I think that's great.

05:30 I think actually your score should somewhat include the score of your dependents,

05:34 things you depend upon.

05:35 Maybe.

05:36 You know what I mean?

05:37 Right?

05:37 Like, if I have an A++ score, but I depend on a thing that's got an F, well, how stable is my thing, you know?

05:44 Yeah, and also, it's interesting that you can go by version, too, because, yeah, sometimes you add or remove dependencies with versions, too.

05:52 So it's kind of, there's a lot of stuff going on here.

05:55 Yeah, it's kind of fun.

05:56 Absolutely.

05:57 This is really neat.

05:59 I recommend people check it out.

06:00 I think I'm going to use this for exploring packages.

06:03 I generally just default to GitHub.

06:05 I'll go to PyPI to see if it's there.

06:07 And then I'm like, okay, just get me to GitHub so I can get a real view of this thing.

06:10 You know what I mean?

06:11 But I actually like this quite a bit.

06:13 And so I might start using this as kind of a default way.

06:17 You know what you can do is you see how it's got the URL

06:19 is just PyPI plus slash project slash project name.

06:23 Yeah.

06:24 You can set up a custom search, not shebang, but a custom search keyword in your browser.

06:30 So I could type like P plus space and then search.

06:35 whatever I put into my URL address bar would just pull up this page searching for whatever you put.

06:40 So you could make it basically a built-in search engine to your browser.

06:44 So I might do that, actually.

06:45 I haven't done it yet.

06:46 Or just go up and change the URL to whatever package name you want.

06:50 I know, but then you've got to go to the place.

06:52 I'm talking when you just have an open tab, right?

06:54 Like, I'm just in my browser.

06:55 Like, I want to search.

06:56 Does this exist on PyPI?

06:58 So right now I type PyPI space and then some package name,

07:00 and then it will pull me up to the search results on PyPI.

07:03 Oh, you're hardcore.

07:04 - Oh, poor, okay.

07:05 - You could do that here, right?

07:06 You could just say Pi Plus or whatever.

07:09 Anyway, I really like it.

07:10 I would like to, what's weird about this, there's something weird about this,

07:14 in that it has no attribution.

07:15 No, I can't tell who's behind it.

07:18 I can't tell if there's a GitHub project.

07:21 It literally is unknown.

07:23 What the heck, there's no contact desk, there's no built by, it's a little weird

07:27 that it's like secretive like that, and I don't know why.

07:29 I don't think it's dangerous because you don't install

07:32 from here and you know it's just like a front end on top of existing data but

07:36 they're just like weird bugs like for example what would I write if I was

07:39 writing Python I'd write import not py test - check I write py test underscore

07:44 check yeah yeah yeah well that doesn't exist if I search even though they're

07:49 equivalent so I have like one package called Jinja partials which is awesome

07:54 I love this one and it's Jinja underscore partials it is 95 by the way

07:58 Hooray. But if I put a Jinja dash partials, nope, doesn't exist. Couldn't see that. There's

08:04 no package called that. And vice versa. I have a FastAPI chameleon that does have the dash,

08:10 but the Python thing is underscore. So there's just like a little bit of weirdness like this.

08:14 And I would love to go, hey, whoever built this, I want to use this thing. It's cool.

08:17 But incredibly simple normalization on your search results would be so good.

08:23 Yeah. So it looks like PyPI does do that.

08:27 Like the search for both.

08:30 So PyPI, Jinja, partials.

08:34 Yeah. And if I put the dash, yeah, it pulls up both.

08:37 Right. It's, yeah, exactly.

08:39 So cool.

08:40 Exactly. So it should here.

08:41 But other than that, this thing is quite neat.

08:43 So a fun place to play in Explorer packages.

08:47 All right.

08:48 I think we're both covering some alpha things here because I'm going to talk about a couple more alpha things.

08:55 First off, well, I don't know if it's alpha.

08:57 A project called uv-ship.

08:59 Yep, it's zero-verse, so I'm going to call it alpha.

09:02 But I kind of think it's sort of fun.

09:05 So I've got to, because of the, what, the update to 3.14,

09:11 I want to make sure that all my projects, definitely all the ones I support,

09:15 even the ones that I think I'm the only one using them, I'd like to update stuff.

09:19 And I also, I've realized that I have like three shipping pipelines that I'm using.

09:25 Like I've changed how I published Pipe PI over the years.

09:28 And I kind of want to go back to just one version.

09:31 And I like just being able to, I know there's a lot of opinions around this,

09:37 but I like to be able to make sure everything's pretty good and then push a version number

09:42 and then do a remember whether I do a version first and then create a release on GitHub.

09:50 And those two things kind of have to happen.

09:52 And one of those can trigger the published IPI.

09:55 And I'm kind of going back and forth as to which one should trigger that.

09:59 But anyway, there's a pushing of a version that has to happen.

10:03 This uv-ship tool is based on uv, but it does a lot of this stuff.

10:08 It like, what does it do?

10:10 It says it said it verifies the repo state.

10:12 So make sure that you don't have anything checked out because you should be at the point not checking out and that you're on the right release branch because there's a there's some configuration you have to set up.

10:22 But it's it's the defaults are fine.

10:25 Verifies the repo state bumps your project metadata.

10:28 So bumps your version number and refresh.

10:32 You can you can have it update the change log and it even like pops up a dialogue that says you should go manually edit this right now.

10:39 And then it commits, tags, pushes, and all that stuff.

10:44 And each step of the way, it reviews.

10:46 So I've done the, it has a dry run mode that it talks about.

10:51 So you can uv tool install it so that it's everywhere.

10:55 And then you could do a dry run like next minor or next major or next,

11:00 I can't remember the bug.

11:01 I always think of it as bug fix, but it's something else.

11:04 Patch, patch release.

11:06 And then it just, it pretends that it's doing it.

11:09 If you do the dry run, it tells you everything that it's doing.

11:11 And I'm like, that's exactly what I wanted to do.

11:14 Awesome.

11:14 So I think I'm going to change my, I'm going to try this out a little bit.

11:18 And I think I'm going to change my workflow to be the, to make sure that I match this

11:23 because it's a pretty, pretty reasonable workflow.

11:26 So, and that way I can, when I want to, when I'm done with something, I can just go to the

11:31 right branch and just make it, make it so.

11:34 So I like the idea of throwing it in a tool, a tool thing because I,

11:38 or as a uv tool, have it installed everywhere

11:41 because I don't really want to have that be a dependency on my package

11:44 because it's not really, it's a workflow thing.

11:47 But anyway, uv tool, I took a look at the repo.

11:51 It's got 29 stars so far, but it's pretty new, looks like.

11:55 Just kind of started last week.

11:57 So yeah, from Florian Wraths.

11:59 Yeah, it was really interesting.

12:00 That caught my attention as well.

12:02 I've got some old repos have 29 stars yeah yeah 29 not bad no it's off to a good start it's it's pretty cool i like the idea

12:10 i just learned that uv has this version bumping feature and yeah it's it's quite nice i was i was

12:18 using it as well i also surprised it doesn't have a ship button you you or pub uv publish isn't a

12:24 thing though yeah it is it now oh there's i i you can do uv build and uv publish and on top of

12:31 of that you can do uvpublish dash t and that will specify that you're using the token instead of your

12:40 username so effectively setting the username like to underscore underscore token underscore underscore

12:44 whatever you got to type if you just say uh like a twine publish or whatever so yeah it's got a

12:48 really nice publish feature i mean so it's it's kind of like twine then um because i like right

12:54 now i want to move everything over to trusted publishing but i still have a couple things that

12:58 or not. So do you trust yourself? I mean, that's the question. Well, I don't actually, sometimes I

13:04 don't trust myself either. That is so true. That is so true. Okay. Before we move off this uv thing

13:09 really quick, I just learned yesterday, I was, I'm working on a project. I have always projects

13:14 going in these little projects that I'm playing with and more and more, I'm building fun little

13:18 utilities for me and they should be installed uv tool install. I want them broadly and I,

13:23 but I'm not ready to put them on PyPI for sure. I don't really even want to put them on GitHub.

13:28 And so the way I used to make those tools, I would say uv tool install either the thing from PyPI, like content types, or maybe which has an entry point script that becomes a command, right?

13:39 Or I would put it on GitHub as a public repo and do the get plus or whatever you do, and it'll install it from there.

13:45 I just learned yesterday that you can say uv tool install dash, is it dash E? I think it's dash E dot from a GitHub repository with a project.

13:56 And that will install the tool in editable mode.

13:59 So you just keep editing, and the tool is like a machine-wide command,

14:03 but it's not coming from somewhere else.

14:05 It's just coming from your working GitHub repo.

14:08 Oh, not GitHub repo, but you're just your directory.

14:11 Your directory.

14:12 Yeah, yeah, yeah.

14:13 That's what I mean.

14:13 You're just your local directory.

14:14 Isn't that cool?

14:15 Oh, cool.

14:15 Kind of like you can do pip install dash a dot, and it just installs the local thing.

14:20 Yeah, exactly.

14:21 It's exactly the same, but it puts it into the uv tool install workflow.

14:26 So it becomes like managed and global.

14:28 That's pretty cool.

14:29 Yeah, because the pip install dashi is like just if you activate that virtual environment sort of thing.

14:35 Yeah.

14:35 Also, there's not a lot of harm in publishing to PyPI.

14:39 I mean, people can't give you negative stars or anything.

14:42 Nope.

14:43 No, I just don't want to commit to having the thing the way it is.

14:46 I just want to play with it before I even decide I want to put out in the world.

14:48 You know what I mean?

14:49 But I want the coolness of the uv tool install equivalent that I don't have to juggle to find it.

14:54 Nice.

14:54 There it is.

14:55 Yeah.

14:55 Okay.

14:55 Well, let's talk about the speed, the speed of the new Python.

15:02 We have a couple of new Python stories.

15:03 I know you got a new Python thing.

15:04 I got a new Python thing at the end in our extras.

15:07 But 3.14 has felt like such a, it's going to come.

15:10 It's going to happen.

15:11 But no, here we are.

15:12 We're just after the release of 3.14.

15:15 You know that because Halloween is coming.

15:17 So Miguel Grinberg wrote a nice article called Python 3.14 is here.

15:23 How fast is it?

15:23 It might surprise people to see what the graphs say.

15:26 There's a lot of graphs.

15:27 Okay.

15:28 It also has a caveat.

15:30 These are small scale benchmarks.

15:33 So please don't be mad at me if your use case is different than my use case.

15:37 You know what I mean?

15:37 That's how benchmarking goes.

15:39 It's always fraught with, yeah, it's faster if you loop like that.

15:42 But I do this other thing and mine is slower.

15:44 So with that, as I said, there's a whole bunch of comparisons around here.

15:48 So one of the biggest ones, I think the theme that comes away from this more

15:53 and just there's some interesting trends is the threaded free threaded versus guild and can we

15:59 call it guild that's like the opposite of free threaded right the guild python gilded the gilded

16:04 age of python so there's a big comparison and sort of difference between the free threaded version

16:10 and the standard traditional style another thing that's interesting is 311 was a big speed bump

16:17 important performance i think that was probably the biggest performance jump for python pretty much

16:24 at least in the modern recent times.

16:26 3.11 is year over year the fastest jump, I think.

16:30 That's really when this faster C-Python fruit came to be harvested,

16:34 even though it was done in 3.9 and 3.10.

16:37 And then it was almost flat, not 100% flat, but almost flat.

16:41 And 3.14 is a little bit better, but there's a really interesting drop here.

16:45 Also, PyPy, and I mean it this time, P-Y-P-Y, 3.11 is five times faster or something just eyeballing it on the graph than 3.14 so there's

16:56 still that that said i never run pypy i'm not against it i like the project i think it's cool

17:01 i think it's great people are doing that but just all my projects it's like well this dependency

17:06 doesn't work with it so nope can't use it you know what i mean the whole two versus three problem

17:10 yeah we haven't talked about it for a while so just just in case people aren't sure pypy.org

17:15 and that is the project and it's it's not c python it's python implemented in python correct

17:22 is that you think that's yeah i believe so and it's odd that it's faster right but it's

17:25 fully jit compiled which is the deal that's why it's faster so but still 314 faster cool but

17:32 this is this next picture here is getting to the interesting comparison so you've got

17:37 standard and you've got the um the micro jit i guess that python has now right it's got the

17:44 find a couple of instructions and do optimizations on it, but there's not a broad level optimization

17:50 compared here. And then there's also the free-threaded Python. And across the board,

17:56 I guess actually this picture is pretty much, this is pretty positive. 3.13, standard versus JIT,

18:01 basically no difference. Actually, the JIT one's a little bit slower on some of these, but again,

18:04 these are really small micro benchmarks, so it doesn't have a chance to build up its JIT advantage.

18:10 pays the startup cost of it, but not the, I don't know how much it's helping over time.

18:14 Anyway, those are about the same, but the free threaded version,

18:18 probably 20% slower or more than regular Python.

18:21 And I thought free threading was supposed to be fast, Brian.

18:24 What's going on here?

18:25 Well, it's a benchmark that isn't using thread.

18:29 Yes, so what this is showing is it says, if you are running in the free threaded Python,

18:35 not even if you're using threading, not all of your code is going to be multi-threaded.

18:40 right most herego probably isn't but some of it will and that part presumably is computationally

18:45 heavy so you'll get a big boost there but the parts where it's not you actually pay a price to

18:49 slow it down but here's the interesting takeaway from this graph is in 313 that's like 20 25 slower

18:56 it's a problem in 314 it's almost the same that's a really big deal it's a smidge the overhead is

19:03 less. It's a smidge slower to do one thread on free threaded Python, but it's, it's removed so

19:10 much of that. You're paying a huge penalty in your regular code. Right. So that's actually really

19:15 cool. Now here's somewhere down here. If I go to find more threads. Okay. They have the fourth,

19:21 the multi-threaded one here. There we go. Now this is the graph. There's a four thread version

19:27 that says we're going to do true multi-threading. Look at the standard Python versus free thread.

19:33 well on which is better but on Linux I think the four threads is it's not quite

19:40 four times faster but it's pretty close it's a lot lot better yeah and also this

19:45 is true that 3:13 to 3:14 the 3:13 version is maybe double the speed with four

19:51 threads the 3:14 is almost four times like at least three times faster so it's it's a

19:57 really good story I think the takeaway here is that 3:14 is not much faster but

20:01 But the multi-threading doesn't have so many penalties,

20:05 but it does also have the benefits, which is exactly what you want.

20:08 - Yeah.

20:08 - There's still a compatibility story.

20:10 Can you use free threading 'cause of your dependencies and so on?

20:13 But at least the runtime behavior is kind of in line with where you would expect.

20:17 So, awesome.

20:18 - It also looks, it's interesting that the using threads without threads, without free threading,

20:25 is faster on 14 than, like 14 got faster anyway, even if you're not free threading.

20:31 Yeah, that's awesome.

20:32 Yeah.

20:32 So there's a whole lot more stuff going on here and comments down here if you want to get into them.

20:37 But that's the main takeaway.

20:39 Oh, phew.

20:40 I thought you were going to tell me that like 14 was slower or something.

20:44 No, I don't think so.

20:45 But it's not a tremendous boost for the regular one.

20:50 That's not a reason not to upgrade, right?

20:52 There's other benefits to it.

20:53 Yeah.

20:53 And that also, I guess, makes sense why we still have two versions.

20:58 We're shipping two versions of Python.

21:01 yeah exactly luckily we have uv so it's it's it's like a no-op to use one or the other yeah it's one

21:08 extra character to type exactly yeah okay it's it's lighter than air to to switch maybe um speaking

21:15 of air lighter than air here you go uh so there's a new project and it's it is pretty new so this

21:22 there's a project called air from the felderoys um daniel and audrey and they're the folks that

21:29 brought us two scoops of Django. So this is a project called Air, and it's not that old either.

21:40 Looks like a month or so, maybe. A lot of activity just recently, but it's already up to 525 stars.

21:46 So we're watching it. And what is Air? Air is a new web framework that breathes fresh air into

21:54 Python web development built with it's a it's built on top of FastAPI starlet and pedantic and

22:00 there is I haven't really played with it but it's it's some interesting stuff one of the interesting

22:07 things that is these air tags and I personally not sure how I feel about this but it's sort of

22:13 fun looking at looking it down at some examples I'm guessing that these air tags are these things

22:19 like air.html air.h1 so you can sort of programmatically generate html from it but

22:26 um but apparently if you want a mix of that so you've got some stuff that's dynamic that you're

22:31 using these air tag things to generate your html you can also do uh Jinja 2 templates at the same

22:37 time um and and so that's kind of cool so you can kind of mix them wherever it makes sense

22:43 in your application um and i'd i'd love to hear more about like the thought process around this

22:48 but interesting and and from from some interesting people and i was taking a look at this and i'm

22:55 like um uh uh plus the logo is kind of cute but the if you go to why it's this is this is why

23:02 i wanted to cover this because it's awesome it says that air is uh it's it's highly unstable

23:09 and experimental web framework we have not officially launched to the public yet every

23:13 release could break your code if you have to ask why you should use it you probably it's probably

23:18 not for you. It gets better. If you want to use Air, you can, but we don't recommend it.

23:24 It's not enterprise ready and will likely never be, at least definitely not before the official

23:30 launch. It also will likely infect you, your family and your code bases with an evil web

23:35 framework mind virus. This is good. Distracting you and that you'll never ship and everything.

23:41 So it's just, they recommend not using Air, but I think it's just really good writing and maybe

23:47 reverse psychology.

23:48 So kind of some fun mix of HTMX friendly stuff, some of the best practices.

23:56 And I guess reminding folks, these folks are building websites all the time.

24:01 So I'm interested to watch what they come up with here.

24:04 Yeah, it looks very interesting.

24:06 We'll see if it, I have no air metaphors.

24:10 Yeah, no air metaphors.

24:10 But yeah, it's an interesting project.

24:12 All right.

24:13 Those are our main topics.

24:16 Do you have any extras?

24:17 - I sure do.

24:18 I have a couple I'll, I can go through quick.

24:20 Some are quick, some are not as quick, but they're all pretty quick.

24:22 So I already talked to the Talk Python and production book is out.

24:26 It's doing great.

24:27 By the way, Brian, something that is really kind of mind blowing to me, but also really cool.

24:33 You come over here to the ratings, number one in software engineering on Amazon right now.

24:39 That's awesome. - Wow.

24:41 - I know.

24:42 - That's great. - And an application.

24:43 - Thank you.

24:43 It's crazy.

24:45 So I just wanna, the only thing is I've already announced that before, but it's doing really well.

24:49 And I wrote a blog post sort of about some of the motivation behind it and some of the different things that people can check out and so on.

24:55 So I'll link to that blog post.

24:57 Next, here's one of these little tools that I created that I was telling you about that would be really perfect to uv tool install dash e sort of thing.

25:05 Although I published it.

25:06 No, it's not on PyPI yet, I don't believe.

25:08 But yeah, it is.

25:09 It is on PyPI.

25:09 I did publish this one.

25:10 I have a couple going.

25:11 It's confusing.

25:12 So this one here, let me give you a problem.

25:15 Okay, Brian, you're working with your AI tools, your agentic AI.

25:19 And one of the never-ending problems of working with these is if you run out of credits,

25:26 you're either done for the month or you have to switch to pay-as-you-go billing.

25:30 Like, for example, I had the $16 a month cursor plan,

25:35 and then I started doing a whole bunch of projects.

25:37 It was super successful.

25:38 I'm like, I'm going to keep using this on the thing.

25:40 But I ran out of credits, so I had to switch.

25:41 I paid like $250 in overage credits for a month, which I paid gladly because it solved tons of problems.

25:48 If that was a person I hired to do that, it would have both taken months instead of days,

25:53 and it would have taken more than $200.

25:56 That said, knowing, like, do I need to slow down, or am I going to have a whole bunch of leftover prepaid credits

26:03 with whatever plan you have?

26:04 Knowing that is really helpful.

26:06 So I created this really simple TUI that you run it, and you configure it to know what your renewal day is.

26:13 So if every month on the 16th, your credits renew, and it's the 24th of the prior month, let's say,

26:20 and you've used 30% of your credits, if you keep going like that, are you going to run out?

26:24 Or are you going to have a bunch left?

26:25 In which case, maybe you tackle a bigger project that you know is going to burn up a bunch of credits

26:30 and you're waiting or something like that.

26:31 So all you do is you run this thing called AI usage.

26:34 You type in whatever percent your little tool tells you,

26:37 like this picture here says, You've used 35% of your credit.

26:40 Okay.

26:41 AI usage, 35.

26:42 It says, cool, guess what?

26:43 It's only day 12 of 31 out of your renewal days.

26:48 So if you've used 25%, that's actually, or whatever, you know, this example is 25.

26:53 So that's actually 13% less than if you were like on average using all of them.

26:58 And so you're going to have by the end only use 64%.

27:01 So you're going to have like 35% more you can go grind on.

27:03 So go be ambitious or choose a more expensive but better resulting model or something like that.

27:07 So that's a little utility I built for people.

27:09 That's cool.

27:10 Thanks.

27:10 Let me rephrase that.

27:11 I built it for myself, and then I just put it out there because I thought people might

27:14 find it useful.

27:15 You built it for other people that you actually also find useful.

27:19 Exactly.

27:20 All right.

27:21 Then I did this little thread called Show Me Your LS, and unfortunately, I use sans-serif

27:26 fonts, so it just looks like it says Show Me Your Is.

27:30 You know, whatever.

27:31 Like, I can't do it.

27:31 I'm not changing my web fonts just for one post.

27:34 Anyway, I wrote a blog post called Show Me Your LS and just trying to encourage people like, hey, play with some of these fun tools and so on.

27:40 So if you look at the default terminal experience on Mac, even on a $3,000 Mac running 2025 latest OS, it's dreadful.

27:49 I mean, like, oh, my gosh, it has like the folder name, then dash bash, dash bash, dash bash.

27:56 Just like, oh, my God, what is this thing?

27:58 Just put what I'm using out there now.

28:00 So right now I'm using this one that basically shows icons for

28:03 the different file types that uses the .gitignore to show hidden or

28:07 unhidden files and developer conventions and it shows the file size and

28:11 human readable sizes and stuff like that.

28:12 So I just thought I wanted to inspire people to play around a little.

28:15 So people can check that out.

28:18 Yeah, so people want to check out this little blog post and

28:22 get inspired about making your terminal better.

28:24 Also, have you heard of Helium, the browser?

28:27 I think you mentioned, maybe, I don't know.

28:29 I think I have.

28:30 Okay.

28:30 So it's the best privacy and unbiased ad blocker by default.

28:34 So it comes built in with ad blocker, ad block plus.

28:37 I don't know what, some kind of ad block, one of the better ad blocks as part of the thing.

28:41 And it's based on Chrome and so on.

28:42 And, you know, it's, it's kind of neat.

28:44 It's basically a Chromium browser.

28:45 It's not pulling me away from Vivaldi at any moment right now.

28:48 I really like the way Vivaldi works and the customizations and the side tabs

28:52 and all that kind of stuff.

28:53 But I was just poking around like, oh, that's interesting.

28:55 I'm always here for understanding new browsers.

28:58 Come over to the GitHub repo.

29:00 See what it says about languages?

29:02 97.4% Python.

29:03 Oh, wow.

29:04 That's cool.

29:05 Yeah.

29:05 So it's not that the entire browser is Python because it just is wrapping Chromium,

29:10 which is C, C++, something like that.

29:13 But what's interesting is if you just look around, it's full of all these little Python scripts

29:18 to basically take Chromium and build it into an entire browser,

29:21 which I thought was pretty interesting.

29:23 So people might want to look around this repo.

29:26 Yeah, we could use a handful of forks then to make some cool stuff.

29:31 Yeah, exactly.

29:31 All right, the last thing is super short.

29:33 I present to you the world's smallest CPython release, 3.13.9 final, released yesterday.

29:41 It has literally one change in spec to get source lines.

29:45 And that change is to deal with the case when a decorator is followed by a comment and then the function.

29:52 Something about the lines gets messed up.

29:54 Amazing that they released it.

29:56 I mean, I know it's important for certain things, but normally these things are just like scroll, scroll,

30:01 like changes, changes, changes, changes, changes.

30:03 So anyway, 3.13.9 is out, though it's likely it's not something you need to rush out and install.

30:10 You should install 3.14 anyway.

30:12 Yeah, maybe it was just a schedule, whatever's in there.

30:15 Yeah, perhaps.

30:16 A couple weeks later.

30:17 All right, over to you.

30:18 Well, we have another release that I was going to talk about,

30:22 which is 315.

30:23 So 315 alpha one is out already.

30:28 Hugo posted a couple of days ago and major new features.

30:32 Okay.

30:33 So it's, it's, it's pretty new stuff already cause but it's,

30:36 it's rolling out so people can, there's a play with that dedicated profiling package for profile,

30:42 profiling tools.

30:44 This one's actually kind of cool.

30:45 Pep 686 Python now uses UTF eight as the default encoding.

30:50 It has kind of bugged me that when I encode stuff, it doesn't default to UTF-8, but now it does.

30:57 So that's good.

30:58 Actually, it doesn't really bug me that much because I usually just specify the UTF-8 encoding.

31:04 Yeah, I do too.

31:05 But you don't want to forget.

31:06 And it's not an enumeration.

31:08 It's a string.

31:09 You've got to just type UTF-8.

31:11 Yeah, so there'll be less of that typing now.

31:14 It'll be good.

31:15 Anyway, one of the things that I think while we were talking about last week about testing, testing for 314, you may as well get, you know, while you're mucking with your toxiny file, you can you can go ahead and turn on 315 testing just in case something something comes up in 315 that makes it you have to modify it.

31:37 I probably wouldn't put it in CI right now or somehow put it in CI that it doesn't stop you from shipping.

31:44 But for local testing, why not?

31:47 And to help you with local testing, you can already pip install it with or not pip install it,

31:53 but you can uv Python install 315 because Astral's uv supports 315 now.

32:00 So that's cool.

32:01 I'm glad Astral exists.

32:04 Yeah.

32:05 I could never remember how to install the alpha releases and stuff.

32:10 And it just, it's easy now.

32:12 Okay.

32:12 We, I threatened to write a few blog posts.

32:16 So I did lazy imports.

32:19 We talked about it might come in.

32:21 It's a proposal that hasn't been accepted yet for 3.15, but you can use, there's techniques

32:28 for using lazy imports right now.

32:29 And these are not complicated.

32:31 This isn't something extra you install.

32:33 But I posted Python lazy imports you can use today on pythontest.com.

32:39 And also just a quick rundown of all the things that I mostly wrote it for me,

32:45 all the things I change when I add some testing for a new version.

32:50 So I updated testing in 3.14 and almost immediately got some feedback to add.

32:58 I tried to give a shout out.

33:00 Christian Klaus said, hey, you forgot free threading.

33:03 So I added a section to all the stuff I changed to support free threaded Python.

33:10 Nice.

33:11 Not the guild version.

33:12 Not the guild, but non-fish version.

33:16 So it's just mostly adding a 3.14T in a couple places.

33:20 But I was checking out.

33:22 I'm like, well, do I need to do something special about the Trove classifiers?

33:28 And I went and looked.

33:30 And there are, I didn't realize this before.

33:32 You can add a free-threading Trove classifier now if you want to broadcast that you're supporting free-threading on PyPI.

33:41 You can add that.

33:43 And there's also how stable it is.

33:47 So there's non-free-threaded stability, but apparently you can have stable, unstable, beta,

33:55 resilient as far as free-threading goes.

33:57 So if you're working on supporting it and it mostly works,

34:01 you can sort of advertise that if you want, I guess.

34:04 Yeah, lovely.

34:05 I didn't know about the Trove classifiers either.

34:07 Going forward, that's going to be a thing.

34:09 Yeah, and I guess that's it for extras.

34:12 All right.

34:13 I got a joke for you, obviously.

34:15 This one is a Linux joke.

34:17 Are you familiar with Arch Linux?

34:20 Vaguely.

34:20 Vaguely.

34:21 So I'm pretty much me as well.

34:23 But the zen of Arch Linux is that it's the absolute minimal,

34:28 most empty thing set up that then you choose like, oh, I want to have this kind of shell.

34:33 Oh, I want to have this feature.

34:35 And everything is adding it in, right?

34:37 Oh, okay.

34:38 Okay.

34:38 So there's, you know, some upside to that.

34:41 So anyway, the joke is here we have the small, presumably geeky little programmer type in an orange jumpsuit in a jail

34:49 sitting next to the biggest, toughest looking thug you can imagine.

34:53 The thug says, killed a man.

34:55 You, little character looks over and says, I installed apt on Arch Linux.

34:59 Dude, what?

35:00 The guys creeped.

35:01 Like the big thugs.

35:02 Like all creeped out.

35:02 What are you doing, bro?

35:04 God, get away from me.

35:09 It's good, right?

35:10 Yeah.

35:11 So you got the comments.

35:13 Kind of want to do this now.

35:14 Go ahead.

35:15 Love it.

35:15 I love it.

35:16 How I can understand these jokes now.

35:18 Someone says like, I'm getting good at Linux.

35:20 I know what it means.

35:22 Okay.

35:23 What is apt?

35:24 Do you know?

35:25 Apt?

35:25 Yeah.

35:25 It's the thing you install.

35:28 It's like the pip of Ubuntu and stuff.

35:31 You apt install.

35:33 Okay.

35:33 Just doubted myself for not using Linux for a very long time.

35:37 So, yeah.

35:38 Dude, don't get away from me, you monster.

35:44 Anyway, I thought it was fun.

35:45 Yeah, that's fun.

35:47 Yeah.

35:47 Plus, the art is nice.

35:48 The art is lovely.

35:49 Yeah, the art is really good.

35:51 I think I appreciate art a little bit more now that there's a lot of vibe in art.

35:55 you see real art you're like that's nice yeah and this isn't art but i was we commented before we

35:59 started recording i'm just loving the kind of the blue lighting that my robot is experiencing right

36:05 now today that's nature's light nature's light yeah it's cold out um anyway um awesome uh episode

36:11 today again and thanks michael thanks everybody for listening we'll catch you next week catch you

36:16 later bye


Want to go deeper? Check our projects