WEBVTT 00:00:00.020 --> 00:00:05.040 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. 00:00:05.540 --> 00:00:10.140 This is episode 453, recorded October 16th, 2025. 00:00:10.710 --> 00:00:11.720 And I am Brian Okken. 00:00:11.960 --> 00:00:12.680 And I'm Michael Kennedy. 00:00:13.140 --> 00:00:14.900 This episode is sponsored by us. 00:00:15.150 --> 00:00:16.800 Check out Talk Python training. 00:00:17.140 --> 00:00:20.200 Check out the complete pytest course and other stuff over it. 00:00:21.100 --> 00:00:26.520 So we've got talkpython.fm and Pythontest.com is where you want to head. 00:00:26.560 --> 00:00:34.000 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:00:34.520 --> 00:00:35.100 You guys do. 00:00:35.580 --> 00:00:38.600 And the Patreon people do throw a few bucks our way. 00:00:38.850 --> 00:00:40.500 And we really appreciate that. 00:00:40.660 --> 00:00:40.920 So thanks. 00:00:41.320 --> 00:00:46.140 Also, love getting tips and extra topics and stuff sent our way. 00:00:46.480 --> 00:00:48.320 It doesn't matter whether we've heard it or not. 00:00:49.480 --> 00:00:51.080 It's okay to just send it. 00:00:51.110 --> 00:00:54.740 If you think it might be worth talking about on the show, send it our way. 00:00:55.060 --> 00:01:00.240 and you can connect with us on Bluesky and Mastodon and all of the places. 00:01:00.820 --> 00:01:02.480 Yeah, more often than not, Brian, people say, 00:01:02.620 --> 00:01:04.199 I'm sure you've heard of and we haven't heard of. 00:01:04.540 --> 00:01:05.900 We haven't heard of it yet. 00:01:08.899 --> 00:01:12.140 Because unlike you guys, we don't have a good news podcast 00:01:12.480 --> 00:01:13.700 around Python to listen to. 00:01:14.540 --> 00:01:14.940 Exactly. 00:01:15.420 --> 00:01:18.980 If you'd like to be a part of the show or watch past recordings, 00:01:19.400 --> 00:01:22.340 head on over to pythonbytes.fm/live, 00:01:22.620 --> 00:01:24.260 and you can be part of our audience. 00:01:24.420 --> 00:01:30.800 uh we've done a couple that today's a thursday at 10 sort of a day um and various reasons but 00:01:31.000 --> 00:01:35.480 usually it's monday at 10 we'll let you know if that ever changes but you don't have to 00:01:35.940 --> 00:01:41.040 just memorize that because um at python by set of m slash live it'll tell you when the next one is 00:01:41.420 --> 00:01:46.500 and uh speaking of next ones we should talk about something interesting michael what do you got for 00:01:46.560 --> 00:01:54.380 yes um you know we've got pypi and just for new folks out there not pi pi not pi not pi pi uh 00:01:54.400 --> 00:01:55.120 That's happening less. 00:01:55.360 --> 00:01:58.140 People used to say, I installed it from PyPy a lot, 00:01:58.140 --> 00:01:59.820 and that's not so much the thing. 00:02:00.920 --> 00:02:05.200 But the next one, IPI++, well, 1+, 00:02:05.640 --> 00:02:07.340 it's not quite a C++++. 00:02:07.760 --> 00:02:11.180 Do you wish that Python had++ instead of plus equals 1? 00:02:11.460 --> 00:02:13.480 I don't really increment that much, actually. 00:02:14.180 --> 00:02:16.040 Okay, your numbers just stay the same. 00:02:16.380 --> 00:02:16.620 That's fine. 00:02:16.660 --> 00:02:19.500 Well, I mean, in C++, we increment it all the time 00:02:19.540 --> 00:02:20.620 because that's how you do for loops. 00:02:21.460 --> 00:02:21.640 True. 00:02:22.080 --> 00:02:23.080 Yeah, that's a good point, actually. 00:02:23.560 --> 00:02:25.080 Yeah, you shouldn't be doing that in a for loop. 00:02:25.320 --> 00:02:25.580 No. 00:02:25.840 --> 00:02:26.000 No. 00:02:26.260 --> 00:02:26.360 Okay. 00:02:26.620 --> 00:02:27.440 I don't miss it that much. 00:02:28.040 --> 00:02:30.800 But, you know, plus plus used to be sort of the next thing. 00:02:30.840 --> 00:02:36.000 So I want to talk about this thing called PyPI plus the next one. 00:02:36.380 --> 00:02:41.540 So this is just a different UI on top of PyPI search with some extra information. 00:02:41.820 --> 00:02:45.780 And I ran across this and I don't know where I saw it, but it's really neat. 00:02:46.100 --> 00:02:46.940 I really like it. 00:02:47.200 --> 00:02:51.560 It's discover all the packages with interactive pendency visualization. 00:02:52.100 --> 00:02:56.180 So you can come in here and you can put in something like content types. 00:02:56.240 --> 00:02:57.520 I talked about that recently. 00:02:57.960 --> 00:03:01.360 This is a little library I have that given a file to tell you what like web 00:03:01.680 --> 00:03:04.120 content type or MIME type it needs to be and vice versa. 00:03:04.460 --> 00:03:08.500 As the little thing says, and you click on it and it says, well, what is it? 00:03:08.820 --> 00:03:11.860 Look, it shows you the author, the version, the license, the size, 00:03:12.180 --> 00:03:14.040 how many things pinned upon it. 00:03:14.160 --> 00:03:14.480 Look at this. 00:03:14.900 --> 00:03:19.380 So you can expand the section to see where it is and it's spinning and 00:03:19.620 --> 00:03:21.080 spinning and I don't know what it's looking for. 00:03:21.420 --> 00:03:28.220 But this dependence, I believe that means there's another package out there on PyPI that depends on my package. 00:03:28.520 --> 00:03:28.600 Yeah. 00:03:28.600 --> 00:03:29.200 Which is kind of cool. 00:03:29.460 --> 00:03:35.200 You can also bump through the different releases and show you who is dependent upon these releases even. 00:03:35.760 --> 00:03:36.580 It gives you a score. 00:03:37.020 --> 00:03:38.540 Come over here, a health score of your project. 00:03:38.680 --> 00:03:41.720 So this is something people ask about a lot or want to know about a lot. 00:03:41.760 --> 00:03:48.360 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? 00:03:48.600 --> 00:03:52.620 I mean, obviously malware is something you should consider and supply chain attacks, 00:03:52.780 --> 00:03:54.340 but just is it well-maintained? 00:03:54.780 --> 00:03:56.660 Is it a good choice to build upon, right? 00:03:57.000 --> 00:04:02.660 And so this has a rating, and apparently my content type thing is 93 out of 100, 00:04:02.900 --> 00:04:06.680 and it's getting dinged for mostly because it's pretty new. 00:04:06.800 --> 00:04:07.500 It's not that old. 00:04:07.680 --> 00:04:11.600 It's only got five releases, and I think I created it beginning of the year or something like that. 00:04:11.860 --> 00:04:12.000 Yeah. 00:04:12.260 --> 00:04:13.520 And it also has no documentation. 00:04:14.120 --> 00:04:15.720 I mean, it has documentation in the readme, 00:04:15.840 --> 00:04:17.920 but it doesn't have a read the docs documentation 00:04:18.500 --> 00:04:20.060 separate from what it just says in the readme. 00:04:20.170 --> 00:04:20.600 You know what I mean? 00:04:20.880 --> 00:04:21.000 Yeah. 00:04:21.239 --> 00:04:22.480 And so that's bringing down its score, 00:04:22.510 --> 00:04:25.300 but it still has got an A, which is 93 out of 100. 00:04:25.480 --> 00:04:25.980 That's pretty good. 00:04:26.280 --> 00:04:26.980 What do you think of this thing? 00:04:27.680 --> 00:04:31.060 Actually, I was poking around on it on my own. 00:04:31.980 --> 00:04:33.260 Search for pytestCheck. 00:04:33.520 --> 00:04:36.340 Because one of the things, I've got more dependence on mine. 00:04:37.080 --> 00:04:37.280 Okay. 00:04:37.900 --> 00:04:43.160 And, well, you can do, I'll just, I can pop it up also. 00:04:43.400 --> 00:04:43.580 I got it. 00:04:43.860 --> 00:04:44.580 Buy, desk, check. 00:04:44.740 --> 00:04:46.880 One of the things you can do is this the first one. 00:04:47.780 --> 00:04:48.400 I got an A. 00:04:48.660 --> 00:04:49.720 Yay, 96%. 00:04:49.720 --> 00:04:50.440 Yay, 96%. 00:04:50.680 --> 00:04:51.740 You probably have documentation. 00:04:51.980 --> 00:04:52.380 No, you don't. 00:04:54.720 --> 00:04:54.820 What? 00:04:55.660 --> 00:05:01.360 But it's also, like me, it has, well, you've got a lot more dependence, right? 00:05:02.280 --> 00:05:05.500 Yeah, one of the things I think is kind of neat, the dependence is fun. 00:05:05.990 --> 00:05:08.160 I didn't really know how to look for that before. 00:05:08.440 --> 00:05:09.060 There's probably a way. 00:05:09.440 --> 00:05:13.160 But rating the dependencies also, 00:05:13.370 --> 00:05:14.880 because there are dependencies, 00:05:15.690 --> 00:05:20.040 the things that you're bringing in have a score also, 00:05:20.090 --> 00:05:21.880 and you can look at what their score is, 00:05:22.460 --> 00:05:27.800 and you can just traverse down the dependency tree. 00:05:28.440 --> 00:05:29.140 And that's kind of cool. 00:05:29.140 --> 00:05:30.160 I think that's great. 00:05:30.220 --> 00:05:34.580 I think actually your score should somewhat include the score of your dependents, 00:05:34.860 --> 00:05:35.680 things you depend upon. 00:05:35.960 --> 00:05:36.240 Maybe. 00:05:36.240 --> 00:05:36.600 You know what I mean? 00:05:37.010 --> 00:05:37.140 Right? 00:05:37.460 --> 00:05:44.660 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? 00:05:44.900 --> 00:05:52.360 Yeah, and also, it's interesting that you can go by version, too, because, yeah, sometimes you add or remove dependencies with versions, too. 00:05:52.480 --> 00:05:55.140 So it's kind of, there's a lot of stuff going on here. 00:05:55.820 --> 00:05:56.600 Yeah, it's kind of fun. 00:05:56.820 --> 00:05:57.200 Absolutely. 00:05:57.580 --> 00:05:58.300 This is really neat. 00:05:59.120 --> 00:06:00.480 I recommend people check it out. 00:06:00.580 --> 00:06:02.920 I think I'm going to use this for exploring packages. 00:06:03.220 --> 00:06:04.860 I generally just default to GitHub. 00:06:05.200 --> 00:06:07.500 I'll go to PyPI to see if it's there. 00:06:07.920 --> 00:06:09.320 And then I'm like, okay, just get me to GitHub 00:06:09.380 --> 00:06:10.740 so I can get a real view of this thing. 00:06:10.860 --> 00:06:11.200 You know what I mean? 00:06:11.500 --> 00:06:13.440 But I actually like this quite a bit. 00:06:13.760 --> 00:06:16.900 And so I might start using this as kind of a default way. 00:06:17.160 --> 00:06:19.380 You know what you can do is you see how it's got the URL 00:06:19.880 --> 00:06:23.100 is just PyPI plus slash project slash project name. 00:06:23.580 --> 00:06:23.780 Yeah. 00:06:24.080 --> 00:06:27.540 You can set up a custom search, not shebang, 00:06:27.600 --> 00:06:30.100 but a custom search keyword in your browser. 00:06:30.540 --> 00:06:34.580 So I could type like P plus space and then search. 00:06:35.100 --> 00:06:40.500 whatever I put into my URL address bar would just pull up this page searching for whatever you put. 00:06:40.820 --> 00:06:44.200 So you could make it basically a built-in search engine to your browser. 00:06:44.580 --> 00:06:45.360 So I might do that, actually. 00:06:45.580 --> 00:06:46.040 I haven't done it yet. 00:06:46.320 --> 00:06:50.220 Or just go up and change the URL to whatever package name you want. 00:06:50.440 --> 00:06:52.360 I know, but then you've got to go to the place. 00:06:52.780 --> 00:06:54.780 I'm talking when you just have an open tab, right? 00:06:54.960 --> 00:06:55.760 Like, I'm just in my browser. 00:06:55.900 --> 00:06:56.480 Like, I want to search. 00:06:56.680 --> 00:06:57.880 Does this exist on PyPI? 00:06:58.180 --> 00:07:00.700 So right now I type PyPI space and then some package name, 00:07:00.820 --> 00:07:03.420 and then it will pull me up to the search results on PyPI. 00:07:03.800 --> 00:07:04.560 Oh, you're hardcore. 00:07:04.780 --> 00:07:05.360 - Oh, poor, okay. 00:07:05.500 --> 00:07:06.720 - You could do that here, right? 00:07:06.720 --> 00:07:08.400 You could just say Pi Plus or whatever. 00:07:09.100 --> 00:07:10.060 Anyway, I really like it. 00:07:10.360 --> 00:07:13.020 I would like to, what's weird about this, 00:07:13.020 --> 00:07:13.860 there's something weird about this, 00:07:14.010 --> 00:07:15.560 in that it has no attribution. 00:07:15.840 --> 00:07:18.040 No, I can't tell who's behind it. 00:07:18.100 --> 00:07:20.620 I can't tell if there's a GitHub project. 00:07:21.000 --> 00:07:22.320 It literally is unknown. 00:07:23.260 --> 00:07:24.800 What the heck, there's no contact desk, 00:07:24.940 --> 00:07:27.060 there's no built by, it's a little weird 00:07:27.180 --> 00:07:29.460 that it's like secretive like that, and I don't know why. 00:07:29.780 --> 00:07:32.539 I don't think it's dangerous because you don't install 00:07:32.560 --> 00:07:36.520 from here and you know it's just like a front end on top of existing data but 00:07:36.720 --> 00:07:39.840 they're just like weird bugs like for example what would I write if I was 00:07:39.940 --> 00:07:44.220 writing Python I'd write import not py test - check I write py test underscore 00:07:44.400 --> 00:07:49.320 check yeah yeah yeah well that doesn't exist if I search even though they're 00:07:49.460 --> 00:07:54.320 equivalent so I have like one package called Jinja partials which is awesome 00:07:54.440 --> 00:07:58.740 I love this one and it's Jinja underscore partials it is 95 by the way 00:07:58.660 --> 00:08:04.200 Hooray. But if I put a Jinja dash partials, nope, doesn't exist. Couldn't see that. There's 00:08:04.240 --> 00:08:09.420 no package called that. And vice versa. I have a FastAPI chameleon that does have the dash, 00:08:10.060 --> 00:08:14.040 but the Python thing is underscore. So there's just like a little bit of weirdness like this. 00:08:14.330 --> 00:08:17.120 And I would love to go, hey, whoever built this, I want to use this thing. It's cool. 00:08:17.520 --> 00:08:21.920 But incredibly simple normalization on your search results would be so good. 00:08:23.060 --> 00:08:27.460 Yeah. So it looks like PyPI does do that. 00:08:27.800 --> 00:08:30.220 Like the search for both. 00:08:30.260 --> 00:08:33.820 So PyPI, Jinja, partials. 00:08:34.500 --> 00:08:37.740 Yeah. And if I put the dash, yeah, it pulls up both. 00:08:37.849 --> 00:08:39.159 Right. It's, yeah, exactly. 00:08:39.539 --> 00:08:39.940 So cool. 00:08:40.190 --> 00:08:41.539 Exactly. So it should here. 00:08:41.680 --> 00:08:43.099 But other than that, this thing is quite neat. 00:08:43.500 --> 00:08:46.120 So a fun place to play in Explorer packages. 00:08:47.280 --> 00:08:47.520 All right. 00:08:48.790 --> 00:08:52.139 I think we're both covering some alpha things here 00:08:52.180 --> 00:08:54.940 because I'm going to talk about a couple more alpha things. 00:08:55.480 --> 00:08:56.820 First off, well, I don't know if it's alpha. 00:08:57.640 --> 00:08:59.240 A project called uv-ship. 00:08:59.580 --> 00:09:01.380 Yep, it's zero-verse, so I'm going to call it alpha. 00:09:02.500 --> 00:09:05.560 But I kind of think it's sort of fun. 00:09:05.900 --> 00:09:11.320 So I've got to, because of the, what, the update to 3.14, 00:09:11.980 --> 00:09:13.420 I want to make sure that all my projects, 00:09:13.600 --> 00:09:14.800 definitely all the ones I support, 00:09:15.140 --> 00:09:17.560 even the ones that I think I'm the only one using them, 00:09:17.860 --> 00:09:19.240 I'd like to update stuff. 00:09:19.560 --> 00:09:25.040 And I also, I've realized that I have like three shipping pipelines that I'm using. 00:09:25.320 --> 00:09:28.440 Like I've changed how I published Pipe PI over the years. 00:09:28.960 --> 00:09:31.540 And I kind of want to go back to just one version. 00:09:31.940 --> 00:09:37.080 And I like just being able to, I know there's a lot of opinions around this, 00:09:37.320 --> 00:09:41.999 but I like to be able to make sure everything's pretty good and then push a version number 00:09:42.100 --> 00:09:46.020 and then do a remember whether I do a version first 00:09:46.220 --> 00:09:49.820 and then create a release on GitHub. 00:09:50.400 --> 00:09:52.600 And those two things kind of have to happen. 00:09:52.680 --> 00:09:55.080 And one of those can trigger the published IPI. 00:09:55.940 --> 00:09:57.860 And I'm kind of going back and forth 00:09:58.060 --> 00:09:59.720 as to which one should trigger that. 00:09:59.920 --> 00:10:02.020 But anyway, there's a pushing of a version 00:10:02.260 --> 00:10:02.940 that has to happen. 00:10:03.200 --> 00:10:06.300 This uv-ship tool is based on uv, 00:10:06.800 --> 00:10:08.800 but it does a lot of this stuff. 00:10:08.840 --> 00:10:10.160 It like, what does it do? 00:10:10.220 --> 00:10:12.380 It says it said it verifies the repo state. 00:10:12.630 --> 00:10:22.480 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. 00:10:22.510 --> 00:10:24.280 But it's it's the defaults are fine. 00:10:25.280 --> 00:10:27.900 Verifies the repo state bumps your project metadata. 00:10:28.300 --> 00:10:31.920 So bumps your version number and refresh. 00:10:32.360 --> 00:10:38.700 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. 00:10:39.100 --> 00:10:42.520 And then it commits, tags, pushes, and all that stuff. 00:10:44.240 --> 00:10:46.420 And each step of the way, it reviews. 00:10:46.750 --> 00:10:50.820 So I've done the, it has a dry run mode that it talks about. 00:10:51.220 --> 00:10:54.720 So you can uv tool install it so that it's everywhere. 00:10:55.500 --> 00:10:59.760 And then you could do a dry run like next minor or next major or next, 00:11:00.180 --> 00:11:01.580 I can't remember the bug. 00:11:01.700 --> 00:11:03.760 I always think of it as bug fix, but it's something else. 00:11:04.000 --> 00:11:04.880 Patch, patch release. 00:11:06.120 --> 00:11:08.860 And then it just, it pretends that it's doing it. 00:11:09.000 --> 00:11:11.940 If you do the dry run, it tells you everything that it's doing. 00:11:11.990 --> 00:11:14.040 And I'm like, that's exactly what I wanted to do. 00:11:14.250 --> 00:11:14.340 Awesome. 00:11:14.710 --> 00:11:18.600 So I think I'm going to change my, I'm going to try this out a little bit. 00:11:18.600 --> 00:11:23.640 And I think I'm going to change my workflow to be the, to make sure that I match this 00:11:23.940 --> 00:11:26.500 because it's a pretty, pretty reasonable workflow. 00:11:26.890 --> 00:11:31.660 So, and that way I can, when I want to, when I'm done with something, I can just go to the 00:11:31.780 --> 00:11:34.060 right branch and just make it, make it so. 00:11:34.400 --> 00:11:36.620 So I like the idea of throwing it in a tool, 00:11:37.600 --> 00:11:38.660 a tool thing because I, 00:11:38.940 --> 00:11:39.900 or as a uv tool, 00:11:40.180 --> 00:11:41.400 have it installed everywhere 00:11:41.620 --> 00:11:43.240 because I don't really want to have that 00:11:43.400 --> 00:11:44.600 be a dependency on my package 00:11:44.840 --> 00:11:45.560 because it's not really, 00:11:45.660 --> 00:11:46.920 it's a workflow thing. 00:11:47.280 --> 00:11:48.880 But anyway, uv tool, 00:11:50.080 --> 00:11:51.420 I took a look at the repo. 00:11:51.720 --> 00:11:53.200 It's got 29 stars so far, 00:11:53.280 --> 00:11:55.520 but it's pretty new, looks like. 00:11:55.640 --> 00:11:57.020 Just kind of started last week. 00:11:57.300 --> 00:11:59.820 So yeah, from Florian Wraths. 00:11:59.980 --> 00:12:00.800 Yeah, it was really interesting. 00:12:00.880 --> 00:12:01.920 That caught my attention as well. 00:12:02.420 --> 00:12:04.360 I've got some old repos 00:12:04.380 --> 00:12:10.840 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 00:12:10.940 --> 00:12:18.480 i just learned that uv has this version bumping feature and yeah it's it's quite nice i was i was 00:12:18.620 --> 00:12:24.440 using it as well i also surprised it doesn't have a ship button you you or pub uv publish isn't a 00:12:24.580 --> 00:12:31.640 thing though yeah it is it now oh there's i i you can do uv build and uv publish and on top of 00:12:31.500 --> 00:12:39.940 of that you can do uvpublish dash t and that will specify that you're using the token instead of your 00:12:40.180 --> 00:12:44.200 username so effectively setting the username like to underscore underscore token underscore underscore 00:12:44.460 --> 00:12:48.700 whatever you got to type if you just say uh like a twine publish or whatever so yeah it's got a 00:12:48.720 --> 00:12:54.580 really nice publish feature i mean so it's it's kind of like twine then um because i like right 00:12:54.620 --> 00:12:58.380 now i want to move everything over to trusted publishing but i still have a couple things that 00:12:58.400 --> 00:13:03.840 or not. So do you trust yourself? I mean, that's the question. Well, I don't actually, sometimes I 00:13:04.000 --> 00:13:09.420 don't trust myself either. That is so true. That is so true. Okay. Before we move off this uv thing 00:13:09.660 --> 00:13:13.980 really quick, I just learned yesterday, I was, I'm working on a project. I have always projects 00:13:14.280 --> 00:13:17.520 going in these little projects that I'm playing with and more and more, I'm building fun little 00:13:18.120 --> 00:13:23.780 utilities for me and they should be installed uv tool install. I want them broadly and I, 00:13:23.870 --> 00:13:27.640 but I'm not ready to put them on PyPI for sure. I don't really even want to put them on GitHub. 00:13:28.040 --> 00:13:39.100 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? 00:13:39.420 --> 00:13:45.480 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. 00:13:45.790 --> 00:13:55.820 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. 00:13:56.080 --> 00:13:59.020 And that will install the tool in editable mode. 00:13:59.020 --> 00:14:03.220 So you just keep editing, and the tool is like a machine-wide command, 00:14:03.920 --> 00:14:05.300 but it's not coming from somewhere else. 00:14:05.440 --> 00:14:07.460 It's just coming from your working GitHub repo. 00:14:08.120 --> 00:14:10.760 Oh, not GitHub repo, but you're just your directory. 00:14:11.140 --> 00:14:11.600 Your directory. 00:14:12.320 --> 00:14:12.820 Yeah, yeah, yeah. 00:14:13.040 --> 00:14:13.360 That's what I mean. 00:14:13.480 --> 00:14:14.480 You're just your local directory. 00:14:14.820 --> 00:14:15.200 Isn't that cool? 00:14:15.200 --> 00:14:15.340 Oh, cool. 00:14:15.520 --> 00:14:18.560 Kind of like you can do pip install dash a dot, 00:14:18.740 --> 00:14:20.360 and it just installs the local thing. 00:14:20.680 --> 00:14:21.220 Yeah, exactly. 00:14:21.560 --> 00:14:25.640 It's exactly the same, but it puts it into the uv tool install workflow. 00:14:26.020 --> 00:14:28.000 So it becomes like managed and global. 00:14:28.480 --> 00:14:29.120 That's pretty cool. 00:14:29.540 --> 00:14:34.740 Yeah, because the pip install dashi is like just if you activate that virtual environment sort of thing. 00:14:35.000 --> 00:14:35.160 Yeah. 00:14:35.380 --> 00:14:38.640 Also, there's not a lot of harm in publishing to PyPI. 00:14:39.080 --> 00:14:41.400 I mean, people can't give you negative stars or anything. 00:14:42.580 --> 00:14:42.780 Nope. 00:14:43.220 --> 00:14:46.020 No, I just don't want to commit to having the thing the way it is. 00:14:46.020 --> 00:14:48.800 I just want to play with it before I even decide I want to put out in the world. 00:14:48.880 --> 00:14:49.280 You know what I mean? 00:14:49.760 --> 00:14:54.420 But I want the coolness of the uv tool install equivalent that I don't have to juggle to find it. 00:14:54.660 --> 00:14:54.780 Nice. 00:14:54.860 --> 00:14:55.260 There it is. 00:14:55.500 --> 00:14:55.600 Yeah. 00:14:55.660 --> 00:14:55.840 Okay. 00:14:55.900 --> 00:15:01.380 Well, let's talk about the speed, the speed of the new Python. 00:15:02.000 --> 00:15:03.300 We have a couple of new Python stories. 00:15:03.400 --> 00:15:04.620 I know you got a new Python thing. 00:15:04.660 --> 00:15:06.880 I got a new Python thing at the end in our extras. 00:15:07.240 --> 00:15:10.200 But 3.14 has felt like such a, it's going to come. 00:15:10.240 --> 00:15:10.860 It's going to happen. 00:15:11.120 --> 00:15:12.040 But no, here we are. 00:15:12.620 --> 00:15:15.520 We're just after the release of 3.14. 00:15:15.880 --> 00:15:17.380 You know that because Halloween is coming. 00:15:17.840 --> 00:15:22.820 So Miguel Grinberg wrote a nice article called Python 3.14 is here. 00:15:23.160 --> 00:15:23.760 How fast is it? 00:15:23.960 --> 00:15:26.120 It might surprise people to see what the graphs say. 00:15:26.480 --> 00:15:27.160 There's a lot of graphs. 00:15:27.660 --> 00:15:27.860 Okay. 00:15:28.240 --> 00:15:29.060 It also has a caveat. 00:15:30.520 --> 00:15:32.400 These are small scale benchmarks. 00:15:33.300 --> 00:15:37.460 So please don't be mad at me if your use case is different than my use case. 00:15:37.530 --> 00:15:37.840 You know what I mean? 00:15:37.960 --> 00:15:39.280 That's how benchmarking goes. 00:15:39.480 --> 00:15:42.200 It's always fraught with, yeah, it's faster if you loop like that. 00:15:42.270 --> 00:15:44.060 But I do this other thing and mine is slower. 00:15:44.480 --> 00:15:48.740 So with that, as I said, there's a whole bunch of comparisons around here. 00:15:48.930 --> 00:15:53.279 So one of the biggest ones, I think the theme that comes away from this more 00:15:53.560 --> 00:15:59.780 and just there's some interesting trends is the threaded free threaded versus guild and can we 00:15:59.920 --> 00:16:04.520 call it guild that's like the opposite of free threaded right the guild python gilded the gilded 00:16:04.560 --> 00:16:10.740 age of python so there's a big comparison and sort of difference between the free threaded version 00:16:10.980 --> 00:16:17.400 and the standard traditional style another thing that's interesting is 311 was a big speed bump 00:16:17.760 --> 00:16:23.260 important performance i think that was probably the biggest performance jump for python pretty much 00:16:24.199 --> 00:16:26.380 at least in the modern recent times. 00:16:26.780 --> 00:16:30.060 3.11 is year over year the fastest jump, I think. 00:16:30.780 --> 00:16:34.140 That's really when this faster C-Python fruit came to be harvested, 00:16:34.320 --> 00:16:36.860 even though it was done in 3.9 and 3.10. 00:16:37.440 --> 00:16:40.880 And then it was almost flat, not 100% flat, but almost flat. 00:16:41.360 --> 00:16:45.300 And 3.14 is a little bit better, but there's a really interesting drop here. 00:16:45.760 --> 00:16:48.820 Also, PyPy, and I mean it this time, P-Y-P-Y, 00:16:49.100 --> 00:16:56.720 3.11 is five times faster or something just eyeballing it on the graph than 3.14 so there's 00:16:56.860 --> 00:17:01.320 still that that said i never run pypy i'm not against it i like the project i think it's cool 00:17:01.650 --> 00:17:06.160 i think it's great people are doing that but just all my projects it's like well this dependency 00:17:06.400 --> 00:17:10.339 doesn't work with it so nope can't use it you know what i mean the whole two versus three problem 00:17:10.350 --> 00:17:15.720 yeah we haven't talked about it for a while so just just in case people aren't sure pypy.org 00:17:15.740 --> 00:17:21.819 and that is the project and it's it's not c python it's python implemented in python correct 00:17:22.240 --> 00:17:25.600 is that you think that's yeah i believe so and it's odd that it's faster right but it's 00:17:25.900 --> 00:17:32.560 fully jit compiled which is the deal that's why it's faster so but still 314 faster cool but 00:17:32.760 --> 00:17:37.060 this is this next picture here is getting to the interesting comparison so you've got 00:17:37.620 --> 00:17:44.140 standard and you've got the um the micro jit i guess that python has now right it's got the 00:17:44.900 --> 00:17:50.380 find a couple of instructions and do optimizations on it, but there's not a broad level optimization 00:17:50.920 --> 00:17:55.800 compared here. And then there's also the free-threaded Python. And across the board, 00:17:56.120 --> 00:18:01.200 I guess actually this picture is pretty much, this is pretty positive. 3.13, standard versus JIT, 00:18:01.500 --> 00:18:04.680 basically no difference. Actually, the JIT one's a little bit slower on some of these, but again, 00:18:04.760 --> 00:18:09.980 these are really small micro benchmarks, so it doesn't have a chance to build up its JIT advantage. 00:18:10.360 --> 00:18:12.280 pays the startup cost of it, but not the, 00:18:12.500 --> 00:18:13.960 I don't know how much it's helping over time. 00:18:14.360 --> 00:18:15.540 Anyway, those are about the same, 00:18:16.100 --> 00:18:17.680 but the free threaded version, 00:18:18.230 --> 00:18:21.560 probably 20% slower or more than regular Python. 00:18:21.950 --> 00:18:24.400 And I thought free threading was supposed to be fast, Brian. 00:18:24.560 --> 00:18:25.200 What's going on here? 00:18:25.460 --> 00:18:28.180 Well, it's a benchmark that isn't using thread. 00:18:29.520 --> 00:18:31.560 Yes, so what this is showing is it says, 00:18:31.860 --> 00:18:34.780 if you are running in the free threaded Python, 00:18:35.820 --> 00:18:37.540 not even if you're using threading, 00:18:37.680 --> 00:18:39.980 not all of your code is going to be multi-threaded. 00:18:40.440 --> 00:18:45.440 right most herego probably isn't but some of it will and that part presumably is computationally 00:18:45.510 --> 00:18:49.340 heavy so you'll get a big boost there but the parts where it's not you actually pay a price to 00:18:49.370 --> 00:18:55.940 slow it down but here's the interesting takeaway from this graph is in 313 that's like 20 25 slower 00:18:56.180 --> 00:19:03.780 it's a problem in 314 it's almost the same that's a really big deal it's a smidge the overhead is 00:19:03.800 --> 00:19:10.300 less. It's a smidge slower to do one thread on free threaded Python, but it's, it's removed so 00:19:10.460 --> 00:19:14.940 much of that. You're paying a huge penalty in your regular code. Right. So that's actually really 00:19:15.100 --> 00:19:20.920 cool. Now here's somewhere down here. If I go to find more threads. Okay. They have the fourth, 00:19:21.120 --> 00:19:27.540 the multi-threaded one here. There we go. Now this is the graph. There's a four thread version 00:19:27.880 --> 00:19:33.720 that says we're going to do true multi-threading. Look at the standard Python versus free thread. 00:19:33.780 --> 00:19:40.340 well on which is better but on Linux I think the four threads is it's not quite 00:19:40.510 --> 00:19:45.080 four times faster but it's pretty close it's a lot lot better yeah and also this 00:19:45.080 --> 00:19:51.080 is true that 3:13 to 3:14 the 3:13 version is maybe double the speed with four 00:19:51.620 --> 00:19:57.660 threads the 3:14 is almost four times like at least three times faster so it's it's a 00:19:57.880 --> 00:20:01.720 really good story I think the takeaway here is that 3:14 is not much faster but 00:20:01.740 --> 00:20:04.320 But the multi-threading doesn't have so many penalties, 00:20:05.000 --> 00:20:06.980 but it does also have the benefits, 00:20:07.160 --> 00:20:08.240 which is exactly what you want. 00:20:08.460 --> 00:20:08.680 - Yeah. 00:20:08.760 --> 00:20:10.300 - There's still a compatibility story. 00:20:10.440 --> 00:20:11.780 Can you use free threading 00:20:11.800 --> 00:20:13.100 'cause of your dependencies and so on? 00:20:13.140 --> 00:20:15.940 But at least the runtime behavior is kind of in line 00:20:16.100 --> 00:20:16.940 with where you would expect. 00:20:17.360 --> 00:20:17.940 So, awesome. 00:20:18.280 --> 00:20:21.860 - It also looks, it's interesting that the using threads 00:20:22.420 --> 00:20:24.680 without threads, without free threading, 00:20:25.960 --> 00:20:29.220 is faster on 14 than, like 14 got faster anyway, 00:20:29.840 --> 00:20:31.280 even if you're not free threading. 00:20:31.560 --> 00:20:32.000 Yeah, that's awesome. 00:20:32.300 --> 00:20:32.400 Yeah. 00:20:32.680 --> 00:20:37.600 So there's a whole lot more stuff going on here and comments down here if you want to get into them. 00:20:37.700 --> 00:20:39.420 But that's the main takeaway. 00:20:39.900 --> 00:20:40.500 Oh, phew. 00:20:40.620 --> 00:20:43.660 I thought you were going to tell me that like 14 was slower or something. 00:20:44.240 --> 00:20:45.100 No, I don't think so. 00:20:45.560 --> 00:20:50.180 But it's not a tremendous boost for the regular one. 00:20:50.740 --> 00:20:51.960 That's not a reason not to upgrade, right? 00:20:52.040 --> 00:20:53.180 There's other benefits to it. 00:20:53.580 --> 00:20:53.740 Yeah. 00:20:53.900 --> 00:20:58.160 And that also, I guess, makes sense why we still have two versions. 00:20:58.800 --> 00:21:00.180 We're shipping two versions of Python. 00:21:01.020 --> 00:21:08.080 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 00:21:08.240 --> 00:21:15.760 extra character to type exactly yeah okay it's it's lighter than air to to switch maybe um speaking 00:21:15.760 --> 00:21:22.700 of air lighter than air here you go uh so there's a new project and it's it is pretty new so this 00:21:22.960 --> 00:21:29.880 there's a project called air from the felderoys um daniel and audrey and they're the folks that 00:21:29.860 --> 00:21:39.660 brought us two scoops of Django. So this is a project called Air, and it's not that old either. 00:21:40.400 --> 00:21:46.360 Looks like a month or so, maybe. A lot of activity just recently, but it's already up to 525 stars. 00:21:46.680 --> 00:21:54.159 So we're watching it. And what is Air? Air is a new web framework that breathes fresh air into 00:21:54.180 --> 00:22:00.480 Python web development built with it's a it's built on top of FastAPI starlet and pedantic and 00:22:00.840 --> 00:22:07.200 there is I haven't really played with it but it's it's some interesting stuff one of the interesting 00:22:07.440 --> 00:22:13.060 things that is these air tags and I personally not sure how I feel about this but it's sort of 00:22:13.160 --> 00:22:19.520 fun looking at looking it down at some examples I'm guessing that these air tags are these things 00:22:19.540 --> 00:22:26.320 like air.html air.h1 so you can sort of programmatically generate html from it but 00:22:26.600 --> 00:22:31.400 um but apparently if you want a mix of that so you've got some stuff that's dynamic that you're 00:22:31.500 --> 00:22:37.800 using these air tag things to generate your html you can also do uh Jinja 2 templates at the same 00:22:37.940 --> 00:22:43.060 time um and and so that's kind of cool so you can kind of mix them wherever it makes sense 00:22:43.090 --> 00:22:48.860 in your application um and i'd i'd love to hear more about like the thought process around this 00:22:48.880 --> 00:22:55.300 but interesting and and from from some interesting people and i was taking a look at this and i'm 00:22:55.420 --> 00:23:02.960 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 00:23:02.970 --> 00:23:08.720 i wanted to cover this because it's awesome it says that air is uh it's it's highly unstable 00:23:09.000 --> 00:23:13.580 and experimental web framework we have not officially launched to the public yet every 00:23:13.820 --> 00:23:18.320 release could break your code if you have to ask why you should use it you probably it's probably 00:23:18.340 --> 00:23:24.180 not for you. It gets better. If you want to use Air, you can, but we don't recommend it. 00:23:24.520 --> 00:23:29.840 It's not enterprise ready and will likely never be, at least definitely not before the official 00:23:30.080 --> 00:23:35.160 launch. It also will likely infect you, your family and your code bases with an evil web 00:23:35.460 --> 00:23:41.700 framework mind virus. This is good. Distracting you and that you'll never ship and everything. 00:23:41.830 --> 00:23:47.700 So it's just, they recommend not using Air, but I think it's just really good writing and maybe 00:23:47.720 --> 00:23:48.560 reverse psychology. 00:23:48.980 --> 00:23:53.380 So kind of some fun mix of HTMX friendly stuff, 00:23:54.480 --> 00:23:55.380 some of the best practices. 00:23:56.020 --> 00:23:58.240 And I guess reminding folks, 00:23:59.080 --> 00:24:01.180 these folks are building websites all the time. 00:24:01.460 --> 00:24:04.720 So I'm interested to watch what they come up with here. 00:24:04.960 --> 00:24:05.940 Yeah, it looks very interesting. 00:24:06.840 --> 00:24:09.960 We'll see if it, I have no air metaphors. 00:24:10.160 --> 00:24:10.740 Yeah, no air metaphors. 00:24:10.740 --> 00:24:11.820 But yeah, it's an interesting project. 00:24:12.240 --> 00:24:12.540 All right. 00:24:13.440 --> 00:24:15.140 Those are our main topics. 00:24:16.140 --> 00:24:16.700 Do you have any extras? 00:24:17.380 --> 00:24:18.260 - I sure do. 00:24:18.440 --> 00:24:20.220 I have a couple I'll, I can go through quick. 00:24:20.460 --> 00:24:21.760 Some are quick, some are not as quick, 00:24:21.820 --> 00:24:22.540 but they're all pretty quick. 00:24:22.920 --> 00:24:24.380 So I already talked to the Talk Python 00:24:24.580 --> 00:24:25.820 and production book is out. 00:24:26.360 --> 00:24:27.500 It's doing great. 00:24:27.920 --> 00:24:29.980 By the way, Brian, something that is really 00:24:30.740 --> 00:24:33.680 kind of mind blowing to me, but also really cool. 00:24:33.980 --> 00:24:36.120 You come over here to the ratings, 00:24:37.020 --> 00:24:39.680 number one in software engineering on Amazon right now. 00:24:39.960 --> 00:24:40.700 That's awesome. - Wow. 00:24:41.140 --> 00:24:41.580 - I know. 00:24:42.100 --> 00:24:43.240 - That's great. - And an application. 00:24:43.240 --> 00:24:43.500 - Thank you. 00:24:43.740 --> 00:24:44.460 It's crazy. 00:24:45.640 --> 00:24:49.640 So I just wanna, the only thing is I've already announced that before, but it's doing really well. 00:24:49.670 --> 00:24:55.720 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. 00:24:55.730 --> 00:24:57.100 So I'll link to that blog post. 00:24:57.560 --> 00:25:05.420 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. 00:25:05.680 --> 00:25:06.500 Although I published it. 00:25:06.930 --> 00:25:08.260 No, it's not on PyPI yet, I don't believe. 00:25:08.540 --> 00:25:09.080 But yeah, it is. 00:25:09.150 --> 00:25:09.740 It is on PyPI. 00:25:09.750 --> 00:25:10.520 I did publish this one. 00:25:10.780 --> 00:25:11.540 I have a couple going. 00:25:11.880 --> 00:25:12.340 It's confusing. 00:25:12.610 --> 00:25:15.060 So this one here, let me give you a problem. 00:25:15.320 --> 00:25:19.380 Okay, Brian, you're working with your AI tools, your agentic AI. 00:25:19.820 --> 00:25:25.780 And one of the never-ending problems of working with these is if you run out of credits, 00:25:26.260 --> 00:25:29.940 you're either done for the month or you have to switch to pay-as-you-go billing. 00:25:30.580 --> 00:25:34.780 Like, for example, I had the $16 a month cursor plan, 00:25:35.200 --> 00:25:37.240 and then I started doing a whole bunch of projects. 00:25:37.260 --> 00:25:38.100 It was super successful. 00:25:38.240 --> 00:25:39.820 I'm like, I'm going to keep using this on the thing. 00:25:40.040 --> 00:25:41.520 But I ran out of credits, so I had to switch. 00:25:41.820 --> 00:25:45.340 I paid like $250 in overage credits for a month, 00:25:45.590 --> 00:25:48.880 which I paid gladly because it solved tons of problems. 00:25:48.950 --> 00:25:50.960 If that was a person I hired to do that, 00:25:51.190 --> 00:25:53.400 it would have both taken months instead of days, 00:25:53.780 --> 00:25:55.620 and it would have taken more than $200. 00:25:56.040 --> 00:25:59.360 That said, knowing, like, do I need to slow down, 00:25:59.550 --> 00:26:02.840 or am I going to have a whole bunch of leftover prepaid credits 00:26:03.120 --> 00:26:04.380 with whatever plan you have? 00:26:04.760 --> 00:26:06.140 Knowing that is really helpful. 00:26:06.250 --> 00:26:09.500 So I created this really simple TUI that you run it, 00:26:09.960 --> 00:26:12.980 and you configure it to know what your renewal day is. 00:26:13.060 --> 00:26:16.500 So if every month on the 16th, your credits renew, 00:26:16.980 --> 00:26:19.820 and it's the 24th of the prior month, let's say, 00:26:20.180 --> 00:26:21.700 and you've used 30% of your credits, 00:26:22.120 --> 00:26:23.860 if you keep going like that, are you going to run out? 00:26:24.260 --> 00:26:25.200 Or are you going to have a bunch left? 00:26:25.390 --> 00:26:27.320 In which case, maybe you tackle a bigger project 00:26:27.580 --> 00:26:30.340 that you know is going to burn up a bunch of credits 00:26:30.430 --> 00:26:31.740 and you're waiting or something like that. 00:26:31.940 --> 00:26:34.140 So all you do is you run this thing called AI usage. 00:26:34.580 --> 00:26:37.060 You type in whatever percent your little tool tells you, 00:26:37.200 --> 00:26:38.720 like this picture here says, 00:26:38.860 --> 00:26:40.120 You've used 35% of your credit. 00:26:40.260 --> 00:26:40.380 Okay. 00:26:41.120 --> 00:26:41.920 AI usage, 35. 00:26:42.140 --> 00:26:43.560 It says, cool, guess what? 00:26:43.900 --> 00:26:47.480 It's only day 12 of 31 out of your renewal days. 00:26:48.580 --> 00:26:52.620 So if you've used 25%, that's actually, or whatever, you know, this example is 25. 00:26:53.020 --> 00:26:57.980 So that's actually 13% less than if you were like on average using all of them. 00:26:58.280 --> 00:27:01.000 And so you're going to have by the end only use 64%. 00:27:01.000 --> 00:27:03.300 So you're going to have like 35% more you can go grind on. 00:27:03.680 --> 00:27:07.680 So go be ambitious or choose a more expensive but better resulting model or something like that. 00:27:07.980 --> 00:27:09.500 So that's a little utility I built for people. 00:27:09.800 --> 00:27:10.180 That's cool. 00:27:10.520 --> 00:27:10.640 Thanks. 00:27:10.670 --> 00:27:11.400 Let me rephrase that. 00:27:11.450 --> 00:27:14.120 I built it for myself, and then I just put it out there because I thought people might 00:27:14.230 --> 00:27:14.880 find it useful. 00:27:15.080 --> 00:27:18.920 You built it for other people that you actually also find useful. 00:27:19.700 --> 00:27:19.900 Exactly. 00:27:20.830 --> 00:27:21.060 All right. 00:27:21.110 --> 00:27:26.360 Then I did this little thread called Show Me Your LS, and unfortunately, I use sans-serif 00:27:26.700 --> 00:27:29.000 fonts, so it just looks like it says Show Me Your Is. 00:27:30.740 --> 00:27:31.180 You know, whatever. 00:27:31.310 --> 00:27:31.880 Like, I can't do it. 00:27:31.900 --> 00:27:33.920 I'm not changing my web fonts just for one post. 00:27:34.240 --> 00:27:40.660 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. 00:27:40.700 --> 00:27:49.100 So if you look at the default terminal experience on Mac, even on a $3,000 Mac running 2025 latest OS, it's dreadful. 00:27:49.300 --> 00:27:54.920 I mean, like, oh, my gosh, it has like the folder name, then dash bash, dash bash, dash bash. 00:27:56.420 --> 00:27:57.820 Just like, oh, my God, what is this thing? 00:27:58.120 --> 00:28:00.220 Just put what I'm using out there now. 00:28:00.300 --> 00:28:03.800 So right now I'm using this one that basically shows icons for 00:28:03.800 --> 00:28:07.140 the different file types that uses the .gitignore to show hidden or 00:28:07.240 --> 00:28:10.920 unhidden files and developer conventions and it shows the file size and 00:28:11.160 --> 00:28:12.680 human readable sizes and stuff like that. 00:28:12.780 --> 00:28:15.100 So I just thought I wanted to inspire people to play around a little. 00:28:15.540 --> 00:28:17.040 So people can check that out. 00:28:18.200 --> 00:28:21.960 Yeah, so people want to check out this little blog post and 00:28:22.240 --> 00:28:24.260 get inspired about making your terminal better. 00:28:24.600 --> 00:28:26.840 Also, have you heard of Helium, the browser? 00:28:27.320 --> 00:28:28.960 I think you mentioned, maybe, I don't know. 00:28:29.200 --> 00:28:29.820 I think I have. 00:28:30.050 --> 00:28:30.140 Okay. 00:28:30.530 --> 00:28:33.980 So it's the best privacy and unbiased ad blocker by default. 00:28:34.130 --> 00:28:36.920 So it comes built in with ad blocker, ad block plus. 00:28:37.010 --> 00:28:38.220 I don't know what, some kind of ad block, 00:28:38.540 --> 00:28:41.000 one of the better ad blocks as part of the thing. 00:28:41.010 --> 00:28:42.360 And it's based on Chrome and so on. 00:28:42.620 --> 00:28:43.780 And, you know, it's, it's kind of neat. 00:28:44.200 --> 00:28:45.280 It's basically a Chromium browser. 00:28:45.560 --> 00:28:48.700 It's not pulling me away from Vivaldi at any moment right now. 00:28:48.710 --> 00:28:52.380 I really like the way Vivaldi works and the customizations and the side tabs 00:28:52.390 --> 00:28:53.060 and all that kind of stuff. 00:28:53.380 --> 00:28:55.380 But I was just poking around like, oh, that's interesting. 00:28:55.480 --> 00:28:57.620 I'm always here for understanding new browsers. 00:28:58.080 --> 00:29:00.100 Come over to the GitHub repo. 00:29:00.620 --> 00:29:01.540 See what it says about languages? 00:29:02.080 --> 00:29:03.420 97.4% Python. 00:29:03.740 --> 00:29:04.220 Oh, wow. 00:29:04.560 --> 00:29:04.820 That's cool. 00:29:05.260 --> 00:29:05.420 Yeah. 00:29:05.760 --> 00:29:08.060 So it's not that the entire browser is Python 00:29:08.200 --> 00:29:10.460 because it just is wrapping Chromium, 00:29:10.600 --> 00:29:12.980 which is C, C++, something like that. 00:29:13.320 --> 00:29:15.560 But what's interesting is if you just look around, 00:29:15.980 --> 00:29:18.360 it's full of all these little Python scripts 00:29:18.460 --> 00:29:21.520 to basically take Chromium and build it into an entire browser, 00:29:21.980 --> 00:29:23.120 which I thought was pretty interesting. 00:29:23.500 --> 00:29:26.060 So people might want to look around this repo. 00:29:26.880 --> 00:29:30.560 Yeah, we could use a handful of forks then to make some cool stuff. 00:29:31.000 --> 00:29:31.340 Yeah, exactly. 00:29:31.940 --> 00:29:33.540 All right, the last thing is super short. 00:29:33.810 --> 00:29:41.440 I present to you the world's smallest CPython release, 3.13.9 final, released yesterday. 00:29:41.940 --> 00:29:45.280 It has literally one change in spec to get source lines. 00:29:45.700 --> 00:29:52.100 And that change is to deal with the case when a decorator is followed by a comment and then the function. 00:29:52.400 --> 00:29:53.880 Something about the lines gets messed up. 00:29:54.560 --> 00:29:55.800 Amazing that they released it. 00:29:56.600 --> 00:29:59.000 I mean, I know it's important for certain things, 00:29:59.220 --> 00:30:01.680 but normally these things are just like scroll, scroll, 00:30:01.830 --> 00:30:03.720 like changes, changes, changes, changes, changes. 00:30:03.890 --> 00:30:06.380 So anyway, 3.13.9 is out, 00:30:06.740 --> 00:30:10.480 though it's likely it's not something you need to rush out and install. 00:30:10.720 --> 00:30:11.920 You should install 3.14 anyway. 00:30:12.640 --> 00:30:14.800 Yeah, maybe it was just a schedule, whatever's in there. 00:30:15.440 --> 00:30:15.920 Yeah, perhaps. 00:30:16.240 --> 00:30:17.020 A couple weeks later. 00:30:17.600 --> 00:30:18.160 All right, over to you. 00:30:18.320 --> 00:30:21.840 Well, we have another release that I was going to talk about, 00:30:22.000 --> 00:30:23.060 which is 315. 00:30:23.830 --> 00:30:27.340 So 315 alpha one is out already. 00:30:28.360 --> 00:30:32.360 Hugo posted a couple of days ago and major new features. 00:30:32.880 --> 00:30:32.940 Okay. 00:30:33.120 --> 00:30:33.340 So it's, 00:30:33.560 --> 00:30:33.700 it's, 00:30:33.840 --> 00:30:36.800 it's pretty new stuff already cause but it's, 00:30:36.960 --> 00:30:38.060 it's rolling out so people can, 00:30:38.460 --> 00:30:41.860 there's a play with that dedicated profiling package for profile, 00:30:42.560 --> 00:30:43.260 profiling tools. 00:30:44.020 --> 00:30:44.960 This one's actually kind of cool. 00:30:45.520 --> 00:30:50.140 Pep 686 Python now uses UTF eight as the default encoding. 00:30:50.580 --> 00:30:57.500 It has kind of bugged me that when I encode stuff, it doesn't default to UTF-8, but now it does. 00:30:57.700 --> 00:30:58.120 So that's good. 00:30:58.860 --> 00:31:04.240 Actually, it doesn't really bug me that much because I usually just specify the UTF-8 encoding. 00:31:04.410 --> 00:31:05.320 Yeah, I do too. 00:31:05.540 --> 00:31:06.340 But you don't want to forget. 00:31:06.480 --> 00:31:08.400 And it's not an enumeration. 00:31:08.620 --> 00:31:09.120 It's a string. 00:31:09.200 --> 00:31:11.160 You've got to just type UTF-8. 00:31:11.710 --> 00:31:14.680 Yeah, so there'll be less of that typing now. 00:31:14.780 --> 00:31:15.160 It'll be good. 00:31:15.680 --> 00:31:37.840 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. 00:31:37.900 --> 00:31:43.700 I probably wouldn't put it in CI right now or somehow put it in CI that it doesn't stop you from shipping. 00:31:44.220 --> 00:31:46.520 But for local testing, why not? 00:31:47.160 --> 00:31:53.000 And to help you with local testing, you can already pip install it with or not pip install it, 00:31:53.080 --> 00:32:00.480 but you can uv Python install 315 because Astral's uv supports 315 now. 00:32:00.690 --> 00:32:01.460 So that's cool. 00:32:01.840 --> 00:32:02.860 I'm glad Astral exists. 00:32:04.220 --> 00:32:04.340 Yeah. 00:32:05.280 --> 00:32:09.960 I could never remember how to install the alpha releases and stuff. 00:32:10.200 --> 00:32:11.940 And it just, it's easy now. 00:32:12.420 --> 00:32:12.560 Okay. 00:32:12.980 --> 00:32:16.560 We, I threatened to write a few blog posts. 00:32:16.720 --> 00:32:18.860 So I did lazy imports. 00:32:19.100 --> 00:32:21.180 We talked about it might come in. 00:32:21.260 --> 00:32:27.800 It's a proposal that hasn't been accepted yet for 3.15, but you can use, there's techniques 00:32:28.060 --> 00:32:29.780 for using lazy imports right now. 00:32:29.980 --> 00:32:31.200 And these are not complicated. 00:32:31.520 --> 00:32:33.200 This isn't something extra you install. 00:32:33.620 --> 00:32:39.020 But I posted Python lazy imports you can use today on pythontest.com. 00:32:39.500 --> 00:32:45.120 And also just a quick rundown of all the things that I mostly wrote it for me, 00:32:45.370 --> 00:32:50.140 all the things I change when I add some testing for a new version. 00:32:50.590 --> 00:32:57.820 So I updated testing in 3.14 and almost immediately got some feedback to add. 00:32:58.760 --> 00:32:59.720 I tried to give a shout out. 00:33:00.300 --> 00:33:03.100 Christian Klaus said, hey, you forgot free threading. 00:33:03.400 --> 00:33:09.520 So I added a section to all the stuff I changed to support free threaded Python. 00:33:10.600 --> 00:33:10.720 Nice. 00:33:11.020 --> 00:33:11.800 Not the guild version. 00:33:12.700 --> 00:33:14.800 Not the guild, but non-fish version. 00:33:16.440 --> 00:33:19.900 So it's just mostly adding a 3.14T in a couple places. 00:33:20.460 --> 00:33:22.020 But I was checking out. 00:33:22.120 --> 00:33:28.280 I'm like, well, do I need to do something special about the Trove classifiers? 00:33:28.860 --> 00:33:30.080 And I went and looked. 00:33:30.300 --> 00:33:32.340 And there are, I didn't realize this before. 00:33:32.680 --> 00:33:37.240 You can add a free-threading Trove classifier now 00:33:37.500 --> 00:33:41.580 if you want to broadcast that you're supporting free-threading on PyPI. 00:33:41.880 --> 00:33:42.600 You can add that. 00:33:43.520 --> 00:33:47.720 And there's also how stable it is. 00:33:47.960 --> 00:33:51.920 So there's non-free-threaded stability, 00:33:52.220 --> 00:33:54.540 but apparently you can have stable, unstable, beta, 00:33:55.240 --> 00:33:57.260 resilient as far as free-threading goes. 00:33:57.700 --> 00:34:01.680 So if you're working on supporting it and it mostly works, 00:34:01.760 --> 00:34:04.180 you can sort of advertise that if you want, I guess. 00:34:04.370 --> 00:34:04.960 Yeah, lovely. 00:34:05.420 --> 00:34:07.120 I didn't know about the Trove classifiers either. 00:34:07.390 --> 00:34:08.500 Going forward, that's going to be a thing. 00:34:09.480 --> 00:34:11.940 Yeah, and I guess that's it for extras. 00:34:12.520 --> 00:34:12.879 All right. 00:34:13.399 --> 00:34:14.899 I got a joke for you, obviously. 00:34:15.460 --> 00:34:17.139 This one is a Linux joke. 00:34:17.460 --> 00:34:18.500 Are you familiar with Arch Linux? 00:34:20.139 --> 00:34:20.500 Vaguely. 00:34:20.899 --> 00:34:21.260 Vaguely. 00:34:21.440 --> 00:34:23.340 So I'm pretty much me as well. 00:34:23.500 --> 00:34:28.120 But the zen of Arch Linux is that it's the absolute minimal, 00:34:28.540 --> 00:34:31.720 most empty thing set up that then you choose like, 00:34:31.820 --> 00:34:33.560 oh, I want to have this kind of shell. 00:34:33.800 --> 00:34:34.940 Oh, I want to have this feature. 00:34:35.100 --> 00:34:37.120 And everything is adding it in, right? 00:34:37.399 --> 00:34:37.760 Oh, okay. 00:34:38.159 --> 00:34:38.260 Okay. 00:34:38.560 --> 00:34:40.740 So there's, you know, some upside to that. 00:34:41.139 --> 00:34:44.360 So anyway, the joke is here we have the small, 00:34:45.040 --> 00:34:48.860 presumably geeky little programmer type in an orange jumpsuit in a jail 00:34:49.000 --> 00:34:52.679 sitting next to the biggest, toughest looking thug you can imagine. 00:34:53.020 --> 00:34:54.800 The thug says, killed a man. 00:34:55.100 --> 00:34:57.000 You, little character looks over and says, 00:34:57.300 --> 00:34:58.880 I installed apt on Arch Linux. 00:34:59.420 --> 00:35:00.040 Dude, what? 00:35:00.180 --> 00:35:01.280 The guys creeped. 00:35:01.360 --> 00:35:02.120 Like the big thugs. 00:35:02.240 --> 00:35:02.720 Like all creeped out. 00:35:02.820 --> 00:35:03.760 What are you doing, bro? 00:35:04.760 --> 00:35:05.900 God, get away from me. 00:35:09.200 --> 00:35:09.560 It's good, right? 00:35:10.420 --> 00:35:10.600 Yeah. 00:35:11.700 --> 00:35:12.560 So you got the comments. 00:35:13.660 --> 00:35:14.500 Kind of want to do this now. 00:35:14.580 --> 00:35:15.020 Go ahead. 00:35:15.320 --> 00:35:15.680 Love it. 00:35:15.920 --> 00:35:16.380 I love it. 00:35:16.440 --> 00:35:18.220 How I can understand these jokes now. 00:35:18.380 --> 00:35:20.420 Someone says like, I'm getting good at Linux. 00:35:20.600 --> 00:35:21.380 I know what it means. 00:35:22.160 --> 00:35:22.300 Okay. 00:35:23.100 --> 00:35:23.580 What is apt? 00:35:24.560 --> 00:35:24.860 Do you know? 00:35:25.060 --> 00:35:25.200 Apt? 00:35:25.700 --> 00:35:25.800 Yeah. 00:35:25.960 --> 00:35:28.400 It's the thing you install. 00:35:28.740 --> 00:35:31.540 It's like the pip of Ubuntu and stuff. 00:35:31.550 --> 00:35:32.520 You apt install. 00:35:33.040 --> 00:35:33.260 Okay. 00:35:33.720 --> 00:35:37.300 Just doubted myself for not using Linux for a very long time. 00:35:37.620 --> 00:35:38.060 So, yeah. 00:35:38.740 --> 00:35:41.520 Dude, don't get away from me, you monster. 00:35:44.060 --> 00:35:45.660 Anyway, I thought it was fun. 00:35:45.940 --> 00:35:46.820 Yeah, that's fun. 00:35:47.140 --> 00:35:47.280 Yeah. 00:35:47.820 --> 00:35:48.640 Plus, the art is nice. 00:35:48.960 --> 00:35:49.720 The art is lovely. 00:35:49.970 --> 00:35:50.840 Yeah, the art is really good. 00:35:51.100 --> 00:35:54.540 I think I appreciate art a little bit more now that there's a lot of vibe in art. 00:35:55.060 --> 00:35:59.700 you see real art you're like that's nice yeah and this isn't art but i was we commented before we 00:35:59.710 --> 00:36:05.220 started recording i'm just loving the kind of the blue lighting that my robot is experiencing right 00:36:05.360 --> 00:36:11.600 now today that's nature's light nature's light yeah it's cold out um anyway um awesome uh episode 00:36:11.750 --> 00:36:16.340 today again and thanks michael thanks everybody for listening we'll catch you next week catch you 00:36:16.370 --> 00:36:16.740 later bye