Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 449, recorded September 15th, 2025.
And I am Brian Okken.
And I am Michael Kennedy.
And of course, this episode, not of course, but this episode is sponsored by us.
So please check out the stuff we offer you guys and everyone.
Courses at Talk Python Training, pytestCourses at Pythontest.com.
And there's also one at Talk Python Training too.
And then Patreon supporters, we love you.
Thanks for supporting the show.
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.
Links are in the show notes.
And as normal, this is currently Monday at 7 a.m., but normally it's Monday at 10 a.m.
If you'd like to watch the show live, you can go to pythonbytes.fm/live and catch it.
And you can even interact with us while we're recording.
Finally, I'd like to thank everybody that's joined up for the newsletter.
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.
We'll send that right to your inbox.
So lots of cool stuff to talk about today.
Let's kick it off, Michael.
Yeah, let's kick it off with a little FOSS news, free and open source software.
And this is, I don't know, maybe the story is kind of the opposite of FOSS.
Giant trillion dollar company interacts with Monopoly court, but the consequences may fall down to open source software.
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.
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.
I know that OpenAI and gosh, was it Cursor?
Might have been Cursor or Anthropic.
I can't, one of the, one of the AI companies was like, oh yeah, we'll take it.
We'll buy.
And I know perplexity threw their hat in there.
We'll buy Chrome.
One of them offered to buy Chrome for like 10 times their, their valuation.
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.
Wow.
Like they're 85% of Mozilla's revenue.
So one of the remedies could be, you can't be paying all these companies to like make you the default search engine.
Same reason, that's what Mozilla was getting is like default search engine on Mozilla equals Google.
Here's $100 million a year or whatever it was.
Okay.
Go ahead.
No, I was just looking at the notes.
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
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
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
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.
And maybe it just doesn't make sense to pay that anymore.
It's done.
Yeah.
And that just seems icky also.
It does seem like Google's just keeping Mozilla around so that they are not the, just to keep competition there.
Just to not look like a monopolist, right?
Yeah.
Exactly.
But now they've been punished as a monopolist.
The fines have been determined.
There are no more consequences, right?
So do they still have to pay?
I mean, no one's going to say, well, look, they're not a monopolist because of Firefox.
They are legally declared to be a monopolist.
So that check, that guard by doing that is gone.
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.
Like it could be a huge problem.
It could also be that Google wants to show some goodwill and do this, but I don't know.
It's still tenuous.
This is not like, oh, they're fine.
Interesting.
- It's a super interesting thing to follow.
We'll see where it goes, but yeah,
they should probably hustle and start getting some things that are not being paid.
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?
this JavaScript runtime has this speed behavior.
So that means it's actually this person.
It's down to like two people in the world and only one person visited our site.
So we can track them like not just as good as a cookie.
Like those kinds of things that would be lovely to have.
Yeah.
I actually don't know if Firefox has that or not, but I don't think so.
I think Brave might.
Anyway, there's exact opposite incentives like for Firefox.
One is the users would be better off if they were actually a private browser that did that kind of stuff.
Two, Google would be more upset with them and less likely to pay them their salary.
That just puts them in a, hey, we could be for the users or we could be for our job.
I'm not a fan.
What a morning.
We're going to go from lawsuits to trove classifiers.
This will wake everybody up.
Are you telling me that pytest-check has been declared a monopoly pytest plugin?
No, I just wanted to pick one.
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.
So there's some meta information in the PyProject.toml, or maybe there was like a setup CFG or something like that.
Anyway, don't use that.
Use PyProject.toml.
Anyway.
Things like the license.
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.
It's part of the pytest.
It's a pytest plugin, so I have the pytest framework.
Intended audience is developers.
I don't know if that's important or not, but sure.
And which Python versions?
It's Python 3.9, 10, so I'll test it all the way up.
3.15?
I was going to take that out.
But anyway, I haven't tested it.
Leave it.
It's only like three or four more weeks, and then it'll start to make sense.
Just leave it.
Yeah, I haven't tested 3.15 yet.
But okay, so and then what topic?
It's utility.
all this extra stuff.
Why do we care about that?
Well, those things are listed in pipi.org slash classifiers.
And there's a big list of these that you can put in there, even which CUDA version you're using.
Interesting.
A lot of them are legacy and don't make sense.
But they have to be exact matches in your classifier list.
Why am I bringing this up?
Because I'm bringing it up because I'm blanking right now.
Adam Hill wrote a project recently called troml, T-R-O-M-L.
And troml provides a list of potential classifiers that could be added to a Python package.
And actually, I think that's the original thing.
It was to provide a potential list of classifiers.
Now, if you're okay with it, you can say, go ahead and update it.
It'll update your PyProjectDommel file with the right classifiers.
And this is what they look like in code.
There's a classifier list, and it's a string.
It has to be exact spelling, exact capitalization with the spaces and everything.
So you don't really want to do this by hand.
I usually copied and pasted it, but now you don't have to.
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.
And there's a couple arguments.
You can say suggest, and it just suggests what you should put in.
But if you add fix, it'll just change it.
And if you want to just check stuff, you can say troml check.
It'll check.
That's really nice.
Yeah.
And that might be a good one for CICD or something, a pre-commit to check.
So really cool that I don't have to think about that too much anymore.
I can just run troml on my project, and it'll work.
So the final thought on this is if you're like, why do we even care about classifiers?
This is ridiculous.
We have a testing code episode from 2023 that I'm linking to where I talk about to Brett Cannon.
Because I, frankly, I just wanted to stop using him on my project.
So I got Brett on the phone and said, hey, Brett, why do we need to care about these anymore?
And he gave me a nice discussion.
It's a half an hour discussion linked to that.
Okay.
Yeah, very nice.
Anyway, classifiers.
Love it.
Yeah, and those things do look tricky.
You almost feel like they should be an enumeration in some library like pip or something.
You use a pip colon Django, pip colon Django find out to, you know what I mean?
Well, yeah.
One of the things I want to bring up.
But it's by Project Toml, right?
You can't run code in there.
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.
And because that used to be the only way you could get them in PyPI to show up.
But you don't have to do that anymore.
You don't have to list the licenses.
So a little bit of news.
Okay.
Very nice.
All right.
What you got for us next?
What is next?
Well, let's see.
pqrs.
pqrs. I'm sure it's spoken out. It's not, it has no vowels. So if you're in data science,
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?
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?
Excel files are hard to work with.
So CSV.
Well, why might you keep it as CSV?
Well, you want to be able to actually look at the file and see what the heck it is.
These are like compressed binary things you can't look at unless you install this.
And then you can just kind of browse around through the files.
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.
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.
This is really cool.
And it gives you back a little bit of that.
Let me just poke around this binary file as if it were a CSV text file.
So how about some reasons to use it?
So I think there's two reasons.
I think size and speed, both of which are relevant.
You work with large data files, right?
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.
That's like a 5x smaller size.
We're talking a bunch of huge data files, right?
Smaller size, good.
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.
That I've never put a large file into Git, but it does complain about it.
At least Git have complaints about it.
And then the other thing is speed, right?
So if you fully load like a big, obviously it depends on what the content is and so on.
But on standard use cases, it also might be two to 10 times faster to read the Parquet file.
And it's small, smaller.
So really nice, right?
Okay.
Less memory usage, the way that it's read.
Like there's a lot of advantages to having this.
And Michael Booth out in the audience.
No, sorry.
Bart Williams points out that Parquet files also preserve D types, which is great for dates, date times, and US zip codes.
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
would do a cat or just a tail a file just to see what the heck it is you know yeah that's pretty
cool anyway pqrs check it out if you work with uh csv and other data cute name too it is do you
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.
It looks like the release candidate is expected.
The third release candidate is expected on the 16th, just tomorrow.
Wow.
And then the final is expected October 7th, but at least probably sometime in October.
So why am I bringing this up?
I'm bringing this up for a couple of things.
I was going to talk about what's new in Python.
So I'm going to link to it anyway.
There's a what's new page with all the things.
We've talked about some of these already.
I'm not going to, there's a free thread.
It is officially supported, but it's been in there for already.
Template strings are neat.
Anyway, cool list of new things.
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.
I thought, you know what?
I'm not completely testing them yet.
I am testing them.
I added them to talks recently, so I would test everything locally.
But I wasn't testing 3.14 in CI, and I thought, now's the time to turn that on.
But I had trouble.
I forgot the magic incantation of, what do I do?
Do I just add 3.14 to my GitHub actions list or the Python matrix?
Tried that.
Didn't work.
So I asked people on Master on Bluesky, and I'm always grateful for everybody that answers things rather quickly.
Got a bunch of cool answers.
A few people suggested that I forgot the, what was the answer?
I forgot the use pre-releases.
And in particular, Ed Rogers said, hey, there's a great article from Hugo about running 3.14 in CI.
So I'm going to link to that.
It's called Free Threaded Python on GitHub Actions.
So that doesn't say how to run 3.14.
It's about free threading.
But hidden in here is the secret.
The secret is down here.
And there's a bunch of great examples of YAML files and workflow files.
But the magic keyword is right down in here that says allow pre-release is true.
That's it.
You really, that's all you got to do.
So you got to say allow pre-release is true.
And of course, while you're there, it's good to check to make sure that you have a current setup Python version.
And I believe this is already out of date.
I believe that we've got maybe the, I don't know, check them.
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.
But at least you have to be up to five, I think, for this to work.
Anyway, pre-release is true.
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.
And all you have to do is add a 3.14T to make that work.
All right.
Yeah, that's very cool.
And yeah, thanks to everybody that helped me out on that one.
Indeed.
Yeah, that's super cool.
And pretty soon you can drop the pre-release thing, right, in a month.
Well, but you don't really have to.
It can just be in there to test stuff.
Yeah.
Exactly.
It's not going to hurt anything.
And you'll need it for 3.15 right around the corner.
Exactly.
So you're almost ready to test your Trove classifier.
I mean, who doesn't want to do like some deadlocks on GitHub Actions?
Come on.
Put the T in there.
I don't think we're in danger of deadlocks.
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.
I think no one's using them.
Yeah.
So I don't know.
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.
And I don't think that.
Yeah.
It's probably fairly stateless.
Yeah.
Well, I don't think pytest utilizes the free threading yet.
It'd be kind of cool if it did, so we could test multiple things at once.
But I think it's a single test.
Yeah, that's true, because it's still subject to the gil, unless it runs it in multiprocessing.
Yeah, I mean, you can run them in parallel, but traditionally people use Xdist, pytest Xdist, which splits them off into separate processes.
All right.
Now are we ready for extras?
Yeah, we're at extras now.
All right.
For something completely different, let's talk about an article by Hugo van Caminande.
Yeah.
So you spoke about PREC last time, which is a alternate, faster UV-enabled pre-commit, right?
We talked about pre-commit in different ways intersecting with uv, and that was one of them.
And said, hey, by the way, I also wrote, by the way, it comes from the episode, I'm getting the BIOS flavor.
It's got to be one of the better titles.
So good.
Anyway, the article is Ready PREC Go, talking about how he's using Prec for pre-commit type of things.
So super cool.
People can check that out.
And this was not on my follow-up earlier and my extra earlier, but now I realize I should throw this on you.
So remember I said that it was quite a bit slower
to run my little URL crunching utility in Python
instead of, I can't remember what we were talking about.
You're talking about something, oh, the startup cost of Prec actually it was.
So I'm like, yeah, even my little super silly utility is kind of slow.
Like it takes almost a second to just start and do its little thing.
Well, well, Michael learns a lesson.
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.
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.
And I may have broken that out and it may run way, way, way, way faster now.
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.
At least it does here.
So yeah, I thought that was actually really interesting that it makes a big difference.
like 10 times different startup speed.
Wow. Yeah.
Yeah. Yeah. So there I've learned a lesson.
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.
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.
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.
I don't know.
It was like a lot of downloads.
And they put in cryptocurrency stealers where the one line used to be.
Just thinking about like, do you necessarily need a one line dependency that has other dependencies?
Like, could you just maybe just vendor that in?
So just, I definitely think not depending on too many things has many good advantages to you.
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.
So anyway, very interesting.
Starts much faster.
Cool.
All right, over to you.
I kind of, I've got a lot of extras,
so I'll try to get through.
So Adam Hill, we talked about troml or yeah, troml.
So Adam Hill also has another Toml utility and it's DJ Toml settings.
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.
Anyway, he's got a new package called DJ Tommel settings that you can store Django stuff in Tommel.
So that's that.
A couple of people notified us about this, and I noticed it also.
Somebody named Sam Henry Gold, did you see this?
He wrote a little utility that allows you to detect.
It allows you to detect the angle of your Python, or not your Python, your MacBook, the lid, and then react to it.
So he's got a couple things that are fun.
He's got a creaky door sound that you can play on your MacBook while you're opening and closing the lid.
And then a, what did he call this?
The theremin.
It's a different kind of instrument.
I saw this, thought it was fun.
And then we got, somebody told us, it's called Lid Angle Sensor.
And then-
Brian Weber.
Yeah.
So Brian Weber notified us that there's a version of this for Python already.
This just came out like a week ago or so, called PyBookLid.
So just directly from Python, you can control your book lid.
You don't have to get anything else.
All right.
So who's going to be the first person that takes this to the Apple store?
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
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.
So how do you let us know?
I think that'd be cool to do a drawing from our email list.
So go to pythonbiz.fm, sign up for our email newsletter, and we're going to draw how many tickets do we got?
They gave us some tickets to give away.
I've got one, two, three, four.
I've got four vouchers, so four people.
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?
And we'll give out some tickets.
Also, it looks like it's a voucher for one individual ticket and a free conference T-shirt.
So you get the T-shirt also.
So that's cool.
So when are we going to do that drawing?
I'll probably do it.
I'll do it next Sunday.
So sign up this week.
Sign up before Sunday, actually by the end of Saturday.
And then I'll draw it next week.
Sweet.
Yeah, that's a fun conference.
So, and it's a whole new set of people, too, since the last time I went of running it.
So, yeah.
Yeah.
How about something funny?
I've got something good for you.
All right.
Imagine, Brian, you are junior in high school or something.
Now, I guess the joke, it's got to be a little bit older.
College age, but decided not to go to college.
You're on your first time meeting your potential newish girlfriend's father.
They're a little upset that he decided to go into this computer thing.
They don't know if it's going to work out.
And they wish that he had gone to college.
So you meet the father.
And the father says, my daughter told me that you're a console developer.
So PlayStation, Xbox, and just know what?
The young guy wearing a hoodie says, I console.logster.
You have exactly 10 seconds to get out of my house.
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
uh what's that uh some cli stuff right yeah like a print print to print debugger yeah very good so
I heard you're a console log, a console developer.
Amazing.
Console.log.
Yeah.
I like that he is sir.
I console.log, sir.
Yeah.
Do you pronounce parens in spoken English?
I guess.
I don't know.
Yeah.
Open close.
Yeah.
I don't know.
All right.
Well, awesome.
Oh, wait.
Real time follow up, by the way.
Brian Weber says thanks for mentioning his extra.
So very good.
And thanks, Brian.
And thanks to everybody.
We had quite a show of people showing up at 7 a.m.
Interesting.
We got some from Sydney, Michael Booth.
Hey, thanks for being live in a friendlier time slot than usual.
So maybe we should do an early one once in a while anyway.
Yeah, absolutely.
Mix it up a little.
I mean, how about this?
How about we just get a random number generator?
It generates a number between zero and 24 every day.
Every week, we just hit that.
And whatever hour that is, that's when we record.
I hate that idea.
It's 3 a.m.
You hate it?
I don't like that idea.
I honestly hate it too.
But I'm glad some people got to attend.
All right.
Well, thanks, everybody, for listening.
And we will talk to you next week.