WEBVTT

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

00:00:05.280 --> 00:00:09.560
This is episode 449, recorded September 15th, 2025.

00:00:10.330 --> 00:00:11.240
And I am Brian Okken.

00:00:11.460 --> 00:00:12.160
And I am Michael Kennedy.

00:00:12.640 --> 00:00:16.660
And of course, this episode, not of course, but this episode is sponsored by us.

00:00:16.690 --> 00:00:21.560
So please check out the stuff we offer you guys and everyone.

00:00:22.200 --> 00:00:26.200
Courses at Talk Python Training, pytestCourses at Pythontest.com.

00:00:26.520 --> 00:00:28.940
And there's also one at Talk Python Training too.

00:00:29.580 --> 00:00:32.160
And then Patreon supporters, we love you.

00:00:32.480 --> 00:00:33.380
Thanks for supporting the show.

00:00:33.980 --> 00:00:40.120
If you'd like to have a suggestion for the show or like to get a hold of us, we're on Bluesky and Mastodon.

00:00:40.440 --> 00:00:41.300
Links are in the show notes.

00:00:41.839 --> 00:00:49.040
And as normal, this is currently Monday at 7 a.m., but normally it's Monday at 10 a.m.

00:00:49.280 --> 00:00:54.860
If you'd like to watch the show live, you can go to pythonbytes.fm/live and catch it.

00:00:55.040 --> 00:00:57.080
And you can even interact with us while we're recording.

00:00:57.760 --> 00:01:01.920
Finally, I'd like to thank everybody that's joined up for the newsletter.

00:01:02.200 --> 00:01:13.840
You can go to pythonbytes.fm and join the newsletter, and you get all the links that we talk about in the show, plus extra information on how to digest that, even if you're not listening at the time.

00:01:14.060 --> 00:01:15.180
We'll send that right to your inbox.

00:01:15.780 --> 00:01:18.360
So lots of cool stuff to talk about today.

00:01:19.140 --> 00:01:20.100
Let's kick it off, Michael.

00:01:20.480 --> 00:01:24.600
Yeah, let's kick it off with a little FOSS news, free and open source software.

00:01:25.200 --> 00:01:29.500
And this is, I don't know, maybe the story is kind of the opposite of FOSS.

00:01:29.940 --> 00:01:37.240
Giant trillion dollar company interacts with Monopoly court, but the consequences may fall down to open source software.

00:01:38.000 --> 00:01:53.320
And Judge Mehta from the Google antitrust monopoly case has ruled on the remedy for Google being a monopolist who abused their privilege in ad search, in ad space, in search and so on.

00:01:53.560 --> 00:02:04.140
So there were many different possibilities floated, even by the prosecution, like, you know, you probably need to sell Chrome and you may need to divest from Android, things like that, which would have been wild.

00:02:04.920 --> 00:02:09.060
I know that OpenAI and gosh, was it Cursor?

00:02:09.399 --> 00:02:11.160
Might have been Cursor or Anthropic.

00:02:11.460 --> 00:02:14.900
I can't, one of the, one of the AI companies was like, oh yeah, we'll take it.

00:02:15.080 --> 00:02:15.620
We'll buy.

00:02:16.180 --> 00:02:18.200
And I know perplexity threw their hat in there.

00:02:18.260 --> 00:02:18.900
We'll buy Chrome.

00:02:19.400 --> 00:02:23.080
One of them offered to buy Chrome for like 10 times their, their valuation.

00:02:24.080 --> 00:03:22.180
they're like we're gonna fire divestors we don't care but it turns out none of that is going to be that happened in an alternate reality or i don't know were you ever a fan to choose your adventure books brian yeah they went to page 11 instead of page 42 on this one and so there will be no selling of chrome there will be no divesting of android and the reason this is even on the show although all these things are fun to imagine is mozilla and firefox exist almost solely in their current form because some of the bad behavior of Google, right? Google, one of the big problems was Google's paying Apple something like 26, 20, 20-ish billion dollars a year just to say, yeah, make, make Google the default in Safari search on iPhone, right? But the other one was, for reasons I don't still fully understand, although I think they might not be 100% goodwilled, they are also paying 85% of Mozilla's bill every year to exist.

00:03:22.560 --> 00:03:22.860
Wow.

00:03:23.200 --> 00:03:25.460
Like they're 85% of Mozilla's revenue.

00:03:25.900 --> 00:03:31.580
So one of the remedies could be, you can't be paying all these companies to like make you the default search engine.

00:03:31.780 --> 00:03:36.240
Same reason, that's what Mozilla was getting is like default search engine on Mozilla equals Google.

00:03:36.540 --> 00:03:38.960
Here's $100 million a year or whatever it was.

00:03:39.300 --> 00:03:39.600
Okay.

00:03:40.060 --> 00:03:40.340
Go ahead.

00:03:40.580 --> 00:03:42.840
No, I was just looking at the notes.

00:03:43.900 --> 00:03:58.120
you wrote down that the google can keep paying mozilla to make google but only if it's if the deals are are not exclusive i don't understand how i believe what that means is um they let's say

00:03:58.660 --> 00:04:08.479
you know i'm a fan of like start page and kagi yeah i think they can't like say we'll pay you 100 million dollars and no one else can pay you anything to be like privileged or something along

00:04:08.500 --> 00:04:19.239
those lines okay because like only one person can be the default but yeah that's true maybe somebody could be like top on the list or something yeah i think something like that yeah i don't i haven't

00:04:19.239 --> 00:06:01.860
read the whole ruling right um the idea is that would be a totally reasonable remedy as part of this like selling chrome which maybe is a little less reasonable but still yeah i'm here for it it was so interesting okay um but a lot of people would a lot would have lost a lot of revenue like mozilla right exactly like i don't care if apple is revenue they can suck it up they they make more money than anyone and they're gonna get a bunch of my money when they ship new computers and ipads in a month or two so it's gonna be fine i'll backfill that for them but mozilla 85 the revenue you as a company with hundreds of employees you can't lose 85 of your income and not get it would just make mozilla fold i think yeah or maybe just focus i agree that it would probably make them fold in the short term maybe in the long term it just makes them focus on providing products so anyway this is there's a bit of a long conversation around just this but um i think you know i wrote i wrote the hey on the unsolicited advice from mozilla giving him like five business ideas that should be not just depend on google yeah um not that they necessarily need to take him or that it was like a big deal but there are certainly things that they could do and they should have started doing five years ago and maybe now is better than never. Because this is not Google promises to keep paying Mozilla's bill forever. This is the law will not make Google stop paying them. This deal is up for renewal in 2026. So it still could get canceled. I mean, when I said, I'm not sure about the motives of Google, if Google is paying them just because, hey, we definitely want Google to be the top search thing in your browser, Google could decide, you know, the market share is getting down and down and down.

00:06:01.880 --> 00:06:03.660
And maybe it just doesn't make sense to pay that anymore.

00:06:04.200 --> 00:06:04.500
It's done.

00:06:04.940 --> 00:06:05.220
Yeah.

00:06:05.520 --> 00:06:07.740
And that just seems icky also.

00:06:07.880 --> 00:06:14.580
It does seem like Google's just keeping Mozilla around so that they are not the, just to keep competition there.

00:06:14.940 --> 00:06:17.100
Just to not look like a monopolist, right?

00:06:17.420 --> 00:06:17.520
Yeah.

00:06:17.680 --> 00:06:17.860
Exactly.

00:06:18.420 --> 00:06:20.560
But now they've been punished as a monopolist.

00:06:20.840 --> 00:06:22.400
The fines have been determined.

00:06:22.540 --> 00:06:25.020
There are no more consequences, right?

00:06:25.480 --> 00:06:26.620
So do they still have to pay?

00:06:26.640 --> 00:06:30.160
I mean, no one's going to say, well, look, they're not a monopolist because of Firefox.

00:06:30.330 --> 00:06:32.760
They are legally declared to be a monopolist.

00:06:33.120 --> 00:06:36.720
So that check, that guard by doing that is gone.

00:06:37.800 --> 00:06:45.640
The market share of Mozilla is tweaking down enough that maybe it just, they are like, you know, it's not even worth like the vendor registration that we do.

00:06:45.740 --> 00:06:46.900
Like it could be a huge problem.

00:06:47.020 --> 00:06:51.120
It could also be that Google wants to show some goodwill and do this, but I don't know.

00:06:51.220 --> 00:06:52.220
It's still tenuous.

00:06:52.400 --> 00:06:53.500
This is not like, oh, they're fine.

00:06:54.740 --> 00:06:55.100
Interesting.

00:06:56.880 --> 00:06:58.580
- It's a super interesting thing to follow.

00:06:59.580 --> 00:07:01.260
We'll see where it goes, but yeah,

00:07:01.500 --> 00:07:05.480
they should probably hustle and start getting some things that are not being paid.

00:07:05.940 --> 00:07:22.040
And let's put a bow on it, but final thought is, I think you're right on point that it's icky and it's icky because when Mozilla makes choices about how to like defend users, like for example, you know, that fingerprinting, like not the ad blocking, but that creepy stuff where you ask, well, what fonts are installed?

00:07:22.260 --> 00:07:25.780
this JavaScript runtime has this speed behavior.

00:07:26.040 --> 00:07:27.480
So that means it's actually this person.

00:07:27.880 --> 00:07:30.720
It's down to like two people in the world and only one person visited our site.

00:07:30.800 --> 00:07:33.900
So we can track them like not just as good as a cookie.

00:07:34.340 --> 00:07:37.520
Like those kinds of things that would be lovely to have.

00:07:37.880 --> 00:07:38.020
Yeah.

00:07:38.300 --> 00:07:40.800
I actually don't know if Firefox has that or not, but I don't think so.

00:07:41.060 --> 00:07:42.060
I think Brave might.

00:07:42.320 --> 00:07:46.960
Anyway, there's exact opposite incentives like for Firefox.

00:07:47.220 --> 00:07:51.120
One is the users would be better off if they were actually a private browser that did that kind of stuff.

00:07:51.320 --> 00:07:56.080
Two, Google would be more upset with them and less likely to pay them their salary.

00:07:56.520 --> 00:08:01.140
That just puts them in a, hey, we could be for the users or we could be for our job.

00:08:01.900 --> 00:08:02.300
I'm not a fan.

00:08:02.580 --> 00:08:03.040
What a morning.

00:08:03.280 --> 00:08:10.540
We're going to go from lawsuits to trove classifiers.

00:08:11.020 --> 00:08:12.620
This will wake everybody up.

00:08:12.920 --> 00:08:17.540
Are you telling me that pytest-check has been declared a monopoly pytest plugin?

00:08:18.460 --> 00:08:20.080
No, I just wanted to pick one.

00:08:20.120 --> 00:08:35.400
So I wanted to pick a project on, so I've got, we've got pytest-check, one of the projects I work on, that is, I'm just to have the PyPI page up, because I wanted to show what some of the extra stuff, because it's relevant to Trove classifiers.

00:08:35.820 --> 00:08:43.880
So there's some meta information in the PyProject.toml, or maybe there was like a setup CFG or something like that.

00:08:44.000 --> 00:08:45.060
Anyway, don't use that.

00:08:45.180 --> 00:08:46.080
Use PyProject.toml.

00:08:46.340 --> 00:08:46.560
Anyway.

00:08:47.780 --> 00:08:48.740
Things like the license.

00:08:49.480 --> 00:09:18.980
on the left-hand side of uh of pi pi you can see things like the license uh who the maintainers are um the author require what python version it requires um and if it provides any extra installers i didn't know it did that that's pretty cool i know i knew that my package did i didn't know that pi pi said which extras you can install i didn't know that either that's interesting yeah um i below that there's extra things like i've got on here i've got that the development status is stable so so you can go ahead and use it.

00:09:19.700 --> 00:09:20.880
It's part of the pytest.

00:09:21.060 --> 00:09:23.420
It's a pytest plugin, so I have the pytest framework.

00:09:23.940 --> 00:09:25.200
Intended audience is developers.

00:09:25.460 --> 00:09:27.600
I don't know if that's important or not, but sure.

00:09:27.900 --> 00:09:28.960
And which Python versions?

00:09:29.160 --> 00:09:32.260
It's Python 3.9, 10, so I'll test it all the way up.

00:09:33.000 --> 00:09:33.600
3.15?

00:09:34.100 --> 00:09:34.940
I was going to take that out.

00:09:35.260 --> 00:09:37.080
But anyway, I haven't tested it.

00:09:37.100 --> 00:09:37.340
Leave it.

00:09:37.640 --> 00:09:40.120
It's only like three or four more weeks, and then it'll start to make sense.

00:09:40.240 --> 00:09:40.620
Just leave it.

00:09:41.140 --> 00:09:42.880
Yeah, I haven't tested 3.15 yet.

00:09:43.100 --> 00:09:46.000
But okay, so and then what topic?

00:09:46.240 --> 00:09:46.640
It's utility.

00:09:46.960 --> 00:09:48.200
all this extra stuff.

00:09:48.480 --> 00:09:49.640
Why do we care about that?

00:09:50.000 --> 00:09:55.540
Well, those things are listed in pipi.org slash classifiers.

00:09:56.140 --> 00:10:02.340
And there's a big list of these that you can put in there, even which CUDA version you're using.

00:10:03.220 --> 00:10:03.400
Interesting.

00:10:04.560 --> 00:10:06.580
A lot of them are legacy and don't make sense.

00:10:06.780 --> 00:10:10.140
But they have to be exact matches in your classifier list.

00:10:10.460 --> 00:10:11.380
Why am I bringing this up?

00:10:11.380 --> 00:10:16.100
Because I'm bringing it up because I'm blanking right now.

00:10:16.260 --> 00:10:21.080
Adam Hill wrote a project recently called troml, T-R-O-M-L.

00:10:21.410 --> 00:10:26.020
And troml provides a list of potential classifiers that could be added to a Python package.

00:10:26.380 --> 00:10:28.600
And actually, I think that's the original thing.

00:10:29.470 --> 00:10:32.700
It was to provide a potential list of classifiers.

00:10:33.180 --> 00:10:35.920
Now, if you're okay with it, you can say, go ahead and update it.

00:10:36.060 --> 00:10:39.660
It'll update your PyProjectDommel file with the right classifiers.

00:10:40.070 --> 00:10:42.360
And this is what they look like in code.

00:10:42.800 --> 00:10:46.660
There's a classifier list, and it's a string.

00:10:47.400 --> 00:10:52.960
It has to be exact spelling, exact capitalization with the spaces and everything.

00:10:53.560 --> 00:10:55.180
So you don't really want to do this by hand.

00:10:55.280 --> 00:10:59.700
I usually copied and pasted it, but now you don't have to.

00:10:59.720 --> 00:11:06.320
You can just run troml against your project, and you just give it the directory of your project, and it'll find your project troml file.

00:11:06.760 --> 00:11:08.660
And there's a couple arguments.

00:11:08.800 --> 00:11:12.480
You can say suggest, and it just suggests what you should put in.

00:11:12.700 --> 00:11:16.140
But if you add fix, it'll just change it.

00:11:16.440 --> 00:11:21.160
And if you want to just check stuff, you can say troml check.

00:11:21.320 --> 00:11:21.700
It'll check.

00:11:21.880 --> 00:11:22.440
That's really nice.

00:11:22.920 --> 00:11:23.080
Yeah.

00:11:23.900 --> 00:11:28.240
And that might be a good one for CICD or something, a pre-commit to check.

00:11:28.580 --> 00:11:32.420
So really cool that I don't have to think about that too much anymore.

00:11:32.560 --> 00:11:35.780
I can just run troml on my project, and it'll work.

00:11:35.840 --> 00:11:43.560
So the final thought on this is if you're like, why do we even care about classifiers?

00:11:43.880 --> 00:11:44.500
This is ridiculous.

00:11:46.120 --> 00:11:52.540
We have a testing code episode from 2023 that I'm linking to where I talk about to Brett Cannon.

00:11:52.780 --> 00:11:55.740
Because I, frankly, I just wanted to stop using him on my project.

00:11:56.160 --> 00:12:00.280
So I got Brett on the phone and said, hey, Brett, why do we need to care about these anymore?

00:12:00.680 --> 00:12:02.480
And he gave me a nice discussion.

00:12:02.840 --> 00:12:05.000
It's a half an hour discussion linked to that.

00:12:05.460 --> 00:12:05.600
Okay.

00:12:05.640 --> 00:12:06.500
Yeah, very nice.

00:12:07.480 --> 00:12:08.280
Anyway, classifiers.

00:12:10.340 --> 00:12:10.620
Love it.

00:12:10.920 --> 00:12:12.460
Yeah, and those things do look tricky.

00:12:12.800 --> 00:12:18.400
You almost feel like they should be an enumeration in some library like pip or something.

00:12:18.780 --> 00:12:23.160
You use a pip colon Django, pip colon Django find out to, you know what I mean?

00:12:23.740 --> 00:12:24.720
Well, yeah.

00:12:25.580 --> 00:12:26.260
One of the things I want to bring up.

00:12:26.260 --> 00:12:27.160
But it's by Project Toml, right?

00:12:27.380 --> 00:12:29.180
You can't run code in there.

00:12:29.820 --> 00:12:40.960
One of the things I wanted to point out that I was surprised when I first wrote this is I was putting licenses in my PyProject Toml classifiers.

00:12:41.559 --> 00:12:46.300
And because that used to be the only way you could get them in PyPI to show up.

00:12:46.560 --> 00:12:47.860
But you don't have to do that anymore.

00:12:48.279 --> 00:12:49.820
You don't have to list the licenses.

00:12:50.660 --> 00:12:51.620
So a little bit of news.

00:12:52.100 --> 00:12:52.400
Okay.

00:12:52.820 --> 00:12:53.120
Very nice.

00:12:53.680 --> 00:12:53.840
All right.

00:12:53.960 --> 00:12:54.860
What you got for us next?

00:12:55.480 --> 00:12:56.280
What is next?

00:12:56.320 --> 00:12:57.180
Well, let's see.

00:12:57.680 --> 00:12:58.080
pqrs.

00:12:59.540 --> 00:13:05.200
pqrs. I'm sure it's spoken out. It's not, it has no vowels. So if you're in data science,

00:13:05.920 --> 00:13:55.960
you, and let's say intersect two things. If you're in data science and you deal with large files, like large CSVs, right? Like let's say you've, you've got a 500 megabyte and a rather 500 gigabyte, I don't know, huge, huge CSV file for your project. And you start out your day by going to your notebook and you say pandas read csv or something equivalent of that right you're you're just directly working with the csv i guess even if this was like a web app might it still makes sense but the i think the real common usage scenario is someone is going around and working with their their data files right why do you keep it a csv there are better formats parquet for example which this applies to this pqrs is a command line tool for inspecting parquet files These are compressed, optimized binary versions of basically CSV files, right?

00:13:56.320 --> 00:14:04.100
I guess they're slightly different in the sense that like columns have types, like there can be an integer column, a little more like Excel, but Excel is hard to work with, right?

00:14:04.320 --> 00:14:05.260
Excel files are hard to work with.

00:14:05.560 --> 00:14:06.000
So CSV.

00:14:06.480 --> 00:14:08.120
Well, why might you keep it as CSV?

00:14:08.320 --> 00:14:11.500
Well, you want to be able to actually look at the file and see what the heck it is.

00:14:11.510 --> 00:14:15.440
These are like compressed binary things you can't look at unless you install this.

00:14:15.750 --> 00:14:18.600
And then you can just kind of browse around through the files.

00:14:18.900 --> 00:14:29.480
So you can go to your parquet file and say, show me the top entries by doing parquet.cat or head or merging them or do all sort of row count, sample some items out of it.

00:14:29.700 --> 00:14:38.120
So if you were avoiding working with these parquet files or something else, I think parquet is kind of one of the top ones out of the PyArrow project, out of the Arrow project.

00:14:39.000 --> 00:14:40.140
This is really cool.

00:14:40.410 --> 00:14:41.980
And it gives you back a little bit of that.

00:14:42.150 --> 00:14:47.280
Let me just poke around this binary file as if it were a CSV text file.

00:14:47.580 --> 00:14:51.420
So how about some reasons to use it?

00:14:51.920 --> 00:14:52.760
So I think there's two reasons.

00:14:52.850 --> 00:14:55.900
I think size and speed, both of which are relevant.

00:14:56.500 --> 00:14:57.880
You work with large data files, right?

00:14:58.160 --> 00:15:08.940
So in the show notes, I've got some things written down, like a typical 200 megabyte CSV file might be as small as 20 or 50 megabytes as a Parquet file.

00:15:09.779 --> 00:15:12.460
That's like a 5x smaller size.

00:15:12.920 --> 00:15:14.720
We're talking a bunch of huge data files, right?

00:15:14.960 --> 00:15:15.600
Smaller size, good.

00:15:15.740 --> 00:15:22.540
I mean, I guess if they're changing a lot, you know, a Git diff or whatever, but I mean, putting 500 gigs into a Git, it's going to hate it a lot.

00:15:22.880 --> 00:15:28.220
That I've never put a large file into Git, but it does complain about it.

00:15:28.660 --> 00:15:29.740
At least Git have complaints about it.

00:15:30.240 --> 00:15:32.900
And then the other thing is speed, right?

00:15:33.060 --> 00:15:37.600
So if you fully load like a big, obviously it depends on what the content is and so on.

00:15:37.660 --> 00:15:44.200
But on standard use cases, it also might be two to 10 times faster to read the Parquet file.

00:15:44.620 --> 00:15:46.260
And it's small, smaller.

00:15:46.780 --> 00:15:48.220
So really nice, right?

00:15:48.540 --> 00:15:48.740
Okay.

00:15:49.320 --> 00:15:51.380
Less memory usage, the way that it's read.

00:15:51.540 --> 00:15:53.220
Like there's a lot of advantages to having this.

00:15:53.440 --> 00:15:54.960
And Michael Booth out in the audience.

00:15:55.880 --> 00:15:56.240
No, sorry.

00:15:56.780 --> 00:16:04.600
Bart Williams points out that Parquet files also preserve D types, which is great for dates, date times, and US zip codes.

00:16:04.760 --> 00:16:23.860
indeed meaning like it knows it's a string and doesn't parse 0 1 7 7 2 as a 1 7 7 2 as a number right which is a big big problem and then um michael booth points out hey you could use duckdb for exploring perky files yeah i think this is more like i'm just cruising through the system and i

00:16:23.860 --> 00:16:29.180
would do a cat or just a tail a file just to see what the heck it is you know yeah that's pretty

00:16:29.160 --> 00:16:37.560
cool anyway pqrs check it out if you work with uh csv and other data cute name too it is do you

00:16:37.560 --> 00:16:55.080
know what time it is it's almost time for a new version of python checking out the python 314 or the pi python version um it's um um it it's coming up so looking at the dates i was looking at the PEP 745, which shows the dates.

00:16:55.380 --> 00:16:59.000
It looks like the release candidate is expected.

00:16:59.300 --> 00:17:03.580
The third release candidate is expected on the 16th, just tomorrow.

00:17:04.000 --> 00:17:04.079
Wow.

00:17:04.819 --> 00:17:10.380
And then the final is expected October 7th, but at least probably sometime in October.

00:17:11.559 --> 00:17:14.040
So why am I bringing this up?

00:17:14.100 --> 00:17:16.560
I'm bringing this up for a couple of things.

00:17:16.640 --> 00:17:19.540
I was going to talk about what's new in Python.

00:17:19.720 --> 00:17:21.439
So I'm going to link to it anyway.

00:17:21.680 --> 00:17:24.020
There's a what's new page with all the things.

00:17:24.300 --> 00:17:25.319
We've talked about some of these already.

00:17:26.040 --> 00:17:28.380
I'm not going to, there's a free thread.

00:17:28.500 --> 00:17:32.460
It is officially supported, but it's been in there for already.

00:17:33.440 --> 00:17:34.300
Template strings are neat.

00:17:34.900 --> 00:17:36.180
Anyway, cool list of new things.

00:17:36.280 --> 00:17:44.880
But what do I really want to talk about today is I want to talk about that I really wanted pytest-check, which we were already talking about, and the rest of my projects.

00:17:45.220 --> 00:17:46.300
I thought, you know what?

00:17:46.580 --> 00:17:48.820
I'm not completely testing them yet.

00:17:49.040 --> 00:17:49.940
I am testing them.

00:17:50.120 --> 00:17:54.660
I added them to talks recently, so I would test everything locally.

00:17:54.940 --> 00:18:01.720
But I wasn't testing 3.14 in CI, and I thought, now's the time to turn that on.

00:18:02.120 --> 00:18:03.060
But I had trouble.

00:18:03.160 --> 00:18:06.560
I forgot the magic incantation of, what do I do?

00:18:06.560 --> 00:18:13.520
Do I just add 3.14 to my GitHub actions list or the Python matrix?

00:18:13.920 --> 00:18:14.460
Tried that.

00:18:14.640 --> 00:18:15.080
Didn't work.

00:18:15.600 --> 00:18:24.240
So I asked people on Master on Bluesky, and I'm always grateful for everybody that answers things rather quickly.

00:18:24.310 --> 00:18:25.280
Got a bunch of cool answers.

00:18:26.780 --> 00:18:32.060
A few people suggested that I forgot the, what was the answer?

00:18:32.260 --> 00:18:35.680
I forgot the use pre-releases.

00:18:36.720 --> 00:18:47.380
And in particular, Ed Rogers said, hey, there's a great article from Hugo about running 3.14 in CI.

00:18:48.000 --> 00:18:48.960
So I'm going to link to that.

00:18:49.320 --> 00:18:53.060
It's called Free Threaded Python on GitHub Actions.

00:18:53.340 --> 00:18:55.280
So that doesn't say how to run 3.14.

00:18:55.560 --> 00:18:56.600
It's about free threading.

00:18:56.880 --> 00:18:58.780
But hidden in here is the secret.

00:18:59.220 --> 00:19:00.720
The secret is down here.

00:19:01.160 --> 00:19:06.560
And there's a bunch of great examples of YAML files and workflow files.

00:19:06.820 --> 00:19:12.320
But the magic keyword is right down in here that says allow pre-release is true.

00:19:12.720 --> 00:19:12.920
That's it.

00:19:13.000 --> 00:19:14.240
You really, that's all you got to do.

00:19:14.360 --> 00:19:16.520
So you got to say allow pre-release is true.

00:19:16.980 --> 00:19:24.040
And of course, while you're there, it's good to check to make sure that you have a current setup Python version.

00:19:24.360 --> 00:19:27.020
And I believe this is already out of date.

00:19:27.060 --> 00:19:30.400
I believe that we've got maybe the, I don't know, check them.

00:19:30.460 --> 00:19:37.840
So I think we're up to V5 and V6, but it's good to check on your actions, the checkout action and Python action.

00:19:38.680 --> 00:19:41.140
But at least you have to be up to five, I think, for this to work.

00:19:41.460 --> 00:19:43.200
Anyway, pre-release is true.

00:19:43.440 --> 00:19:52.700
And then while you're there, you can check it out and say, hey, I am going to test against 3.14, but maybe I should test against the free-threaded version also.

00:19:52.940 --> 00:19:56.440
And all you have to do is add a 3.14T to make that work.

00:19:57.220 --> 00:19:57.720
All right.

00:19:57.960 --> 00:19:58.520
Yeah, that's very cool.

00:19:59.380 --> 00:20:02.520
And yeah, thanks to everybody that helped me out on that one.

00:20:03.200 --> 00:20:03.380
Indeed.

00:20:03.610 --> 00:20:04.180
Yeah, that's super cool.

00:20:04.260 --> 00:20:06.980
And pretty soon you can drop the pre-release thing, right, in a month.

00:20:07.520 --> 00:20:09.200
Well, but you don't really have to.

00:20:09.370 --> 00:20:12.620
It can just be in there to test stuff.

00:20:12.800 --> 00:20:12.880
Yeah.

00:20:13.360 --> 00:20:13.520
Exactly.

00:20:13.800 --> 00:20:14.640
It's not going to hurt anything.

00:20:14.900 --> 00:20:18.120
And you'll need it for 3.15 right around the corner.

00:20:18.640 --> 00:20:19.000
Exactly.

00:20:19.050 --> 00:20:21.760
So you're almost ready to test your Trove classifier.

00:20:22.180 --> 00:20:24.660
I mean, who doesn't want to do like some deadlocks on GitHub Actions?

00:20:24.820 --> 00:20:25.020
Come on.

00:20:25.260 --> 00:20:25.880
Put the T in there.

00:20:27.200 --> 00:20:29.080
I don't think we're in danger of deadlocks.

00:20:29.500 --> 00:20:38.520
I think we're in danger of a lot of race conditions and data corruption because deadlocks assume that people are already writing locks using thread, thread locks, just using them wrong.

00:20:38.910 --> 00:20:39.860
I think no one's using them.

00:20:40.620 --> 00:20:40.880
Yeah.

00:20:41.310 --> 00:20:43.020
So I don't know.

00:20:43.220 --> 00:20:48.720
So I turned on testing on free threaded for pytest, but I don't know if it makes a difference because it's a pytest plugin.

00:20:48.960 --> 00:20:50.000
And I don't think that.

00:20:50.720 --> 00:20:51.140
Yeah.

00:20:51.300 --> 00:20:52.600
It's probably fairly stateless.

00:20:52.730 --> 00:20:52.840
Yeah.

00:20:53.220 --> 00:20:56.100
Well, I don't think pytest utilizes the free threading yet.

00:20:56.240 --> 00:20:59.820
It'd be kind of cool if it did, so we could test multiple things at once.

00:21:00.140 --> 00:21:01.060
But I think it's a single test.

00:21:01.060 --> 00:21:05.420
Yeah, that's true, because it's still subject to the gil, unless it runs it in multiprocessing.

00:21:05.760 --> 00:21:13.980
Yeah, I mean, you can run them in parallel, but traditionally people use Xdist, pytest Xdist, which splits them off into separate processes.

00:21:15.180 --> 00:21:15.420
All right.

00:21:15.820 --> 00:21:16.980
Now are we ready for extras?

00:21:17.480 --> 00:21:18.900
Yeah, we're at extras now.

00:21:19.000 --> 00:21:19.260
All right.

00:21:19.880 --> 00:21:24.180
For something completely different, let's talk about an article by Hugo van Caminande.

00:21:26.400 --> 00:21:26.580
Yeah.

00:21:27.620 --> 00:21:36.880
So you spoke about PREC last time, which is a alternate, faster UV-enabled pre-commit, right?

00:21:37.200 --> 00:21:41.000
We talked about pre-commit in different ways intersecting with uv, and that was one of them.

00:21:41.480 --> 00:21:47.500
And said, hey, by the way, I also wrote, by the way, it comes from the episode, I'm getting the BIOS flavor.

00:21:47.700 --> 00:21:48.960
It's got to be one of the better titles.

00:21:49.460 --> 00:21:49.820
So good.

00:21:50.419 --> 00:21:58.600
Anyway, the article is Ready PREC Go, talking about how he's using Prec for pre-commit type of things.

00:21:58.840 --> 00:21:59.860
So super cool.

00:22:00.220 --> 00:22:00.980
People can check that out.

00:22:01.500 --> 00:22:07.420
And this was not on my follow-up earlier and my extra earlier, but now I realize I should throw this on you.

00:22:07.620 --> 00:22:10.540
So remember I said that it was quite a bit slower

00:22:10.710 --> 00:22:15.140
to run my little URL crunching utility in Python

00:22:15.630 --> 00:22:17.420
instead of, I can't remember what we were talking about.

00:22:17.440 --> 00:22:20.760
You're talking about something, oh, the startup cost of Prec actually it was.

00:22:21.120 --> 00:22:25.900
So I'm like, yeah, even my little super silly utility is kind of slow.

00:22:26.110 --> 00:22:29.580
Like it takes almost a second to just start and do its little thing.

00:22:30.000 --> 00:22:31.420
Well, well, Michael learns a lesson.

00:22:31.980 --> 00:22:41.680
The lesson is that was something that came out of the Talk Python code base, which has like packages installed that have a whole bunch of stuff in there.

00:22:41.830 --> 00:22:56.540
And I think somehow loading up that sub package of that whole code base was loading like almost all of the talk Python stuff as it just parsed, doing all the imports to find its way to what it needed to like put a few pieces together.

00:22:57.220 --> 00:23:01.000
And I may have broken that out and it may run way, way, way, way faster now.

00:23:01.400 --> 00:23:11.540
So lesson, keep it, if you put it in its own little virtual environment and you make it do its own, if it's like a one or two line utility or one or two file utility, maybe that makes a big difference.

00:23:11.800 --> 00:23:12.400
At least it does here.

00:23:12.580 --> 00:23:15.160
So yeah, I thought that was actually really interesting that it makes a big difference.

00:23:15.560 --> 00:23:17.660
like 10 times different startup speed.

00:23:17.900 --> 00:23:18.480
Wow. Yeah.

00:23:18.680 --> 00:23:20.880
Yeah. Yeah. So there I've learned a lesson.

00:23:21.300 --> 00:23:43.600
Also just before I call it on my extras, I was listening to some security podcasts and apparently there was a super broad, although not super bad, supply chain attack at npm where some package, some maintainer of a package got phished by a, Hey, you've got to make sure your 2FA is up to date innpm.

00:23:43.620 --> 00:23:52.020
And they did, but that was actually logging into a site that was completely not that, which gave the hackers access to their npm repository, their package.

00:23:52.390 --> 00:24:04.740
And they replaced, they called it a one-function, one-liner dependency that 500 other packages depend upon that resulted in something like 2 billion downloads a month or a week.

00:24:04.810 --> 00:24:05.120
I don't know.

00:24:05.120 --> 00:24:06.300
It was like a lot of downloads.

00:24:06.650 --> 00:24:10.880
And they put in cryptocurrency stealers where the one line used to be.

00:24:11.060 --> 00:24:16.440
Just thinking about like, do you necessarily need a one line dependency that has other dependencies?

00:24:16.730 --> 00:24:19.080
Like, could you just maybe just vendor that in?

00:24:19.080 --> 00:24:25.300
So just, I definitely think not depending on too many things has many good advantages to you.

00:24:25.380 --> 00:24:39.840
And this age of AI, if you can ask AI to say, write me a single function that does this thing and it solves your use case, like maybe you don't need any dependencies and side benefit is like you code might start a little bit faster, but also people can't fish someone downstream and do bad stuff too.

00:24:39.920 --> 00:24:41.380
So anyway, very interesting.

00:24:41.980 --> 00:24:42.520
Starts much faster.

00:24:42.920 --> 00:24:42.980
Cool.

00:24:43.600 --> 00:24:44.100
All right, over to you.

00:24:45.740 --> 00:24:47.880
I kind of, I've got a lot of extras,

00:24:48.320 --> 00:24:49.020
so I'll try to get through.

00:24:50.780 --> 00:24:55.400
So Adam Hill, we talked about troml or yeah, troml.

00:24:55.830 --> 00:25:01.740
So Adam Hill also has another Toml utility and it's DJ Toml settings.

00:25:01.850 --> 00:25:11.420
I haven't played with this yet, but essentially it's, you can save your Django settings in Toml files, either into pyproject.toml or you can make a Django Tommel file.

00:25:11.860 --> 00:25:17.900
Anyway, he's got a new package called DJ Tommel settings that you can store Django stuff in Tommel.

00:25:17.930 --> 00:25:18.920
So that's that.

00:25:19.960 --> 00:25:23.780
A couple of people notified us about this, and I noticed it also.

00:25:24.220 --> 00:25:27.560
Somebody named Sam Henry Gold, did you see this?

00:25:28.440 --> 00:25:37.460
He wrote a little utility that allows you to detect.

00:25:39.120 --> 00:25:47.520
It allows you to detect the angle of your Python, or not your Python, your MacBook, the lid, and then react to it.

00:25:47.780 --> 00:25:49.560
So he's got a couple things that are fun.

00:25:49.740 --> 00:25:55.860
He's got a creaky door sound that you can play on your MacBook while you're opening and closing the lid.

00:25:56.080 --> 00:25:58.180
And then a, what did he call this?

00:25:58.840 --> 00:25:59.460
The theremin.

00:26:00.660 --> 00:26:02.180
It's a different kind of instrument.

00:26:04.860 --> 00:26:06.540
I saw this, thought it was fun.

00:26:07.020 --> 00:26:13.200
And then we got, somebody told us, it's called Lid Angle Sensor.

00:26:13.530 --> 00:26:14.480
And then-

00:26:14.480 --> 00:26:15.660
Brian Weber.

00:26:15.930 --> 00:26:16.060
Yeah.

00:26:16.210 --> 00:26:16.660
Yeah.

00:26:16.660 --> 00:26:22.540
So Brian Weber notified us that there's a version of this for Python already.

00:26:22.540 --> 00:26:26.380
This just came out like a week ago or so, called PyBookLid.

00:26:26.380 --> 00:26:29.820
So just directly from Python, you can control your book lid.

00:26:29.820 --> 00:26:32.200
You don't have to get anything else.

00:26:32.250 --> 00:26:33.060
All right.

00:26:33.060 --> 00:26:36.480
So who's going to be the first person that takes this to the Apple store?

00:26:37.520 --> 00:26:51.460
and tells them they need to oil their macbook lid at the genius bar i mean look listen to the thing and then if you put it too far like a crunch if it like goes oh my god you broke it yeah

00:26:52.100 --> 00:28:01.600
pretty funny don't do that okay uh what do we got not pie test check again i've already done that um no these are my oh i was just debugging my uh my stuff so uh the last thing i wanted to bring up was pie bay so pie bay is just around the corner also uh pie bay is coming in october october 18th of 2025 just so um middle of october if you are planning on if you're already in san francisco um or or the bay area or plan on being there in october or would like to go and um don't want to buy your own ticket so i encourage people to go buy your own ticket this is a really cool there's a lot of great people there talking we've got Guido Pamela Fox Christopher Lisa Jim there's there's tons of great speaker profiles I kind of wish I could go I'm not gonna be able to get there Burnett is going to talk about Python packaging a lot of great speakers anyway so check out PyBay and I've got a secret for everybody so if if you would like to go but for some reason would just like to get a free ticket, just let us know.

00:28:01.640 --> 00:28:02.480
So how do you let us know?

00:28:02.820 --> 00:28:08.600
I think that'd be cool to do a drawing from our email list.

00:28:08.880 --> 00:28:16.400
So go to pythonbiz.fm, sign up for our email newsletter, and we're going to draw how many tickets do we got?

00:28:16.840 --> 00:28:18.460
They gave us some tickets to give away.

00:28:18.880 --> 00:28:20.300
I've got one, two, three, four.

00:28:20.400 --> 00:28:22.320
I've got four vouchers, so four people.

00:28:23.120 --> 00:28:32.980
We'll randomly pick before next week, we'll randomly pick four people and we'll email you and say, hey, do you want a ticket?

00:28:33.250 --> 00:28:34.420
And we'll give out some tickets.

00:28:35.080 --> 00:28:40.360
Also, it looks like it's a voucher for one individual ticket and a free conference T-shirt.

00:28:40.540 --> 00:28:41.480
So you get the T-shirt also.

00:28:41.840 --> 00:28:42.160
So that's cool.

00:28:42.410 --> 00:28:43.580
So when are we going to do that drawing?

00:28:43.680 --> 00:28:44.420
I'll probably do it.

00:28:44.540 --> 00:28:45.200
I'll do it next Sunday.

00:28:45.500 --> 00:28:47.000
So sign up this week.

00:28:47.320 --> 00:28:51.440
Sign up before Sunday, actually by the end of Saturday.

00:28:51.860 --> 00:28:53.640
And then I'll draw it next week.

00:28:54.290 --> 00:28:54.380
Sweet.

00:28:54.890 --> 00:28:55.700
Yeah, that's a fun conference.

00:28:56.020 --> 00:29:02.040
So, and it's a whole new set of people, too, since the last time I went of running it.

00:29:02.310 --> 00:29:02.900
So, yeah.

00:29:03.840 --> 00:29:03.960
Yeah.

00:29:04.620 --> 00:29:05.280
How about something funny?

00:29:05.560 --> 00:29:06.820
I've got something good for you.

00:29:07.160 --> 00:29:07.460
All right.

00:29:08.100 --> 00:29:11.980
Imagine, Brian, you are junior in high school or something.

00:29:12.160 --> 00:29:14.240
Now, I guess the joke, it's got to be a little bit older.

00:29:14.540 --> 00:29:16.720
College age, but decided not to go to college.

00:29:17.220 --> 00:29:22.660
You're on your first time meeting your potential newish girlfriend's father.

00:29:23.030 --> 00:29:25.660
They're a little upset that he decided to go into this computer thing.

00:29:26.060 --> 00:29:27.320
They don't know if it's going to work out.

00:29:27.660 --> 00:29:29.560
And they wish that he had gone to college.

00:29:30.060 --> 00:29:30.960
So you meet the father.

00:29:31.140 --> 00:29:34.560
And the father says, my daughter told me that you're a console developer.

00:29:34.800 --> 00:29:37.940
So PlayStation, Xbox, and just know what?

00:29:39.320 --> 00:29:42.680
The young guy wearing a hoodie says, I console.logster.

00:29:44.320 --> 00:29:46.940
You have exactly 10 seconds to get out of my house.

00:29:50.900 --> 00:30:02.580
yeah console developer love it that's what i got for you um of course comes from uh programming humor which is doing a good job with the memes yeah i think we need to like redo that one look um

00:30:03.100 --> 00:30:11.399
uh what's that uh some cli stuff right yeah like a print print to print debugger yeah very good so

00:30:11.660 --> 00:30:14.600
I heard you're a console log, a console developer.

00:30:14.900 --> 00:30:15.080
Amazing.

00:30:15.660 --> 00:30:16.420
Console.log.

00:30:18.180 --> 00:30:18.280
Yeah.

00:30:18.520 --> 00:30:19.600
I like that he is sir.

00:30:19.980 --> 00:30:21.220
I console.log, sir.

00:30:25.240 --> 00:30:25.360
Yeah.

00:30:26.419 --> 00:30:29.360
Do you pronounce parens in spoken English?

00:30:30.899 --> 00:30:31.700
I guess.

00:30:31.800 --> 00:30:32.240
I don't know.

00:30:32.580 --> 00:30:32.640
Yeah.

00:30:33.300 --> 00:30:33.720
Open close.

00:30:34.440 --> 00:30:34.560
Yeah.

00:30:34.660 --> 00:30:35.020
I don't know.

00:30:36.880 --> 00:30:37.180
All right.

00:30:37.820 --> 00:30:39.120
Well, awesome.

00:30:39.400 --> 00:30:40.200
Oh, wait.

00:30:40.260 --> 00:30:41.300
Real time follow up, by the way.

00:30:41.720 --> 00:30:43.600
Brian Weber says thanks for mentioning his extra.

00:30:43.700 --> 00:30:44.400
So very good.

00:30:44.900 --> 00:30:45.800
And thanks, Brian.

00:30:45.940 --> 00:30:46.460
And thanks to everybody.

00:30:46.600 --> 00:30:50.300
We had quite a show of people showing up at 7 a.m.

00:30:50.740 --> 00:30:51.120
Interesting.

00:30:51.680 --> 00:30:55.560
We got some from Sydney, Michael Booth.

00:30:55.900 --> 00:30:59.220
Hey, thanks for being live in a friendlier time slot than usual.

00:30:59.620 --> 00:31:02.020
So maybe we should do an early one once in a while anyway.

00:31:02.960 --> 00:31:03.680
Yeah, absolutely.

00:31:03.800 --> 00:31:04.300
Mix it up a little.

00:31:04.500 --> 00:31:05.560
I mean, how about this?

00:31:05.740 --> 00:31:07.360
How about we just get a random number generator?

00:31:07.440 --> 00:31:11.100
It generates a number between zero and 24 every day.

00:31:11.600 --> 00:31:12.660
Every week, we just hit that.

00:31:12.660 --> 00:31:14.360
And whatever hour that is, that's when we record.

00:31:14.560 --> 00:31:15.320
I hate that idea.

00:31:15.480 --> 00:31:16.100
It's 3 a.m.

00:31:16.460 --> 00:31:16.840
You hate it?

00:31:17.200 --> 00:31:18.340
I don't like that idea.

00:31:19.080 --> 00:31:20.200
I honestly hate it too.

00:31:21.220 --> 00:31:24.040
But I'm glad some people got to attend.

00:31:24.860 --> 00:31:25.120
All right.

00:31:25.220 --> 00:31:26.760
Well, thanks, everybody, for listening.

00:31:27.120 --> 00:31:28.760
And we will talk to you next week.

