WEBVTT

00:00:00.020 --> 00:00:04.820
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:00:04.850 --> 00:00:11.500
your earbuds. This is episode 446, recorded August 25th, 2025. I am Michael Kennedy.

00:00:11.860 --> 00:00:12.800
And I'm Brian Okken.

00:00:12.910 --> 00:00:16.900
And this episode is brought to you by many cool services and products.

00:00:17.390 --> 00:00:23.580
Can you imagine a course that teaches you how to use pytest? An entire library of 270 hours of

00:00:23.860 --> 00:00:29.880
courses about all Python things, pytest book, and Patreon supporters. Thank you all. Yes,

00:00:29.920 --> 00:00:35.280
check out Brian's courses, Michael's courses, Patreon supporters,

00:00:35.620 --> 00:00:37.360
so check out Patreon and all that.

00:00:37.390 --> 00:00:37.700
Thank you.

00:00:38.180 --> 00:00:42.740
And I actually have another thing that kind of falls into that category

00:00:43.020 --> 00:00:44.340
that's pretty awesome I want to talk about later.

00:00:44.640 --> 00:00:46.900
If you want to connect with us on the socials,

00:00:48.039 --> 00:00:50.560
MastodonBlueSky is probably where we spend most of our time.

00:00:51.380 --> 00:00:53.580
Brian, me, the show, we've all got accounts.

00:00:54.320 --> 00:00:57.360
You can watch us live on YouTube at pythonbytes.fm.

00:00:57.460 --> 00:01:02.280
slash live. If the live show is going on, it should say a big banner across the top. Hey,

00:01:02.720 --> 00:01:07.480
we're live. Click here to go to it. And if not, you'll just see all the past live streams. So

00:01:07.880 --> 00:01:13.440
much appreciated. Typically Monday at 10 a.m. Pacific time. And you should definitely subscribe

00:01:13.590 --> 00:01:19.700
to the newsletter because you'll get a custom email from Brian talking about all the different

00:01:19.800 --> 00:01:23.960
things we covered and not just a list of what we've covered, but diving into extra details,

00:01:24.040 --> 00:01:30.460
extra links more background info very cool also very cool our statistics yeah tell us about these

00:01:30.480 --> 00:01:37.720
things well we have um there's a there's a website called pypi stats.org and and it's it's nice it's

00:01:37.880 --> 00:01:42.800
you pop into it and it just says analytics for pypi packages so let's uh let's pick one

00:01:43.000 --> 00:01:50.540
by test check uh it's my favorite um little thing that i support and then it you what you get is you

00:01:50.360 --> 00:01:54.380
you get these, I'm pretty sure we covered this before, but you get the download statistics.

00:01:54.980 --> 00:01:58.200
So that's not really the news. It is a cool website. You should check it out if you haven't

00:01:58.820 --> 00:02:05.460
checked it out before. And you can also check out the top packages, which ones are the most

00:02:05.680 --> 00:02:12.800
downloaded by day, by week, by month. And that's all fun, but there's some details in the individual

00:02:13.100 --> 00:02:17.500
package that you might want to know if you're supporting stuff. So like, for example, what

00:02:17.480 --> 00:02:25.000
system for pytest check. It looks like it's pretty much all Linux, 97.5% Linux, which makes sense.

00:02:25.240 --> 00:02:30.060
It's a test tool. So a lot of the tests are running in the server and not other places,

00:02:30.540 --> 00:02:35.900
but the package supports Windows anyway. But if I wanted to like, you know, bail on Windows,

00:02:36.350 --> 00:02:40.400
I probably wouldn't be a terror. I mean, I don't think very many people would be mad because

00:02:40.840 --> 00:02:47.380
1% of the people would be pretty upset. Yeah. Well, you know, so maybe I'll leave it. It,

00:02:47.400 --> 00:02:51.120
It isn't OS specific anyway, but some things are, you know?

00:02:51.970 --> 00:02:52.460
So, okay.

00:02:52.530 --> 00:02:53.560
So why am I bringing this up?

00:02:53.570 --> 00:02:56.240
If this is old news, you should know about it anyway.

00:02:57.360 --> 00:03:01.560
But one of the things is a few weeks ago, it went down.

00:03:02.400 --> 00:03:04.360
This is a volunteer supported site.

00:03:05.420 --> 00:03:09.620
And it was by C.R. Flynn.

00:03:10.240 --> 00:03:10.540
I'm sorry.

00:03:10.590 --> 00:03:11.520
I don't know his name.

00:03:11.880 --> 00:03:16.620
But anyway, posted that, hey, PyStats.org is down.

00:03:17.160 --> 00:03:19.620
Somebody reported that like three weeks ago.

00:03:20.140 --> 00:03:21.560
And so I noticed that.

00:03:22.000 --> 00:03:23.760
And Hugo mentioned it.

00:03:23.810 --> 00:03:25.260
And I saw what was going on.

00:03:25.620 --> 00:03:30.720
But just a couple days ago, Hugo announced, hey, PyPI stats is back online.

00:03:31.400 --> 00:03:33.000
And it's more supported now.

00:03:33.180 --> 00:03:37.560
So thanks to Janice and the PSF.

00:03:38.320 --> 00:03:42.640
Thanks to Janice for suggesting that the PSF takes stewardship and connecting the right people.

00:03:43.540 --> 00:03:49.620
like eDurbin for migrating and of course Christopher Flynn oh Christopher Flynn was created it but um

00:03:50.040 --> 00:03:53.580
but a lot of people were involved or at least a handful of people were involved to get it back

00:03:53.740 --> 00:04:00.560
online and get it going and I didn't realize um so that's cool it's back online works great and I

00:04:00.680 --> 00:04:04.680
really appreciate it because I don't use it all the time but occasionally and I won't I'd like to

00:04:04.780 --> 00:04:12.400
use it I didn't know that there was a CLI for it so uh Hugo um put together a project called PyPI

00:04:12.420 --> 00:04:17.700
stats same name but without the dot org but you can pip install it and you can run it on the command

00:04:17.820 --> 00:04:23.580
line and it's super neat um you can actually you can run it on the command line and you get you get

00:04:23.700 --> 00:04:30.220
some you can pass it like python i'm showing on the screen python minor so it shows uh which python

00:04:30.780 --> 00:04:37.039
versions are being being downloaded um but you can do other stuff you you can what i have a list

00:04:37.220 --> 00:04:44.820
look it up. You can do Python major, Python minor, the system, overall downloads, recent downloads.

00:04:45.400 --> 00:04:53.060
So it's pretty interesting information. Some new things that just got released are the ability to,

00:04:53.180 --> 00:04:59.160
you were always able to pass in like a name. So just on the command line, type in a package name

00:04:59.160 --> 00:05:05.659
and get the stats. But now you can also point it at a directory or not point it at anything. And if

00:05:05.680 --> 00:05:10.640
you're in the current directory for a project and it'll just look up by project.tom or set up CFG

00:05:10.980 --> 00:05:17.180
and look it up. So really cool that Hugo extended that command line thing to be able to look up

00:05:17.460 --> 00:05:22.480
that information. That's cool. And it tells you what is the popularity of the packages

00:05:23.000 --> 00:05:26.760
you're using basically? Yeah, well, the popularity, but also just different stuff.

00:05:26.910 --> 00:05:34.400
So like for Pillow, for example, it shows an example of, and this is in black and white on the

00:05:34.420 --> 00:05:38.920
readme, but if you do it on the command line, it's color. So the color output is really kind of nice.

00:05:40.160 --> 00:05:40.340
Nice.

00:05:40.880 --> 00:05:45.460
But you can figure out like start and end date. So if you want a particular date,

00:05:45.790 --> 00:05:50.340
you know, for you want to zoom in on dates, how many downloads last month and whatnot.

00:05:51.460 --> 00:05:57.540
And the different things like the what Python version is good. It's kind of cool because you,

00:05:58.120 --> 00:06:03.780
that's one of those things of like, is it, you think it'll be okay if I completely remove support

00:06:03.820 --> 00:06:11.040
for 3.8 if i want to bump up to 3.10 or something but looking at pillow for example it's um it's

00:06:11.140 --> 00:06:17.700
still uh you know five percent of the people are using uh 3.8 um and some people are still using

00:06:17.760 --> 00:06:24.220
3.6 so maybe they should still support it i'm not sure so maybe they support it or maybe they could

00:06:24.600 --> 00:06:29.320
be the pebble thrown in the water to create the wave that causes those people to upgrade

00:06:29.560 --> 00:06:48.960
Yeah. There's some cool flags for the command line thing, like last month or picking a date, easy to read stuff. And there's an API for it or like a package, importable package that you can do it programmatically.

00:06:49.300 --> 00:06:51.080
So anyway, cool tool.

00:06:51.480 --> 00:06:51.740
Very cool.

00:06:52.200 --> 00:06:52.480
All right.

00:06:52.800 --> 00:06:59.380
Let's jump over and talk about the state of Python 2025, according to the PSF JetBrains

00:06:59.600 --> 00:06:59.720
survey.

00:07:00.200 --> 00:07:00.640
Ooh, neat.

00:07:01.020 --> 00:07:04.960
This article is written by a little known guy named Michael Kennedy.

00:07:05.820 --> 00:07:10.320
I actually worked with, yeah, I worked with JetBrains and they're like, Hey, you want

00:07:10.320 --> 00:07:10.660
to write this?

00:07:10.840 --> 00:07:11.620
I'm like, yeah, sure.

00:07:11.700 --> 00:07:12.160
That'd be great.

00:07:12.220 --> 00:07:22.140
So basically what I did is I went through all of the survey results and pulled out the headlines and like the trends and like what jumped out at me.

00:07:22.560 --> 00:07:28.240
Right. You know, you and I have done this together before, Brian, where we just pull up the survey results and do it on the show.

00:07:28.600 --> 00:07:33.320
I did this with like way more time and effort in written form and then we'll do it on the show.

00:07:33.420 --> 00:07:36.460
How's that? So I think this is maybe like 4000 words.

00:07:36.580 --> 00:07:38.700
It's like quite a quite a write up. Right.

00:07:39.340 --> 00:07:41.700
So I want to just, I don't want to go through all of it.

00:07:41.960 --> 00:07:45.740
You guys can read it, but I do want to pull up some interesting trends.

00:07:46.190 --> 00:07:52.880
So the first trend I think that's pretty wild is that Python people use Python.

00:07:53.370 --> 00:07:55.640
And you're like, oh, Michael, obviously.

00:07:56.480 --> 00:08:01.000
But if you had a JavaScript survey, you would ask, do you use JavaScript?

00:08:01.520 --> 00:08:04.680
And a lot of people that do Python would say, yeah, I use JavaScript.

00:08:05.080 --> 00:08:09.880
A lot of people who do, I don't know,.NET use JavaScript, right?

00:08:10.090 --> 00:08:15.860
Either as little utilities for Node or as because they need a website that has interactivity.

00:08:16.180 --> 00:08:20.000
So I think it's noteworthy that of the people that are in the Python space, they're not there

00:08:20.140 --> 00:08:21.360
as a secondary purpose.

00:08:21.940 --> 00:08:25.720
They're there because of Python, not because like they've got some library that they need

00:08:25.720 --> 00:08:26.340
to work on, right?

00:08:26.410 --> 00:08:32.380
So 86% of people who are Python people use Python, like as their, that's their main thing,

00:08:32.599 --> 00:08:32.659
right?

00:08:32.919 --> 00:08:33.380
As their main.

00:08:33.620 --> 00:08:35.539
And then 14 is secondary, so.

00:08:35.659 --> 00:08:36.280
Yeah, yeah.

00:08:36.590 --> 00:08:38.719
So like maybe they have to support tools in Python,

00:08:38.849 --> 00:08:39.940
but that's not really what they do.

00:08:40.169 --> 00:08:42.979
The other one that I think is wild is that,

00:08:43.260 --> 00:08:45.160
I think we maybe have mentioned this.

00:08:45.170 --> 00:08:47.080
I know I've mentioned this on Talk Python before,

00:08:47.380 --> 00:08:49.280
but people out there are mostly brand new.

00:08:49.880 --> 00:08:50.860
I've seen this once before,

00:08:51.130 --> 00:08:53.220
but it continues to be true even more so,

00:08:53.290 --> 00:08:54.160
and it blows my mind.

00:08:54.440 --> 00:08:56.980
How many years of professional coding experience do you have?

00:08:57.260 --> 00:08:58.000
Less than two.

00:08:58.400 --> 00:09:01.360
One to two years, like zero to two years of programming.

00:09:01.840 --> 00:09:03.260
That's 50% of the people.

00:09:03.560 --> 00:09:10.180
Wow. 50% of the people in the Python space just started. And if you're one of those 50% listening,

00:09:10.510 --> 00:09:15.220
thanks for listening. I know a lot of people listen to our podcasts so that they can jump

00:09:15.490 --> 00:09:19.620
into the community and get up to speed. So that's pretty awesome. But this has tons of consequences,

00:09:19.880 --> 00:09:23.040
right? Like if you're creating tutorials and you're just like, Hey, yeah, install that,

00:09:23.100 --> 00:09:27.340
make a VNV and then install the package for local editing. Now we get started the tutorials,

00:09:27.510 --> 00:09:31.160
like hold on, you, you got to realize you're talking to people that are just getting started,

00:09:31.280 --> 00:09:31.880
like half of them.

00:09:32.160 --> 00:09:33.500
And I think that has a lot of implications

00:09:33.690 --> 00:09:35.560
for tooling, for tutorials,

00:09:36.120 --> 00:09:37.520
for presentations, et cetera.

00:09:37.840 --> 00:09:39.120
Yeah, but this is also,

00:09:39.580 --> 00:09:40.980
this question is how many years

00:09:41.350 --> 00:09:42.300
of professional coding,

00:09:42.520 --> 00:09:43.960
not necessarily how many years of coding.

00:09:44.330 --> 00:09:45.840
Yeah, there's more results in there

00:09:45.960 --> 00:09:47.700
that are like how much experience

00:09:47.820 --> 00:09:48.680
you have with Python at all,

00:09:48.840 --> 00:09:50.240
and it's like really quite low.

00:09:50.540 --> 00:09:50.720
Okay.

00:09:51.030 --> 00:09:53.000
So this, but this is also noteworthy

00:09:53.000 --> 00:09:54.140
in the sense that like,

00:09:54.740 --> 00:09:56.260
not just how much time do they have with Python,

00:09:56.570 --> 00:09:57.600
but how much they have time

00:09:58.040 --> 00:09:59.280
professionally coding at all.

00:09:59.600 --> 00:09:59.840
Yeah.

00:10:00.140 --> 00:10:00.260
Right?

00:10:00.440 --> 00:10:04.160
Yeah, and I'm noticing that a lot with people I teach as well,

00:10:04.860 --> 00:10:07.940
I get a lot of, on the Python test community,

00:10:08.360 --> 00:10:09.600
get a lot of questions that say,

00:10:09.860 --> 00:10:11.120
I don't know if I can ask this here,

00:10:11.300 --> 00:10:13.340
but basically I don't have any CS background.

00:10:13.820 --> 00:10:19.160
And so I don't know what a lock is or something like that.

00:10:19.760 --> 00:10:20.720
So I'm like, yeah, sure.

00:10:21.080 --> 00:10:21.680
Let's talk about that.

00:10:21.780 --> 00:10:22.160
Yeah, exactly.

00:10:22.540 --> 00:10:23.280
Yeah, and it's fine.

00:10:24.160 --> 00:10:25.140
Another one, I don't know.

00:10:25.380 --> 00:10:28.800
I've always thought of the Python community being broken into thirds,

00:10:29.220 --> 00:10:32.180
like one-thirds or web API, one-third data science,

00:10:32.250 --> 00:10:37.240
and one-third catch all others, automation, little tools, whatever.

00:10:37.920 --> 00:10:39.380
Well, that is no longer valid.

00:10:39.900 --> 00:10:41.980
Data science is now half of Python.

00:10:44.920 --> 00:10:45.360
51%.

00:10:45.410 --> 00:10:50.960
And it's probably 51% AI, too, because with AI, you can go over 100%.

00:10:51.020 --> 00:10:51.380
That's right.

00:10:51.510 --> 00:10:51.620
Absolutely.

00:10:51.790 --> 00:10:52.580
You don't need it to add up.

00:10:52.940 --> 00:10:57.040
Now, this does include data engineers who I got a message from so many.

00:10:57.440 --> 00:10:59.400
I don't want to be grouped in with data science.

00:10:59.630 --> 00:11:00.520
Like, okay.

00:11:01.420 --> 00:11:02.720
But you also don't belong in web.

00:11:03.220 --> 00:11:04.800
And you don't belong in other, I don't think.

00:11:05.190 --> 00:11:05.540
I don't know.

00:11:06.320 --> 00:11:08.960
But, you know, that does include some data engineering.

00:11:09.050 --> 00:11:12.400
But nonetheless, this is a significant portion.

00:11:13.140 --> 00:11:14.100
Another thing to keep in mind.

00:11:14.300 --> 00:11:18.220
Okay, so does this survey include the LLM people?

00:11:19.060 --> 00:11:19.800
Yeah, yeah, oh, absolutely.

00:11:19.890 --> 00:11:20.420
Yeah, yeah, definitely.

00:11:20.560 --> 00:11:24.380
I think a lot of this is people getting into machine learning and so on.

00:11:24.760 --> 00:11:30.000
Okay, this is, I think, the last main thing I wanted to, I know, two more things real quick.

00:11:30.340 --> 00:11:35.900
The other one is, and this one I think I want to put out there as a, if you were in this group, reconsider.

00:11:36.740 --> 00:11:42.880
Most people, 83% use a major version older of Python or older.

00:11:43.380 --> 00:11:48.240
I mean, we're at the end of 3.13, and it's like 83% are like 3.12 or below.

00:11:48.740 --> 00:11:49.260
And not just like-

00:11:49.260 --> 00:11:51.360
We're not at the end of 3.13.

00:11:51.480 --> 00:11:52.900
Well, no, not in the end of like support.

00:11:53.100 --> 00:11:56.020
I mean, we're about to have 314 is what I mean.

00:11:56.040 --> 00:11:56.620
Yeah, right.

00:11:56.840 --> 00:11:57.380
That's what I mean.

00:11:57.560 --> 00:11:59.180
Like it's 313 is not,

00:11:59.560 --> 00:12:01.720
it's about to no longer be the latest is what I'm saying.

00:12:02.020 --> 00:12:02.780
So this is pretty wild.

00:12:02.900 --> 00:12:04.020
And I did some quick math,

00:12:04.300 --> 00:12:05.560
just like, you know, some people are like,

00:12:05.640 --> 00:12:06.680
well, it works fine for me.

00:12:06.680 --> 00:12:08.240
I don't really need it to be any better.

00:12:08.460 --> 00:12:09.560
Like I don't need the new tools.

00:12:09.800 --> 00:12:11.600
So 311, let's say 311 is fine.

00:12:11.640 --> 00:12:13.200
Or let's say 310, 310 is fine.

00:12:13.380 --> 00:12:15.620
Even 39, it's supported for another couple of years, right?

00:12:15.920 --> 00:12:16.860
Probably, maybe one.

00:12:18.459 --> 00:12:21.180
But there's, I did, like, let me do some quick math here.

00:12:21.320 --> 00:12:23.060
Just see if I can put this in perspective

00:12:23.080 --> 00:12:28.700
Like in addition to just, you might need to be on the later version to have some of the newer tooling, right?

00:12:29.180 --> 00:12:34.080
Some of the new libraries and so on that decide to drop the old one so they can adopt some feature, right?

00:12:34.320 --> 00:12:34.420
Yeah.

00:12:34.740 --> 00:12:36.580
But I said, well, what if you're on 3.11?

00:12:37.579 --> 00:12:45.060
48% of the people currently using 3.11, if they upgraded to 3.13, their code would run 11% faster and use 10 to 15% less memory.

00:12:45.340 --> 00:12:45.560
Yeah.

00:12:45.580 --> 00:12:54.000
If you're on 310, you get a 42% speed increase and 20 to 30% less memory just by changing the Python you're running on.

00:12:54.400 --> 00:12:58.260
Chances are it's extremely minimal or zero upgrade cost.

00:12:58.260 --> 00:12:59.400
You just got to try it out.

00:12:59.620 --> 00:13:00.340
And then I also did some of that.

00:13:00.340 --> 00:13:01.720
Yeah, this is like no code changes.

00:13:02.000 --> 00:13:03.120
Just change the interpreter.

00:13:03.740 --> 00:13:03.900
Exactly.

00:13:04.340 --> 00:13:06.960
Just change the start command or what's installed.

00:13:07.400 --> 00:13:08.640
So what if you're a medium business?

00:13:08.720 --> 00:13:10.780
I did a little research like vendor.com and stuff.

00:13:10.800 --> 00:13:16.380
I said the average AWS bill for a medium-sized business is $2.3 million a year.

00:13:16.660 --> 00:13:19.200
And EC2 represents 50% to 70% of that.

00:13:19.640 --> 00:13:26.340
And if you're paying for a bunch of cloud machines or cloud compute in whatever form,

00:13:26.360 --> 00:13:35.720
and you get those boosts I talked about, well, your small business just saved $420,000 by just changing from 310 to 313.

00:13:36.520 --> 00:13:36.600
Wow.

00:13:36.680 --> 00:13:43.460
If you're a large scale business, like a large enterprise, you save $5.6 million by just switching to run on the newer version of Python.

00:13:43.550 --> 00:13:46.040
So anyway, I think these are like really, really interesting.

00:13:46.110 --> 00:13:51.240
And then the last one is there's a big resurgence in Python web development, I think.

00:13:51.590 --> 00:13:55.880
Over the years, this has been trending down 45, 43, 42%.

00:13:56.440 --> 00:13:57.500
But it's back, baby.

00:13:58.760 --> 00:14:03.300
And not just are people using, saying that they're doing a little more web development.

00:14:03.700 --> 00:14:14.280
But if you look at things like CSS or HTML in terms of how much they're used, they jumped, I think it's like 15% up year over year.

00:14:14.800 --> 00:14:22.460
Not a like 30 to 45%, but the increase from what it was to the new one is like a 15% growth from what it was previously.

00:14:23.060 --> 00:14:25.760
So like all in databases just across the board.

00:14:25.980 --> 00:14:34.040
So I think that's really interesting because there had been like a long, slow trend of kind of like Python's less for web, Python's less for web, probably more JavaScript.

00:14:34.320 --> 00:14:35.340
And it's like, it's back.

00:14:35.570 --> 00:14:36.580
So I think that's pretty interesting.

00:14:37.040 --> 00:14:40.920
And then there's a bunch of like guidance that I gave for people at the end.

00:14:41.080 --> 00:14:48.320
Like, okay, now that you know all this stuff, here are some actions, some actionable things you can do to take advantage of these trends and whatnot.

00:14:48.640 --> 00:14:50.420
So I've said enough about this.

00:14:51.000 --> 00:14:51.640
People can check it out.

00:14:51.740 --> 00:14:54.160
It's a super long and interesting article, I think.

00:14:54.400 --> 00:14:54.680
Yeah.

00:14:55.030 --> 00:14:55.400
Okay, cool.

00:14:55.580 --> 00:14:56.840
I can't wait to check this out.

00:14:57.140 --> 00:14:57.460
Yeah, indeed.

00:14:57.940 --> 00:14:58.780
All right, over to you.

00:15:00.440 --> 00:15:05.020
Well, I'd like to swap out and take a look at wrapt.

00:15:05.400 --> 00:15:06.660
Actually, I couldn't resist,

00:15:06.770 --> 00:15:09.220
so I'm going to talk about a package called wrapt,

00:15:09.290 --> 00:15:11.280
and I went ahead and looked at the PyPI stats,

00:15:12.440 --> 00:15:13.920
and it's used a lot.

00:15:14.280 --> 00:15:18.380
So it's the, I don't know, numbers percent-wise

00:15:18.590 --> 00:15:21.440
or where it is at the top packages or something.

00:15:21.840 --> 00:15:28.420
But it's downloaded almost 5 million, 4.8 million daily downloads.

00:15:28.820 --> 00:15:29.760
That's pretty good, pretty big.

00:15:30.060 --> 00:15:32.340
So a pretty popular package.

00:15:32.490 --> 00:15:33.420
So what is wrapt?

00:15:33.680 --> 00:15:36.620
wrapt is, I can't believe we actually haven't talked about this yet,

00:15:36.880 --> 00:15:41.380
but wrapt is a Python module for decorators, wrappers, and monkey patching.

00:15:41.700 --> 00:15:44.840
And to be honest, the first time I ran across wrapt, I thought,

00:15:45.050 --> 00:15:47.160
well, wait, don't we have functools wraps?

00:15:48.100 --> 00:15:49.040
That's what I've been using before.

00:15:49.980 --> 00:15:53.060
However, so let's talk about wrapt a little bit.

00:15:53.180 --> 00:15:57.020
The aim of the module is to provide a transparent object proxy for Python.

00:15:57.380 --> 00:16:05.020
Yep, wrappers, which can be used as a basis for construction of function wrappers and decorator functions.

00:16:05.540 --> 00:16:06.180
Right, got it.

00:16:06.520 --> 00:16:07.300
Funktools wraps, right?

00:16:07.760 --> 00:16:08.340
No, apparently.

00:16:09.340 --> 00:16:12.700
So the wrapt module focuses very much on correctness.

00:16:13.040 --> 00:16:18.020
It's therefore goes way beyond the existing mechanisms such as func tools wraps to ensure

00:16:18.300 --> 00:16:22.660
decorators preserve introspect ability signatures type checking abilities.

00:16:23.200 --> 00:16:23.280
Okay.

00:16:24.440 --> 00:16:24.540
Yeah.

00:16:24.590 --> 00:16:28.960
Cause sometimes you'll, you, you, like, let's say if you, one of the examples of, I can't

00:16:28.960 --> 00:16:34.060
remember where it is in the, in the docs, but if you, if something that is in a package

00:16:34.460 --> 00:16:42.039
is implemented as a property, not a method or then, then the return value is different

00:16:42.100 --> 00:16:43.180
than if it was just a function.

00:16:43.600 --> 00:16:46.020
But, and functools wraps gets that wrong,

00:16:46.480 --> 00:16:48.900
but wrapt, I think functools wraps gets that wrong,

00:16:49.100 --> 00:16:50.060
but wrapt gets it correct.

00:16:50.280 --> 00:16:53.780
It has it behave and signature wise look the same,

00:16:54.200 --> 00:16:54.800
which is pretty cool.

00:16:55.080 --> 00:16:55.820
Wish I knew about this.

00:16:57.420 --> 00:16:58.440
I just thought I was battling.

00:16:58.980 --> 00:17:00.620
This decorator doesn't have the right,

00:17:01.040 --> 00:17:03.840
you know, it transforms the type of signature

00:17:04.060 --> 00:17:04.900
of this function.

00:17:05.380 --> 00:17:06.480
So then you get some warning.

00:17:06.520 --> 00:17:07.300
I'm like, I don't care.

00:17:07.339 --> 00:17:07.939
It's a web function.

00:17:08.079 --> 00:17:08.900
No one's going to call it directly,

00:17:09.140 --> 00:17:10.540
but it's just an IDE warning.

00:17:10.579 --> 00:17:11.860
I'm like, ah, make it go away.

00:17:12.020 --> 00:17:21.740
And to be fair, the main reason why I usually am reaching for, if I reach for functools wraps is because it makes the name of the function be correct.

00:17:21.819 --> 00:17:23.880
And it isn't the silly little function.

00:17:23.939 --> 00:17:26.140
It changes the name and it changes the doc string.

00:17:26.240 --> 00:17:29.860
So if anybody's looking at the name or the doc string, it gets corrected.

00:17:30.200 --> 00:17:32.320
And if that's enough for you, yeah, that's fine.

00:17:32.520 --> 00:17:36.520
But it's kind of interesting looking at some of the history.

00:17:36.600 --> 00:17:38.580
So I was looking back.

00:17:38.860 --> 00:17:44.820
There's a blog that the creator of this wrote, Graham Dumpleton.

00:17:45.340 --> 00:17:55.220
And this is back from apparently originally, if we go to the blog, it's originally from 2014.

00:17:55.540 --> 00:17:57.540
He started writing these and he's kept them updated.

00:17:57.620 --> 00:18:00.620
So last update was five years ago, but original 2014.

00:18:01.180 --> 00:18:04.460
Anyway, how you implement your Python decorators is wrong.

00:18:04.580 --> 00:18:18.000
I was interested. One of the reasons why I was interested in this is the idea that it was around monkey patching and monkey patching is the original thought process as to why he wrote this is he was monkey patching things and it was incorrect.

00:18:18.780 --> 00:18:25.420
And interesting discussion over there on the blog about monkey patching and why why it's not just for testing.

00:18:25.660 --> 00:18:31.560
I use it a lot for testing, but it could be there's a lot of other use cases to interesting block series of blog posts about it.

00:18:31.700 --> 00:18:34.500
So pretty fun to take a look.

00:18:35.080 --> 00:18:38.040
One of the amazing examples in the docs,

00:18:38.560 --> 00:18:39.980
which I thought was really pretty awesome,

00:18:40.340 --> 00:18:42.520
there's some really easy examples that you'll get right away.

00:18:42.760 --> 00:18:44.080
And then it goes like pretty deep.

00:18:44.380 --> 00:18:49.320
So let's say you've got asynchronous code or multi-threaded code,

00:18:49.760 --> 00:18:53.920
and you want to synchronize those with locks.

00:18:54.980 --> 00:18:57.280
He's got this write-up, which is, you know,

00:18:57.380 --> 00:19:00.040
it's a kind of a lengthy write-up, but it's not too bad.

00:19:00.360 --> 00:19:03.580
And the end result, if you scroll to the answer at the bottom,

00:19:04.100 --> 00:19:06.720
is you can just have synchronized.

00:19:07.380 --> 00:19:10.540
You set up these locks and you decorate each function that you want

00:19:10.780 --> 00:19:13.620
synchronized with a synchronized decorator, and it just works.

00:19:13.980 --> 00:19:19.480
So it's kind of fun to be able to do things like put extra abilities

00:19:19.620 --> 00:19:22.420
around something like lock, grabbing a lock or something like that.

00:19:22.600 --> 00:19:23.580
Yeah, that's really cool.

00:19:23.720 --> 00:19:26.600
We're going to need more of that as free-threaded Python becomes the thing.

00:19:26.900 --> 00:19:28.500
People have to get used to those concerns.

00:19:28.580 --> 00:19:39.600
Yeah, and also one of my concerns with jumping from functools-wrapt to WRAPT,

00:19:39.820 --> 00:19:44.300
was I was worried about speed because it's doing a lot, so is it kind of slow?

00:19:45.720 --> 00:19:46.440
And apparently not.

00:19:47.080 --> 00:19:50.760
To ensure the overhead is minimal as possible, a C extension module is used.

00:19:51.060 --> 00:19:55.759
If it's available, an automatic fallback to a Python implementation is provided

00:19:55.780 --> 00:19:59.640
if the target system isn't extended for that target system.

00:19:59.840 --> 00:20:02.360
But for my use cases, as we've seen,

00:20:03.460 --> 00:20:04.520
most of my users are on Linux,

00:20:04.760 --> 00:20:06.020
so we're probably fine there.

00:20:06.780 --> 00:20:07.480
Yeah, that's really neat.

00:20:08.100 --> 00:20:09.200
Very neat, very neat.

00:20:10.140 --> 00:20:11.360
Let's see, what is next?

00:20:12.080 --> 00:20:14.920
Owen Lamont is back with a good recommendation for us.

00:20:15.200 --> 00:20:15.440
Okay.

00:20:16.020 --> 00:20:17.120
Yeah, he says,

00:20:17.590 --> 00:20:19.600
you should check out PySentry.

00:20:20.040 --> 00:20:21.740
So I did check out PySentry,

00:20:22.100 --> 00:20:23.260
and it's quite neat.

00:20:23.380 --> 00:20:24.100
So what is PySentry?

00:20:24.460 --> 00:20:27.900
It scans your Python dependencies for known vulnerabilities.

00:20:28.740 --> 00:20:31.260
And it's Rust-based, so it's fast and it might get VC funny.

00:20:31.660 --> 00:20:38.320
So what it does is you go into a folder, a project.

00:20:38.540 --> 00:20:41.580
I'm not sure if it needs an active virtual environment or just the files,

00:20:42.020 --> 00:20:48.380
but it will scan uvlock, poetrylock, piplock, pyproject.toml, pipfile, and requirements.txt.

00:20:48.860 --> 00:20:54.000
Look for specific versions of dependencies that you are specifying there.

00:20:54.360 --> 00:20:57.280
and it'll cross-check them with a bunch of vulnerability databases.

00:20:58.020 --> 00:21:00.220
Not just typo squatting type stuff,

00:21:00.680 --> 00:21:04.640
but just, hey, there was this vulnerability reported in the Django admin.

00:21:05.080 --> 00:21:08.660
You should update because you don't want to participate in that kind of fun.

00:21:09.140 --> 00:21:09.960
You're not about that life.

00:21:10.660 --> 00:21:11.500
So pretty cool.

00:21:12.660 --> 00:21:13.840
Yeah, it has multiple data sources,

00:21:14.000 --> 00:21:17.420
the PyPA advisory database, PyPI JSON API,

00:21:17.980 --> 00:21:20.900
OSV dev open source vulnerabilities, and so on.

00:21:21.100 --> 00:21:22.160
Yeah, and it's pretty neat.

00:21:22.500 --> 00:21:24.600
So you can specify different levels.

00:21:25.960 --> 00:21:28.840
Dependency scopes are supported like dev versus main,

00:21:29.220 --> 00:21:30.900
direct versus transitive dependencies,

00:21:31.640 --> 00:21:32.100
and that kind of thing.

00:21:32.440 --> 00:21:36.580
I ran it on our setup on pythonbytes.fm,

00:21:36.630 --> 00:21:39.460
which apparently, now one thing really quick here

00:21:39.520 --> 00:21:41.900
is it actually has more than,

00:21:42.260 --> 00:21:44.120
it says PySentry security audit.

00:21:44.540 --> 00:21:46.360
Summary, 89 packages scanned,

00:21:46.940 --> 00:21:48.840
one vulnerable, one vulnerability found.

00:21:49.280 --> 00:21:50.460
Ah, Brian, what's going on?

00:21:50.700 --> 00:21:52.300
There's actually more than 89 packages.

00:21:52.380 --> 00:21:54.580
for our website, but I don't know why.

00:21:54.760 --> 00:21:56.160
Maybe there's just no information

00:21:56.310 --> 00:21:57.960
about some unpopular ones,

00:21:58.050 --> 00:21:59.700
and so that's why they didn't show up.

00:21:59.900 --> 00:22:00.500
They weren't scanned.

00:22:00.810 --> 00:22:01.140
I don't know.

00:22:01.310 --> 00:22:02.100
I don't know why it's less,

00:22:02.200 --> 00:22:03.420
but that's my conjecture.

00:22:03.680 --> 00:22:09.420
It says there's one unfixed low severity CVE found,

00:22:09.700 --> 00:22:10.620
and it's unfixable.

00:22:10.890 --> 00:22:11.900
Great, that's why it's still there.

00:22:12.160 --> 00:22:12.560
What is it?

00:22:12.590 --> 00:22:14.160
It is an aiohttp.

00:22:15.600 --> 00:22:19.220
If an invalid IPv6 URL is passed to it,

00:22:19.370 --> 00:22:20.140
it will go bonkers.

00:22:20.500 --> 00:22:20.940
I don't care.

00:22:21.180 --> 00:22:27.160
This is the dependency of a dependency of a dependency that internally calls an API to its own service.

00:22:27.620 --> 00:22:29.960
And it uses aiohttp to do that.

00:22:31.260 --> 00:22:37.020
No one's going to pass a invalid IPv6 URL to that thing because it's not even part of our code.

00:22:37.060 --> 00:22:40.200
It just happens to be we ask the service to do something.

00:22:40.220 --> 00:22:42.940
It goes, OK, I got to call my API in the cloud and do that.

00:22:43.060 --> 00:22:44.180
Right. But here it is.

00:22:44.240 --> 00:22:45.900
So you can decide is that an issue or not.

00:22:46.260 --> 00:22:47.100
But still, that's pretty cool.

00:22:47.140 --> 00:22:50.220
Right. You could just run this in your project out periodically.

00:22:50.300 --> 00:22:53.600
or you could maybe run as part of CICD and get like warnings.

00:22:54.120 --> 00:22:55.640
Hey, maybe I shouldn't put this in production.

00:22:56.040 --> 00:23:00.260
It says there's a CVE severity level 10 out of 10 remote code execution,

00:23:00.640 --> 00:23:01.240
no auth required.

00:23:01.420 --> 00:23:01.980
Let's not do that.

00:23:02.180 --> 00:23:02.460
Yeah.

00:23:02.960 --> 00:23:03.120
Interesting.

00:23:03.540 --> 00:23:03.620
Yeah.

00:23:04.340 --> 00:23:09.400
One thing to be aware of, you don't uv tool install PyCentury.

00:23:09.720 --> 00:23:12.460
You install PyCentury-RS.

00:23:13.400 --> 00:23:14.820
So just be careful on the install.

00:23:14.840 --> 00:23:17.620
I don't know what's at PyCentury, but I presume it's not this.

00:23:17.940 --> 00:23:18.400
Oh, okay.

00:23:18.520 --> 00:23:20.440
So you have to be careful what you're installing.

00:23:20.840 --> 00:23:20.920
Yeah.

00:23:20.920 --> 00:23:24.120
Just look at the website and there's the same,

00:23:24.190 --> 00:23:26.400
the name of the command and the package are different.

00:23:27.120 --> 00:23:27.300
Yeah.

00:23:27.550 --> 00:23:28.740
And I know that that happens,

00:23:29.120 --> 00:23:29.980
but it always like,

00:23:30.150 --> 00:23:30.760
I don't like it.

00:23:31.200 --> 00:23:32.020
I don't like it.

00:23:32.220 --> 00:23:33.300
Just pick a different package name,

00:23:33.440 --> 00:23:33.560
people.

00:23:33.880 --> 00:23:34.100
Come on.

00:23:36.120 --> 00:23:38.720
One quick extra for me is that we,

00:23:38.980 --> 00:23:44.620
I talked about this last week that our testing code is being offline to

00:23:44.800 --> 00:23:45.740
archived or whatever.

00:23:46.140 --> 00:23:46.920
It's not going offline.

00:23:47.090 --> 00:23:47.520
I don't think.

00:23:48.180 --> 00:23:53.320
So last week, Michael convinced me to think about archiving it away.

00:23:53.560 --> 00:23:58.200
So you'll be able to go to testandcode.com and find it.

00:23:59.240 --> 00:24:04.880
For the foreseeable future, I think, looking into ways to offload it to somewhere else.

00:24:05.160 --> 00:24:08.340
But there's some pretty cool things that make it seamless.

00:24:08.780 --> 00:24:14.820
So I think that as I get time in the next couple of months, it'll transition over and nobody will know the difference,

00:24:15.120 --> 00:24:17.540
except for maybe the website will look different other than that.

00:24:17.820 --> 00:24:20.420
Also, I've gotten a whole bunch of great comments.

00:24:20.720 --> 00:24:24.640
So a lot of people have gone over to the contact page.

00:24:26.740 --> 00:24:31.520
And so in the episodes, I've said, hey, you can go over to pythontest.com,

00:24:31.900 --> 00:24:33.940
and there's a contact page, and you can reach me if you want.

00:24:34.500 --> 00:24:38.040
I'm not really fishing for compliments, but a lot of people have said,

00:24:38.260 --> 00:24:40.980
hey, I've enjoyed this podcast, and thanks.

00:24:41.700 --> 00:24:43.980
And just some nice emails have come in.

00:24:44.010 --> 00:24:44.520
So that's cool.

00:24:44.590 --> 00:24:45.240
So thank you, everybody.

00:24:46.000 --> 00:24:46.220
Very nice.

00:24:46.480 --> 00:24:48.460
And I'm glad to see you're keeping it online.

00:24:48.640 --> 00:24:48.860
That's cool.

00:24:50.260 --> 00:24:53.360
Actually, somebody contacted me and said that I was worried,

00:24:53.540 --> 00:24:54.760
so I downloaded all the episodes.

00:24:57.520 --> 00:24:58.920
So you don't have to do that.

00:24:59.880 --> 00:25:00.660
Very proactive.

00:25:01.020 --> 00:25:02.620
Okay, Michael, how about extras for you?

00:25:03.020 --> 00:25:04.240
I have some extras.

00:25:04.400 --> 00:25:06.100
I have some rumdoll follow-up.

00:25:06.660 --> 00:25:11.500
This is the Markdown Lentor that we talked about previously.

00:25:12.700 --> 00:25:14.280
Let me do it in reverse order.

00:25:14.340 --> 00:25:21.000
So I'm actually almost ready to release my Talk Python in Production book, which I've been working on.

00:25:21.120 --> 00:25:22.340
It's about 300 pages now.

00:25:22.540 --> 00:25:24.220
I'm going to release it as an e-book initially.

00:25:24.420 --> 00:25:26.520
If it's worthwhile, I'll eventually do a print.

00:25:26.660 --> 00:25:29.000
But certainly an e-book that you can get.

00:25:29.320 --> 00:25:33.740
So you can read about the first third of it online, which is fun.

00:25:34.120 --> 00:25:39.600
So if people are interested, they can go through and read the first seven chapters, I think,

00:25:39.900 --> 00:25:42.160
which is exactly what's in the book.

00:25:42.260 --> 00:25:47.220
and then you'll be able to actually buy the rest of the book pretty soon.

00:25:47.510 --> 00:25:48.640
So why am I starting out with this?

00:25:48.780 --> 00:25:52.040
One, I encourage you right now, it's not quite released yet,

00:25:52.160 --> 00:25:53.120
go click on buy the book.

00:25:53.520 --> 00:25:54.820
Please put your name in and email address.

00:25:54.960 --> 00:25:57.860
Say, I'm interested when this comes out and I'll email you very, very soon.

00:25:58.300 --> 00:26:02.020
But the reason I'm talking about this is I've been grinding on that thing

00:26:02.180 --> 00:26:05.080
with like 45,000 words worth of markdown with a rumble.

00:26:06.320 --> 00:26:07.720
And I have some reports.

00:26:07.900 --> 00:26:09.060
It's been going really well, actually.

00:26:09.460 --> 00:26:10.480
The thing works great.

00:26:11.140 --> 00:26:13.880
It's found some issues, some of them I didn't like.

00:26:14.110 --> 00:26:15.880
I didn't like the fixes it was proposing.

00:26:16.180 --> 00:26:21.020
We talked about it word wrapping at line 80 or whatever you set it at.

00:26:21.300 --> 00:26:21.920
And I'm like, no.

00:26:22.940 --> 00:26:25.800
My Markdown editors, it shows that kind of formatting.

00:26:25.870 --> 00:26:29.280
I want it to just wrap around and not be weird, no wrapping, wrapping.

00:26:30.300 --> 00:26:31.540
So you can turn those kinds of things off.

00:26:31.900 --> 00:26:32.300
Yeah, exactly.

00:26:33.140 --> 00:26:36.459
The other thing is I pointed out that there was a bug

00:26:37.060 --> 00:26:40.460
and not sort of looking up the directory tree

00:26:40.600 --> 00:26:42.460
to find the config file if you're down in the guts.

00:26:42.740 --> 00:26:44.740
And so Ruben very kindly said,

00:26:45.060 --> 00:26:46.120
you know what, that's a good idea.

00:26:46.240 --> 00:26:47.760
I'll fix it and just released a fix

00:26:47.980 --> 00:26:48.920
that made it a little bit better.

00:26:49.020 --> 00:26:51.140
There's a lot of traction going on here.

00:26:51.420 --> 00:26:51.860
Yeah, so-

00:26:51.860 --> 00:26:53.380
That would have bugged me too, yeah.

00:26:53.500 --> 00:26:55.240
Yeah, I'm like, well, the reason it bugged me

00:26:55.240 --> 00:26:56.780
is I was, there's like the book

00:26:56.780 --> 00:26:59.420
and then there's a source folder full of all the markdown

00:26:59.420 --> 00:27:01.560
and then there's other folders that are like output

00:27:01.560 --> 00:27:02.540
and assets and so on.

00:27:02.540 --> 00:27:04.699
And I was down in the lower one and I ran it on accident

00:27:04.720 --> 00:27:07.480
and it completely formatted and changed everything

00:27:07.800 --> 00:27:09.620
based on the defaults of the tool,

00:27:09.840 --> 00:27:11.740
not all the specs I set.

00:27:11.740 --> 00:27:14.140
And I'm like, no, no, no, no.

00:27:14.900 --> 00:27:16.500
You know how much work is this going to?

00:27:16.840 --> 00:27:18.500
Luckily, I just rolled it back in Git,

00:27:18.740 --> 00:27:20.980
but I'm like, it was easier to apply the few changes

00:27:21.060 --> 00:27:24.960
that I wanted to keep than to redo all those things.

00:27:25.700 --> 00:27:26.600
Anyway, that's fixed now.

00:27:26.620 --> 00:27:27.080
So it's awesome.

00:27:27.400 --> 00:27:29.720
And then finally, I thought maybe people

00:27:30.100 --> 00:27:32.600
would be interested in the config that I was using,

00:27:32.980 --> 00:27:33.560
that I am using,

00:27:33.820 --> 00:27:38.480
And I turned off a bunch of things and added comments to what I turned off, like line wrapping, for example.

00:27:38.940 --> 00:27:41.220
And also, I don't know where I got the config file.

00:27:41.300 --> 00:27:44.180
I got it from somewhere, but some of the settings were not right.

00:27:44.440 --> 00:27:49.920
Like, I can't remember exactly what it was, but maybe they were not under a global tag or some weird thing.

00:27:50.260 --> 00:27:51.020
And the TML.

00:27:51.440 --> 00:27:54.160
So I put mine up, and it seems to work if people want to borrow it.

00:27:54.300 --> 00:27:54.680
So anyway.

00:27:55.040 --> 00:27:55.160
Cool.

00:27:55.200 --> 00:27:56.580
So that's in the show notes, right?

00:27:57.200 --> 00:27:59.060
That is all in the, yeah, that's all in the show notes.

00:27:59.140 --> 00:28:01.960
I've made it a gist, and you can get it from the gist.

00:28:02.320 --> 00:28:03.220
It's just that easy.

00:28:03.620 --> 00:28:04.400
It's just that easy.

00:28:05.560 --> 00:28:06.240
That is right.

00:28:06.350 --> 00:28:06.460
Okay.

00:28:06.940 --> 00:28:09.380
And then I think, oh yeah, one more thing.

00:28:09.760 --> 00:28:17.060
Remember last time I speculated, could Python 3.13.6 be the final 3.13 before 3.14?

00:28:17.560 --> 00:28:17.680
No.

00:28:17.820 --> 00:28:18.580
The answer is no.

00:28:18.940 --> 00:28:19.380
No.

00:28:19.860 --> 00:28:21.000
The answer is a hard no.

00:28:21.250 --> 00:28:23.360
The answer is actually no.

00:28:23.770 --> 00:28:26.980
3.17 was released before you talked about 3.16.

00:28:27.240 --> 00:28:31.440
Because 3.16 came out, I wrote it in the show notes, and then I didn't look for a few days.

00:28:32.140 --> 00:28:34.320
We did the show and 3.17 had already come out.

00:28:34.620 --> 00:28:35.820
So that's a hard no.

00:28:36.280 --> 00:28:37.620
3.13.7.

00:28:38.100 --> 00:28:39.320
Yeah, sorry, 3.13.7.

00:28:40.840 --> 00:28:42.700
But here's the thing interesting.

00:28:42.980 --> 00:28:43.240
Why?

00:28:43.780 --> 00:28:44.520
Why is that the case?

00:28:44.900 --> 00:28:54.220
It is a emergency bug fix for an issue or a problem introduced in 3.13.6.

00:28:54.840 --> 00:28:57.680
So in 3.13.6, there was something that went wrong.

00:28:58.240 --> 00:29:00.180
And they're like, ah, what was it?

00:29:00.300 --> 00:29:04.220
a regression in the SSL module between 3.13.5, 3.13.6,

00:29:04.640 --> 00:29:07.200
reading from a TLS encrypted connection block.

00:29:07.380 --> 00:29:09.300
That actually sounds like you really want that to work.

00:29:09.900 --> 00:29:10.080
Yeah.

00:29:10.430 --> 00:29:11.860
Well, so don't predict it again,

00:29:12.240 --> 00:29:14.200
because the next one will just be,

00:29:14.490 --> 00:29:16.140
the reason will be to make Michael wrong.

00:29:16.760 --> 00:29:17.100
Exactly.

00:29:17.500 --> 00:29:17.600
Yeah.

00:29:18.000 --> 00:29:19.240
How about that for a release note, huh?

00:29:21.280 --> 00:29:21.460
Okay.

00:29:21.860 --> 00:29:22.920
That's it for all my extras.

00:29:23.440 --> 00:29:23.640
Okay.

00:29:24.080 --> 00:29:25.540
Are you ready for a joke,

00:29:25.630 --> 00:29:26.860
or you got something else for us first?

00:29:27.000 --> 00:29:28.660
It's like 98 degrees here.

00:29:28.860 --> 00:29:29.720
Yes, I'm ready for a joke.

00:29:30.020 --> 00:29:35.260
so i know neither of us have air conditioning in our current setup right now i'm above the garage

00:29:35.900 --> 00:29:40.480
in this separate building that has literally no ac i have to close the windows because the road noise

00:29:40.900 --> 00:29:45.900
is my little spa time my sauna time and i am in a house that used to have lovely air conditioning

00:29:46.100 --> 00:29:50.960
and it picked the hottest weekend of the year to break so because when else would it break

00:29:51.680 --> 00:29:56.960
all right well it's gonna be fine brian don't you worry about it you know why why because the

00:29:56.980 --> 00:29:59.160
this planet is marked for death.

00:29:59.900 --> 00:30:00.340
Okay.

00:30:00.880 --> 00:30:02.380
So says the Silver Surfer.

00:30:02.800 --> 00:30:04.800
Now, I don't even know what show the Silver Surfer is from.

00:30:05.360 --> 00:30:07.940
No, it's one of those like Marvel or Avenger type shows.

00:30:08.520 --> 00:30:10.440
But the Silver Surfer appears and says,

00:30:10.460 --> 00:30:11.740
your planet is marked for death.

00:30:12.020 --> 00:30:14.300
And people say, can we ask why?

00:30:14.700 --> 00:30:16.040
Well, the Silver Surfer says,

00:30:16.360 --> 00:30:19.660
because your planet's beings chose JavaScript

00:30:19.920 --> 00:30:21.820
as the primary language of web development.

00:30:22.020 --> 00:30:23.340
Clearly a fatal flaw.

00:30:23.840 --> 00:30:24.600
What is wrong with him?

00:30:25.020 --> 00:30:27.300
We're going to have to just finish you off.

00:30:27.300 --> 00:30:28.380
You're clearly not worthy.

00:30:31.460 --> 00:30:31.980
That's good.

00:30:32.280 --> 00:30:32.420
Yeah.

00:30:33.160 --> 00:30:37.020
I can come up with some other reasons that it might pick as well right now.

00:30:37.980 --> 00:30:38.340
You know what?

00:30:38.400 --> 00:30:40.940
The Silver Surfer is not a fan of front-end frameworks.

00:30:42.860 --> 00:30:43.960
I'll tell you what, though.

00:30:44.880 --> 00:30:50.000
At least my frustration with all this kind of stuff is not that JavaScript is a language for front-end development.

00:30:50.420 --> 00:30:52.720
It's that it's the only language ever.

00:30:52.800 --> 00:30:57.800
after 25, 30 years of code running in browsers,

00:30:58.400 --> 00:31:00.080
that it's the only language that's...

00:31:00.080 --> 00:31:02.020
And we've had WebAssembly for 10 years.

00:31:02.180 --> 00:31:02.920
It's fairly ridiculous.

00:31:03.840 --> 00:31:05.260
Anyway, thank you, Silver Surfer,

00:31:05.280 --> 00:31:06.280
for putting us out of our misery.

00:31:06.580 --> 00:31:06.860
Yeah.

00:31:08.140 --> 00:31:08.600
Maybe not.

00:31:08.940 --> 00:31:09.520
No, no.

00:31:11.400 --> 00:31:13.340
Pat says you should come visit Iowa, by the way.

00:31:13.660 --> 00:31:15.280
Lovely weather and not melting there.

00:31:15.640 --> 00:31:15.820
All right.

00:31:16.600 --> 00:31:16.960
Thank you, Pat.

00:31:16.980 --> 00:31:17.340
I like Iowa.

00:31:18.180 --> 00:31:18.360
Indeed.

00:31:19.059 --> 00:31:22.260
And with that, Ryan, thanks for a lovely show as always.

00:31:22.760 --> 00:31:23.000
Bye, everyone.

00:31:23.400 --> 00:31:23.420
Bye.

