WEBVTT

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

00:00:04.900 --> 00:00:10.320
This is episode 437, I can't believe that, recorded June 23rd, 2025.

00:00:11.030 --> 00:00:11.900
And I am Brian Okken.

00:00:12.260 --> 00:00:12.360
And

00:00:12.360 --> 00:00:12.960
I'm Michael Kennedy.

00:00:13.380 --> 00:00:19.020
And this episode is sponsored by Posit, so check out that section later in the episode.

00:00:19.460 --> 00:00:20.340
We really appreciate it.

00:00:20.470 --> 00:00:26.320
If you'd like to send us items or comment on the show, you can reach all of us.

00:00:26.380 --> 00:00:55.600
the links to our socials on blue sky and mastodon are in the show notes so check those out and if you'd like to sometime join us live or at least watch the show even later we since they're all they're all up later you can head over to pythonbytes.fm/live and find out where all the videos are or schedule to watch us we or hang out with us we um we do watch the chat and sometimes take questions from there or extra comments.

00:00:56.160 --> 00:00:59.420
And that is Mondays at 10 a.m. usually, 10 a.m. Pacific time.

00:00:59.760 --> 00:01:04.920
Also, finally, please go over to pythonbytes.fm and sign up for the newsletter.

00:01:05.680 --> 00:01:13.000
We're putting a lot of work into this to try to make this a useful resource for you, not just the links to the topics, but some of the background information.

00:01:14.360 --> 00:01:16.600
And it's just more than just the show notes.

00:01:16.820 --> 00:01:18.020
So check it out.

00:01:19.500 --> 00:01:20.900
They won't know until they subscribe, Ryan.

00:01:21.240 --> 00:01:23.320
Yeah, you just, I mean, you can always delete it.

00:01:23.410 --> 00:01:28.260
Like, we don't sell your name or anything or spam you, so might as well sign up and try it.

00:01:28.410 --> 00:01:33.420
Speaking of, I guess, Python stuff, Michael, do you want to kick us off with the first topic?

00:01:33.840 --> 00:01:37.840
I have a meta topic, a topic of topics, if you will.

00:01:38.240 --> 00:01:46.660
The Python Language Summit was held at PyCon this year, back in May, I guess May 14th, in Pittsburgh, Pennsylvania.

00:01:47.140 --> 00:01:49.180
However, why are we talking about this now?

00:01:49.560 --> 00:02:05.160
Because Seth Michael Larson, who is the, I don't know his title exam, I messed it up, sorry Seth, security developer in residence at the PSF for Python, was the official note taker, blogger, eyes of the community sort of thing.

00:02:05.420 --> 00:02:18.460
And they just, they just published on June 12th, the Python Language Summit 2025 write-up, which is a write-up of the whole event and the 10 or so talks that were given there.

00:02:18.780 --> 00:02:25.380
So you get some really interesting looks into where the core developers are focusing, what they're considering for the future.

00:02:25.540 --> 00:02:30.620
Most of this stuff is forward-looking, or at least if it's not 100% forward-looking, it's like, hey, we should be doing this.

00:02:30.720 --> 00:02:33.300
It's talking about problems that need to be solved in the future, you know?

00:02:34.000 --> 00:02:38.300
So I actually interviewed Seth over at Talk Python.

00:02:38.540 --> 00:02:40.280
This will be out in a couple of weeks.

00:02:40.420 --> 00:02:45.120
The live stream, like ours, is also available here at the links on Talk Python.

00:02:45.320 --> 00:02:47.240
So people can't wait for the edited version.

00:02:47.520 --> 00:02:48.300
they can check that out.

00:02:49.300 --> 00:02:56.040
But just to give you a sense of what was out there, some of the topics included how do we make breaking changes less painful?

00:02:56.460 --> 00:03:04.360
That was Itamar Oren from Meta talked about like when you move from say Python 3.11 to 3.13 or something like that, like what broke?

00:03:04.760 --> 00:03:19.680
You know, when you have millions of lines of Python like Meta does and that's executing at scale, you know, maybe minor, things that might seem minor inconsequential to the rest of us, like all of a sudden, that 5% performance change here made a big difference one way or the other, like that kind of stuff, right?

00:03:19.960 --> 00:03:22.300
And it talks about non-obvious problems.

00:03:22.560 --> 00:03:34.580
Like, for example, if you want to learn about something that was taken out, like if you think there's a problem because a part of a standard library was removed, well, the documentation was also removed.

00:03:35.340 --> 00:03:38.860
So it's like, how do you find the thing that was documented, but it's no longer there?

00:03:39.480 --> 00:03:46.680
You can go back in history to the different versions of Python docs, but the default is latest, which no longer, you know, which are basically 404s, which is weird.

00:03:47.480 --> 00:03:48.360
So like that kind of stuff, right?

00:03:48.620 --> 00:03:52.800
That's a decent idea just to like leave it in for versions.

00:03:54.180 --> 00:03:55.140
Just make the

00:03:55.140 --> 00:03:57.100
background like red or yellow or something.

00:03:57.120 --> 00:03:58.120
Go, this thing is dead.

00:03:58.380 --> 00:03:59.920
If you're viewing it, stop viewing it.

00:04:00.140 --> 00:04:00.780
It's going to hurt your eyes.

00:04:03.220 --> 00:04:04.820
The next, there was a whole series.

00:04:04.880 --> 00:04:19.440
I would say a third of this entire conversation was on async, IO, threading, concurrency, crazy ideas about like how do we deal with, What can we do to make it obvious at runtime that you're running into threading problems?

00:04:20.360 --> 00:04:26.780
Because just last week, Brian, you talked about this, the experimental tag came off of the free-threaded Python.

00:04:27.000 --> 00:04:28.280
So now it's really free-threaded.

00:04:28.400 --> 00:04:29.440
It's truly free.

00:04:29.740 --> 00:04:31.940
But there's a lot of like, well, what are the consequences of that?

00:04:31.940 --> 00:04:32.780
And how do we build for that?

00:04:32.780 --> 00:04:34.200
And what can we do to make this easier?

00:04:34.640 --> 00:04:35.280
And I'll put that in quotes.

00:04:35.740 --> 00:04:40.060
So there was an uncontentious talk about contention by Mark Shannon, which is like concurrency.

00:04:40.140 --> 00:04:45.080
What can we do to make things more immutable so that we can share them more easily and so on?

00:04:45.300 --> 00:04:47.340
There's the state of free-threaded Python by Matt Page.

00:04:47.700 --> 00:04:51.700
Fearless concurrency by three folks, Matthew, Tobias, and FreeJoff.

00:04:51.980 --> 00:04:54.020
Anything else on threading?

00:04:54.940 --> 00:04:55.360
Sort of.

00:04:55.690 --> 00:04:56.040
Not really.

00:04:56.530 --> 00:04:58.340
But, you know, out of 10 talks, that's quite a bit.

00:04:58.540 --> 00:04:58.680
There.

00:04:59.120 --> 00:05:01.180
There was some docs updates by Marietta.

00:05:01.440 --> 00:05:03.120
The challenges of the steering council.

00:05:03.310 --> 00:05:07.640
Like, basically, how has it been going the last couple of years now that we have a steering council and not a BDFL?

00:05:08.080 --> 00:05:08.920
And that was by Eric Snow.

00:05:09.060 --> 00:05:46.600
it's pretty interesting like hey good news things are still working not great news stuff led by a committee of volunteers goes slower than one person just goes sounds good surprise um some packaging stuff by barry warsaw and pradium get them python on mobile by russell keith mcgee so this is interesting in that peps 730 and 738 have been completed and russell went in front of all the core devs said after many years this year i can say that python on mobile is there how about that Now, that doesn't mean all the tooling, front-end frameworks, UI frameworks, all that kind of stuff are there for building Python apps.

00:05:46.940 --> 00:05:59.660
But CPython is now a tier three supported platform, which means the core developers as part of the continuous integration, everything of Python itself, make sure that it also builds on iOS and Android.

00:06:00.020 --> 00:06:00.480
That's what that means.

00:06:00.760 --> 00:06:01.240
Still good news.

00:06:01.320 --> 00:06:02.540
Yeah, I'm

00:06:02.540 --> 00:06:02.960
looking

00:06:02.960 --> 00:06:11.000
forward to the time where, I mean, I know that everybody is, but it'd be cool if I could just open up VS Code or PyCharm and write an iPhone app.

00:06:11.660 --> 00:06:13.600
I would probably practice my backflip,

00:06:14.180 --> 00:06:15.720
see if I could do a backflip if that happened.

00:06:15.770 --> 00:06:16.840
Like, that would be so awesome.

00:06:17.340 --> 00:06:17.820
It would be so

00:06:17.820 --> 00:06:18.140
good.

00:06:19.000 --> 00:06:20.180
Yeah, it would be so good.

00:06:21.280 --> 00:06:22.060
That and

00:06:22.060 --> 00:06:25.040
JavaScript frontend, like Python, PyScript frontends.

00:06:25.780 --> 00:06:27.000
Let's go here for both of them.

00:06:27.080 --> 00:06:38.660
Speaking of which, there was an update on Pyodide and the JavaScript FFI, the language bindings that allow PyScript or Pyodide, actually specifically Pyodide, to talk to the JavaScript stuff.

00:06:38.660 --> 00:06:46.200
So from Python front-end stuff, you can actually interact with JavaScript directly rather than indirectly, a little bit more clearly.

00:06:46.580 --> 00:06:59.120
And most importantly, there's slight variations in how you do this in MicroPython and Pyodide, which means you can't use interoperable code between the two in Pyodide, PyScript world, which is weird.

00:06:59.800 --> 00:07:02.460
And this is about trying to solve that amongst other things.

00:07:03.040 --> 00:07:05.080
And then finally, what do core developers want from Rust?

00:07:05.400 --> 00:07:07.460
Do people want Rust? Do they not want Rust?

00:07:08.800 --> 00:07:21.780
And if you're looking for native, probably the biggest piece of news here is that our best estimate is somewhere between a quarter and a third of all native code being uploaded to PyPI for new projects is based on Rust.

00:07:21.940 --> 00:07:22.460
That's pretty big.

00:07:22.700 --> 00:07:23.460
It is pretty big.

00:07:23.840 --> 00:07:23.960
Yeah.

00:07:24.760 --> 00:07:24.920
Yeah.

00:07:25.220 --> 00:07:31.480
All right. So I think either check out the blog post or listen to the episode I did with Seth.

00:07:31.840 --> 00:07:33.300
This is good stuff to track.

00:07:33.520 --> 00:07:34.240
Okay. Nice.

00:07:36.620 --> 00:08:20.160
All right. Well, I'm going to change gears completely and just talk about, zoom in on one thing about Python, and that is Python properties. So Will McCoogan wrote an article called Fixing Python Properties. And I just thought it was an interesting take on how to get around some type checking quirks. So he starts off with talking about basically the properties are awesome and the type checkers are fine with properties. However, the type of a property is taken from the getter method. And I guess that makes sense, but there really are two, there's getter and setter. So if those types don't match, your type checker is not going to like it.

00:08:20.480 --> 00:09:56.300
And so he walks through a, and I'm like, well, why, why would you want different types for your getter and setter? And he walks through a padding dimension example, which is, I think, I mean, he's doing textual so a decent um he's an example of he wanted to be able to just have somebody be able to say hey um for my padding if there's there's really four values but kind of like with css if you provide one value it's applied i don't remember all the rules it's applied everywhere if you if you apply to set two paddings it'll apply to like the distributes them appropriately just like css and so you can do uh basically one value two values or just an integer a tuple events of just two values or you can provide four um and all of this should just work and it does with python but you can make it work with like some you know with your code checking for all of those things but with type checkers it'll say you're doing something wrong and um he he said we i could make it like type check better but just like kind of destroy the user experience but instead he um he provides instead of doing properties so he just like rips out that the idea of the property um he's in the first example he's using the property the decorator um but he uses uh what he calls a descriptor which is i don't know if this is a real thing like he talks about it as if it's like a programming construct, but I'm not familiar with it.

00:09:56.520 --> 00:09:56.620
Anyway.

00:09:56.900 --> 00:10:02.000
Yeah, I think it's part of Python, like an advanced git adder, set adder sort of thing.

00:10:02.320 --> 00:10:07.160
It's a class that has, it's just a class that defines both a get and a set method.

00:10:08.360 --> 00:10:10.760
So that's your descriptor class.

00:10:11.200 --> 00:10:14.260
And he uses that instead of a

00:10:14.260 --> 00:10:14.820
property.

00:10:15.140 --> 00:10:22.780
And that is all it takes to be able to make it work without PyPI or without type checkers freaking out.

00:10:22.880 --> 00:10:23.980
So that's just it.

00:10:24.880 --> 00:10:25.580
Oh, an update.

00:10:26.840 --> 00:10:29.000
Somebody, Peter, pointed out an issue.

00:10:29.780 --> 00:10:30.900
Okay, well, I haven't read that part.

00:10:31.220 --> 00:10:34.040
But you know one of the problems with typing

00:10:34.040 --> 00:10:44.960
all over the place, and his thing says, look, it might be fine in my Pi, but then in VS Code, the Pi Lance validator understands this differently and gives you an error.

00:10:45.380 --> 00:10:52.860
One of the things that drives me utterly crazy is, like, you've got these different tooling, And they all have a slight variation of like, that's fine.

00:10:52.860 --> 00:10:54.440
Or like, actually, no, that's not fine.

00:10:55.180 --> 00:11:03.280
And we've got Ty and you've mentioned Pyrefly coming as well, which are going to be other ones probably have slightly different defaults.

00:11:03.520 --> 00:11:06.260
And so when you say I fixed it, like what did you fix it for?

00:11:06.740 --> 00:11:07.100
Exactly.

00:11:07.100 --> 00:11:07.500
Did you fix it for

00:11:07.500 --> 00:11:08.040
all of them?

00:11:08.080 --> 00:11:09.580
Did you fix it for your editor?

00:11:09.780 --> 00:11:11.020
Did you fix it for this CI?

00:11:11.400 --> 00:11:14.360
Like there's a lot of variations and it drives me crazy.

00:11:14.680 --> 00:11:18.740
And it's especially, so I just have like a couple of small packages that I maintain.

00:11:19.300 --> 00:11:25.660
And I have like, you know, like PyTouchCheck is now type, has type hints around it.

00:11:26.080 --> 00:11:27.000
And that's helpful.

00:11:27.380 --> 00:11:29.560
But it's a little bit of a quirky thing.

00:11:30.800 --> 00:11:36.140
And it doesn't, it works fine on mypy, but it doesn't work on some of the others.

00:11:36.660 --> 00:11:37.480
And I've had to write or

00:11:37.480 --> 00:11:37.720
something.

00:11:38.220 --> 00:11:39.120
Yeah, about that.

00:11:39.260 --> 00:11:40.880
I'm like, well, use mypy.

00:11:40.920 --> 00:11:41.240
I don't know.

00:11:41.500 --> 00:11:45.740
You can't really, if it's a dependent library, you really want to use that for everything.

00:11:46.400 --> 00:11:46.900
Yeah, exactly.

00:11:47.740 --> 00:11:47.940
It

00:11:47.940 --> 00:11:48.900
is a mess.

00:11:49.600 --> 00:11:50.660
I've had some stuff like that.

00:11:50.660 --> 00:11:52.360
It's like, this thing doesn't work right on PyRite.

00:11:52.400 --> 00:11:54.660
Like, okay, help me understand why I care about that.

00:11:55.200 --> 00:11:58.960
But they're like, you know, if I use it in this setup, I'm going to just get like errors.

00:11:59.240 --> 00:12:01.260
And it wasn't something super mild.

00:12:01.340 --> 00:12:04.080
It was for one of my web things.

00:12:04.320 --> 00:12:06.560
And basically the library was used as a decorator.

00:12:06.720 --> 00:12:11.460
So anything they decorate now gets like invalidated in terms of its type.

00:12:11.760 --> 00:12:11.900
I

00:12:11.900 --> 00:12:19.460
wonder if that's something now that I probably, for libraries, we should be testing against multiple type checkers, and that's just one.

00:12:19.760 --> 00:12:19.960
Probably.

00:12:20.280 --> 00:12:21.560
It's super annoying, but yeah, probably.

00:12:22.700 --> 00:12:36.200
And then here's the most annoying part of it was, though I think it was Pyrite, is like Pyrite was giving errors that now the Flask view method doesn't match the type or something, but Flask was fine with it.

00:12:37.339 --> 00:12:41.460
And nobody ever, ever, ever directly calls those functions.

00:12:41.700 --> 00:12:42.860
Only Flask calls it.

00:12:43.070 --> 00:12:44.320
And so like, here's some functions.

00:12:44.760 --> 00:12:45.540
Nobody calls them.

00:12:45.860 --> 00:12:46.720
It's affecting nobody.

00:12:47.220 --> 00:12:49.320
because they don't, no one even sees the type information.

00:12:49.840 --> 00:12:51.040
Flask sees it. Flask is fine.

00:12:51.160 --> 00:12:58.380
But I still have to like do really complicated typing information to get the type checkers to stop giving them more.

00:12:58.450 --> 00:12:59.140
Like, are you serious?

00:13:00.120 --> 00:13:02.220
It's not getting easier because we're getting more type checkers.

00:13:02.600 --> 00:13:08.720
Well, I thought all this was supposed to just be kind of invisible and we just get benefit and no cost.

00:13:09.680 --> 00:13:10.660
Until you get an issue about it.

00:13:10.880 --> 00:13:13.340
Now, I appreciate that people found the issue because I did fix it.

00:13:13.780 --> 00:13:18.480
but it was like a couple of hours of really complex type juggling.

00:13:19.020 --> 00:13:20.540
Oh, you're a nicer person than me.

00:13:21.220 --> 00:13:22.300
For something nobody called.

00:13:22.780 --> 00:13:23.180
Yeah, well.

00:13:23.400 --> 00:13:29.940
I did the classic, yeah, I don't use Pyrate, but, you know, I'd accept a pull request.

00:13:31.100 --> 00:13:31.340
Yeah,

00:13:31.520 --> 00:13:31.580
exactly.

00:13:32.980 --> 00:13:49.640
One other thing, like, so rolling back just a tiny bit, like properties, if I had to say, like, somebody said, Michael, what is the clumsiest, most non-intuitive, less than ideal, less readable or just bad part of Python, the language?

00:13:50.200 --> 00:13:50.460
Properties.

00:13:50.880 --> 00:13:51.940
It's so bad.

00:13:52.360 --> 00:13:57.920
There, I could have like in separate files, maybe it made me as separate parts of files.

00:13:57.970 --> 00:14:00.720
I could say over here is a getter and then somewhere else there's some weird setter.

00:14:00.730 --> 00:14:08.120
And like, why does the setter dot something like just the at setter dot variable name of a thing I've defined before?

00:14:08.500 --> 00:14:12.920
It's just so chunky and weird and the typing is a mess.

00:14:13.100 --> 00:14:18.240
If you look at the way C# does this, probably other languages as well, it is so nice.

00:14:18.380 --> 00:14:22.100
You just public property name, you have a getter and you have a setter right in there.

00:14:22.800 --> 00:14:26.960
I know that you could create separate classes for descriptors like Will was talking about.

00:14:27.140 --> 00:14:33.060
I think there might be maybe different performance profiles for those property versus a descriptor.

00:14:33.980 --> 00:14:36.680
But I would really like to see Python clean up.

00:14:36.800 --> 00:14:38.140
It doesn't have to be what C# does.

00:14:38.480 --> 00:14:45.280
but something where like they go together, they're obvious, you're not defining it twice, et cetera, et cetera, et cetera. It'd be nice. Wouldn't it be nice, Brian?

00:14:45.600 --> 00:14:46.800
Wouldn't it be nice?

00:14:47.940 --> 00:15:00.000
You know what is nice though? Our sponsor this week, Posit, super excited. Let me tell you about what they're offering everyone. So this episode is brought to you by the nice folks at Posit.

00:15:00.440 --> 00:15:09.500
So Posit, originally they came out of the R space, right? They made R studio and they made some other things, but they really have been putting a lot of effort into Python these days, right?

00:15:09.740 --> 00:15:14.780
They've created Posit Connect, awesome way to run and host your data science stuff.

00:15:15.300 --> 00:15:23.020
They made Shiny for Python, which is like a reactive notebook, like Marimo or a little bit like cheaper notebooks and stuff.

00:15:23.080 --> 00:15:24.020
So they're doing awesome stuff.

00:15:24.180 --> 00:15:26.840
So I'm really, really happy to have them sponsoring the show.

00:15:27.380 --> 00:15:31.120
Today, I want to focus on data science workloads and how to host them.

00:15:31.540 --> 00:15:37.700
So you have dashboards, reports, plots, interactive web apps, all the way to custom Flask or Django apps.

00:15:37.970 --> 00:15:40.040
They have a service called Posit Connect.

00:15:40.700 --> 00:15:44.540
And Posit Connect makes it easy for data scientists to share work they built with Python.

00:15:45.020 --> 00:15:51.920
So if you've got a Streamlit app, dashboard, Plotly, interactive plots, FastAPI, Quarto, just connect it to there.

00:15:52.460 --> 00:15:58.740
And their service will maintain it and connect automatically, hosts it, updates it for you, and so on.

00:15:58.920 --> 00:16:01.980
So you can even have it update reports on a schedule.

00:16:02.120 --> 00:16:11.380
So if you host a dashboard, you can have it rerun the data science stuff that computes the graphs and does the summaries like on a cron job sort of thing on a schedule.

00:16:11.660 --> 00:16:15.860
So no reason to explain to stakeholders why the dashboard or plot stopped updating last week.

00:16:16.140 --> 00:16:18.140
Just set it up, pause it, connect, got it going.

00:16:18.460 --> 00:16:25.220
So you can focus on your data science work and leverage your skill set while connect makes you look good, keeping your code running and private.

00:16:25.500 --> 00:16:31.460
With Connect, you get a private URL on your Connect server, ensuring that your asset is continuously available to your shareholders.

00:16:31.980 --> 00:16:34.660
You can control which users have access to that asset.

00:16:35.260 --> 00:16:38.600
And just let Connect handle all your DevOps for you.

00:16:38.970 --> 00:16:39.800
You can share your work.

00:16:40.040 --> 00:16:40.780
Keep doing what you do best.

00:16:40.940 --> 00:16:46.080
So if you work on a data science team, you owe it to you and your org to check out Posit Connect.

00:16:46.540 --> 00:16:52.760
Just visit pythonbytes.fm/connect and get a three-month free trial and see if it's a good fit.

00:16:52.900 --> 00:16:54.500
That's pythonbytes.fm/connect.

00:16:54.820 --> 00:16:57.560
The link is in your podcast player show notes right at the top.

00:16:57.980 --> 00:17:01.120
Thank you for Deposit for supporting Byte on Bytes.

00:17:01.400 --> 00:17:02.040
Yes, thank you.

00:17:03.120 --> 00:17:04.140
And a rewrite.

00:17:05.480 --> 00:17:05.780
All right.

00:17:05.949 --> 00:17:11.180
Well, next I want to talk about some complexity in your code.

00:17:11.680 --> 00:17:12.219
And Complexipy.

00:17:13.260 --> 00:17:13.699
Complexipy?

00:17:13.920 --> 00:17:14.560
Complexipy.

00:17:14.839 --> 00:17:17.240
It's C-O-M-P-L-E-X-I-P-Y.

00:17:18.120 --> 00:17:19.720
This is a project that's new to me.

00:17:20.220 --> 00:17:24.079
And actually looking at the repo, it looks kind of new.

00:17:24.860 --> 00:17:26.800
it's modified in the last weeks.

00:17:27.560 --> 00:17:29.480
So I'm really kind of enjoying it.

00:17:29.640 --> 00:17:30.760
So what is Complexify?

00:17:31.160 --> 00:17:41.700
So it's an extremely fast Python, I'm quoting here, an extremely fast Python library to calculate the cognitive complexity of Python files.

00:17:42.020 --> 00:17:48.180
And it's written in Rust, just like you said, a lot of PyPI stuff going up that's written in Rust lately or written parts of it in Rust.

00:17:49.020 --> 00:17:51.800
Looks like 45% Rust, 23 Python.

00:17:52.520 --> 00:17:59.400
Anyway, so this reminded me that I should be paying attention to complexity.

00:17:59.940 --> 00:18:00.980
So I'm glad this came out.

00:18:01.360 --> 00:18:02.820
So what is cognitive complexity?

00:18:03.360 --> 00:18:07.140
Well, it's kind of like cyclomatic complexity.

00:18:07.250 --> 00:18:08.900
Do you remember cyclomatic complexity?

00:18:09.300 --> 00:18:09.600
Kind of.

00:18:10.380 --> 00:18:13.600
I'm going to include a link to the Wikipedia page, but you can look.

00:18:14.500 --> 00:18:16.680
So I remember it from Flake 8.

00:18:16.900 --> 00:18:26.420
So Flake 8 had cyclomatic complexities and using the McCabe, I don't know, the McCabe test around it.

00:18:26.560 --> 00:18:29.600
But it would just sort of, I never used McCabe directly.

00:18:29.660 --> 00:18:31.040
I just used it with Flake 8.

00:18:31.500 --> 00:18:36.840
And now actually I'm using it with Ruff, which is kind of cool.

00:18:37.000 --> 00:18:47.500
I just recently realized this, that you can pass in the rule C901, and you can do a complexity check on with your rough tests.

00:18:47.980 --> 00:18:48.860
So that's super awesome.

00:18:50.240 --> 00:18:52.980
And so this is kind of fun.

00:18:53.680 --> 00:18:56.040
But what are we looking at for cognitive complexity?

00:18:56.340 --> 00:19:00.280
Well, there's a link within here of the white paper.

00:19:00.620 --> 00:19:04.560
There's a white paper, and you kind of have to – the white paper comes from Sonar Source.

00:19:04.860 --> 00:19:07.340
They do SonarCube, if anybody's familiar with that.

00:19:07.560 --> 00:19:09.060
It's a static analysis stuff.

00:19:09.460 --> 00:19:12.360
And I read the white paper and I skimmed it, really.

00:19:12.780 --> 00:19:32.000
But it's actually a really easy read, talking about how the idea around it is not just like giving you a number for your entire source code of how complex stuff is and where the problems are, but really looking at everything.

00:19:32.280 --> 00:19:37.120
So there's, you know, more loops, more structs, more everything.

00:19:37.640 --> 00:19:42.760
It's really a little bit different take looking at really the maintainability.

00:19:43.480 --> 00:19:54.700
So there's a discussion in the white paper talking about that cyclomatic complexity was intended to make it to measure how testable and maintainable.

00:19:54.910 --> 00:19:58.940
And the testable part comes from that the testability.

00:19:59.620 --> 00:20:02.360
Like if you have multiple branches, you have to test all the branches.

00:20:02.780 --> 00:20:05.040
So more branches means more tests.

00:20:06.220 --> 00:20:14.120
That it does well, but the authors of the white paper don't really believe that that it measures maintainability as well.

00:20:14.160 --> 00:20:15.240
So this is another attempt.

00:20:15.800 --> 00:20:17.080
And I think it does pretty good.

00:20:17.440 --> 00:20:20.140
And plus, it's super fast and the output is great.

00:20:20.600 --> 00:20:31.100
So I ran it on a couple of the, I ran both the rough version of the McCabe test and then this against my code, some of my code.

00:20:31.440 --> 00:20:33.860
And it came up with the same hot spots.

00:20:34.940 --> 00:20:38.200
And so I'm going to look at what the output looks like.

00:20:38.460 --> 00:20:43.080
I wish this was in color because it's in color when you're doing it on the command line.

00:20:43.420 --> 00:20:48.100
And the colors really help because it does like zero means like there's no problem here.

00:20:48.200 --> 00:20:49.840
It's not complex code.

00:20:50.460 --> 00:21:00.900
And then the numbers go up and there's, I think there's levels that you can set, but it's, there's the defaults are fine of, you know, yellow and red for things that you really want to care about.

00:21:01.280 --> 00:21:06.740
And then by default, it lists, like you pointed at a directory and it'll list out everything.

00:21:07.160 --> 00:21:12.600
You can just tell it to just, you can have it just list the problem parts too.

00:21:12.830 --> 00:21:14.960
But it is kind of nice to just see the whole thing.

00:21:15.050 --> 00:21:19.780
If you've got not too, too large of a project, if you have a huge project, definitely just look at the problem parts.

00:21:20.220 --> 00:21:26.440
The reason why I'm really excited about this again, oh, it talks about the analysis here in the readme even.

00:21:26.720 --> 00:21:27.040
That's nice.

00:21:27.340 --> 00:21:29.660
And you can output it to a CSV file or whatever.

00:21:30.120 --> 00:21:35.600
But I just did it on the command line because why would I use this?

00:21:35.800 --> 00:21:41.080
Not just as a pass fail within CI, which is a good idea to do a pass fail in CI.

00:21:41.440 --> 00:21:48.680
What I want to know is the areas of my code that probably might need refactored to be less complex.

00:21:49.080 --> 00:21:58.640
But if they're already as clean as they can be or they're that bit of code that you have that the person that wrote it is gone and you're not sure how to touch it.

00:21:58.960 --> 00:22:07.860
Those are the areas to really throw some unit tests around or some subsystem tests around those areas are a good thing.

00:22:08.560 --> 00:22:11.240
Anyway, think about, remember complexity.

00:22:11.610 --> 00:22:18.680
And I like the idea of not just of thinking of cognitive or maintainability complexity.

00:22:19.060 --> 00:22:20.040
This is a really cool idea.

00:22:20.390 --> 00:22:20.800
I like it.

00:22:21.260 --> 00:22:23.320
I am an absolute junkie for this stuff.

00:22:23.620 --> 00:22:24.020
I love

00:22:24.020 --> 00:22:24.200
it

00:22:24.200 --> 00:22:24.640
so much.

00:22:24.800 --> 00:22:26.360
So I'm glad you pointed out.

00:22:27.440 --> 00:22:31.120
Christian out in the audience says, great, Radon is really slow.

00:22:31.440 --> 00:22:35.120
So cognitive complexity is the last thing preventing me from dropping Flex 8.

00:22:35.320 --> 00:22:36.660
Superflake 8, pretty cool.

00:22:37.680 --> 00:22:46.500
And I used to, I mean, when I say used to, I'm talking like 25 years ago, used this tool called Code Rush, which was amazing.

00:22:46.700 --> 00:22:51.900
I've still not seen anything as great for an editor add-on as it did, even to this day.

00:22:52.400 --> 00:22:52.700
So good.

00:22:53.140 --> 00:22:58.380
One of the things it did, though, is it had maintenance complexity, cyclomatic complexity, and I don't know if it had this

00:22:58.380 --> 00:22:58.920
cognitive,

00:22:59.460 --> 00:23:01.040
but it had like line count was an option.

00:23:01.180 --> 00:23:12.200
And next to every, in your editor, next to every function or type in like a class or something, it would have the, you could choose, like, do you want the maintenance complexity or the cyclomatic complexity?

00:23:12.340 --> 00:23:14.460
Just sort of ambiently by your

00:23:14.460 --> 00:23:15.060
things.

00:23:15.460 --> 00:23:20.100
And you could be like, or you can run an analysis and say these are the seven that are like over some sort of threshold.

00:23:20.280 --> 00:23:23.900
Like I don't want it over 75 for my maintenance complexity, whatever that means.

00:23:24.280 --> 00:23:24.480
Yes.

00:23:24.810 --> 00:23:33.820
If people know about that, extensions like that for PyCharm and other editors, you know, shoot us a, put a comment on the YouTube channel, on the YouTube video

00:23:33.820 --> 00:23:36.360
or mention us somewhere, something like that.

00:23:36.680 --> 00:23:40.060
I'll have to try it out because Complexify does have a VS Code extension.

00:23:40.460 --> 00:23:41.720
I don't know how it looks though.

00:23:42.160 --> 00:23:43.220
So we'll have to check it out.

00:23:43.280 --> 00:23:43.420
Yeah.

00:23:43.500 --> 00:23:44.680
Does that just output it in the terminal?

00:23:45.000 --> 00:23:45.100
Yeah.

00:23:45.120 --> 00:23:45.640
Or does it actually

00:23:45.640 --> 00:23:46.860
overlay it like CodeLens?

00:23:47.060 --> 00:23:48.620
Yeah, it would be cool if it was an overlay.

00:23:51.060 --> 00:23:52.580
Pat is spreading fake news.

00:23:52.920 --> 00:23:57.580
Pat Decker, the audience who's been on the show, says, Michael volunteers to create a VS Code extension, is what I just heard.

00:24:00.320 --> 00:24:01.780
We're going to edit that section out.

00:24:01.780 --> 00:24:03.060
We'll just move right along here.

00:24:03.660 --> 00:24:03.980
All right.

00:24:04.520 --> 00:24:05.100
No, it's fun.

00:24:05.540 --> 00:24:05.700
Okay.

00:24:06.540 --> 00:24:08.740
I want to talk more data science stuff.

00:24:09.100 --> 00:24:12.800
Let's talk Juvio, J-U-V-I-O.

00:24:13.100 --> 00:24:32.780
I don't know. How would you say it, Brian? Every one of these needs like a little, how do I pronounce this button? Juvio. Is it Spanish? I don't know. So Juvio is a reproducible dependency aware, get friendly Jupyter notebook. All that sounds interesting. And there's a lot of things that say that, but what is, for me, what is, how's it, how do I think of this? And it is in the name.

00:24:33.140 --> 00:25:12.760
It's a Jupyter notebook sort of environment that is based on uv. So one of the things I find super clunky about Jupyter Notebooks and JupyterLab and Jupyter is you can create a virtual environment, you can install Jupyter in it, you run it, and then you have to somehow go and independently outside of Jupyter register your kernel to find that virtual environment so then you can use that thing. It's just like, what? Okay, so Juvio allows you to basically run commands in your notebook to install things, right? You can actually use the script thing from uv where you say script, requires this version of Python, these versions of the dependencies.

00:25:13.460 --> 00:25:20.340
And then when you open it up, Juvio installs the dependencies automatically in an ephemeral virtual environment using uv.

00:25:20.980 --> 00:25:21.560
All of that I'm loving.

00:25:21.780 --> 00:25:22.340
How cool is that?

00:25:22.620 --> 00:25:27.280
So you just put in, you know, this is what this notebook depends upon, even the version of Python.

00:25:27.590 --> 00:25:32.920
And if that version of Python is not on your machine, uv will download it and then create a virtual environment for you.

00:25:33.050 --> 00:25:34.320
That is awesome.

00:25:34.640 --> 00:25:35.220
That is awesome.

00:25:35.580 --> 00:25:35.700
Yeah.

00:25:35.880 --> 00:25:37.880
It's also Git-friendly.

00:25:38.160 --> 00:25:44.400
So notebooks are converted on the fly to script style format, which is where you have the hash, then percent, percent.

00:25:45.000 --> 00:25:48.900
So if you open it up in like PyCharm or VS Code, it has like cell type behavior.

00:25:49.300 --> 00:25:51.280
This one is for the Brave.

00:25:51.700 --> 00:25:52.600
It is an early beta.

00:25:52.980 --> 00:25:55.380
It's better than early alpha, I suppose, but an early beta.

00:25:55.600 --> 00:25:56.360
So check it out.

00:25:56.820 --> 00:25:58.260
Yeah, pretty nice.

00:25:58.920 --> 00:26:02.740
You can enable it as a extension is how you basically set it up.

00:26:02.860 --> 00:26:13.200
That reminds me like a little bit of a tangent, But you know that with uv, you can put those little script things at the top of your file to do your dependencies just in the file?

00:26:13.540 --> 00:26:14.880
Yeah, that's the same thing here, by the way.

00:26:15.100 --> 00:26:24.140
Yeah, I've just realized I've been going through using some of the stuff that I've built over the last many years at work.

00:26:24.820 --> 00:26:28.880
And some of the stuff, they had been little tiny little packages.

00:26:29.180 --> 00:26:32.620
And I realized that they don't need to be packages with this.

00:26:32.680 --> 00:26:35.320
They just have a couple dependencies in a single file script.

00:26:35.760 --> 00:26:38.640
And now they're back to just single file scripts again.

00:26:38.900 --> 00:26:39.400
That's cool.

00:26:39.640 --> 00:26:40.020
It's awesome.

00:26:40.110 --> 00:26:43.700
You just say uv run the script and it looks at that and says, all right, what do we need?

00:26:43.780 --> 00:26:44.340
Do we need Python?

00:26:44.660 --> 00:26:45.180
What version of Python?

00:26:45.460 --> 00:26:45.800
What dependencies?

00:26:46.480 --> 00:26:51.280
And once it's cached that stuff once, right, once uv has cached that once, it's basically instant.

00:26:51.700 --> 00:26:51.900
Yeah,

00:26:52.060 --> 00:26:52.300
it's cool.

00:26:52.580 --> 00:26:52.760
Yeah.

00:26:52.990 --> 00:26:53.120
Yeah.

00:26:53.240 --> 00:26:53.540
Super cool.

00:26:53.840 --> 00:26:56.640
So yeah, that's pretty much it.

00:26:56.640 --> 00:26:58.260
If that sounds interesting to you, check it out.

00:26:58.410 --> 00:26:59.300
Let us know what you think.

00:26:59.620 --> 00:27:08.560
but somehow making Jupyter Notebooks work automatically with ephemeral environments in Pythons managed by uv speaks to me. I like it.

00:27:09.320 --> 00:27:15.120
Oh, and Pat Decker suggests again alias py equals uv run. Perfect.

00:27:15.190 --> 00:27:15.820
So you can just pi.

00:27:17.160 --> 00:27:20.820
Doesn't work on Windows because there's already a pi, but alias itself doesn't work. So you know what?

00:27:20.950 --> 00:27:22.800
You have to create a batch file or something. I don't know.

00:27:23.400 --> 00:27:27.180
I guess. I've been using batch on Windows for decades, but

00:27:27.420 --> 00:27:28.460
you are such a

00:27:28.460 --> 00:27:28.660
rebel.

00:27:31.960 --> 00:27:55.620
so one quick extra for me is that testing code is not dead but it looks like it so testing code the last episode of it came out may 7th and checks calendar it's june 23rd what's up there what's up is kind of some life there's a lot going on outside of my day job and python bytes that is pushing this out.

00:27:55.640 --> 00:27:59.420
But I have some great interviews already ready.

00:27:59.900 --> 00:28:00.860
They just need edited.

00:28:01.380 --> 00:28:02.480
So stay tuned.

00:28:02.760 --> 00:28:04.160
There will be great stuff out.

00:28:04.280 --> 00:28:10.240
I just interviewed Sebastian Ramirez recently, and there's some great interviews coming up.

00:28:10.460 --> 00:28:12.220
So stick with it.

00:28:13.860 --> 00:28:15.320
Be patient with me, please.

00:28:16.160 --> 00:28:17.100
Anyway, we'll be back.

00:28:18.040 --> 00:28:20.080
But I never let Python Bytes drop.

00:28:20.380 --> 00:28:22.380
It's weekly, no matter what, because of Michael.

00:28:23.580 --> 00:28:24.520
Python Bytes is awesome.

00:28:24.900 --> 00:28:25.000
Yeah.

00:28:25.300 --> 00:28:25.840
Do you have any extras?

00:28:27.100 --> 00:28:29.520
I thought no, but I just realized I'll throw something out there.

00:28:29.620 --> 00:28:29.740
Okay.

00:28:29.920 --> 00:28:38.160
So later this week up in Washington, almost in Canada, there's the largest off-road motorcycle rally in North America, I believe.

00:28:38.560 --> 00:28:43.620
The Tour Tech Rally, which is like 1,500 people going to this campground and doing like joint rides and stuff.

00:28:44.220 --> 00:28:46.580
I'm going to be there from Thursday to Sunday.

00:28:46.980 --> 00:28:48.520
If people are there, shoot me a text.

00:28:48.900 --> 00:28:51.120
Come say hi or go riding together or something like that.

00:28:51.480 --> 00:28:51.600
All right.

00:28:51.720 --> 00:28:52.920
It's in Plain, Washington?

00:28:53.240 --> 00:28:53.420
It's not

00:28:53.420 --> 00:28:54.180
fancy in Washington?

00:28:54.560 --> 00:28:54.720
No,

00:28:54.960 --> 00:28:57.740
this is like basic camping.

00:28:57.880 --> 00:29:00.380
Well, can you put it on your motorcycle and then camp from there for four days?

00:29:00.580 --> 00:29:00.820
Okay.

00:29:00.980 --> 00:29:01.580
It's going to be very plain.

00:29:01.680 --> 00:29:03.960
It's actually right by Leavenworth, which I think is kind of a cool place.

00:29:04.260 --> 00:29:04.420
Cool.

00:29:04.740 --> 00:29:04.960
Oh, yeah.

00:29:05.560 --> 00:29:06.240
That's it for my extra.

00:29:07.460 --> 00:29:09.620
So shall we do a trio of jokes?

00:29:10.080 --> 00:29:10.400
Sure.

00:29:10.740 --> 00:29:11.020
All right.

00:29:11.480 --> 00:29:19.100
So someone sent this in, and I'm so sorry I forgot who sent it in, but I found it in multiple places, and it was really great that they did.

00:29:19.600 --> 00:29:20.260
Programmers are human.

00:29:20.580 --> 00:29:22.440
I think we've covered stuff from him before.

00:29:22.960 --> 00:29:26.060
This amazing German guy who does really good jokes.

00:29:26.160 --> 00:29:28.540
Like I think we talked about the vibe coding one one time.

00:29:28.740 --> 00:29:28.940
Yeah.

00:29:29.040 --> 00:29:29.200
Remember

00:29:29.200 --> 00:29:29.420
that?

00:29:29.860 --> 00:29:31.200
Senior engineer tried vibe coding.

00:29:31.300 --> 00:29:32.040
That was so good.

00:29:32.380 --> 00:29:36.620
So he's back with the interview with the 0.1x.

00:29:36.840 --> 00:29:38.180
People heard the 10x engineer.

00:29:38.340 --> 00:29:39.940
Like the 0.1x engineer.

00:29:40.560 --> 00:29:40.820
Full.

00:29:40.920 --> 00:29:41.940
I found the full episode.

00:29:43.060 --> 00:29:43.580
The 10th.

00:29:43.640 --> 00:29:44.280
What do you think of it?

00:29:44.700 --> 00:29:45.460
This was hilarious.

00:29:45.900 --> 00:29:50.340
I immediately, as soon as I watched this, I texted you also and said, have you seen this?

00:29:51.720 --> 00:29:53.120
Like, yeah, I watched it half an hour ago.

00:29:53.200 --> 00:29:53.580
It's so good.

00:29:53.820 --> 00:29:53.920
Yeah.

00:29:54.780 --> 00:29:56.140
We're not going to play it because I don't know.

00:29:56.360 --> 00:29:59.220
Like, it's someone else's YouTube work.

00:29:59.240 --> 00:30:00.460
We'll let them have it.

00:30:00.740 --> 00:30:02.640
But it is so good.

00:30:02.740 --> 00:30:05.280
It is certainly five minutes of time well spent.

00:30:05.420 --> 00:30:06.380
So we'll link to the YouTube video.

00:30:06.920 --> 00:30:09.860
It's got awesome comments like, yeah, the last stable release.

00:30:10.400 --> 00:30:10.760
Yeah, yeah.

00:30:10.920 --> 00:30:12.560
That was before I joined the company, wasn't it?

00:30:12.940 --> 00:30:13.880
And stuff like that.

00:30:14.820 --> 00:30:19.360
Or my job at the company is to optimize the file size of the readme.

00:30:21.220 --> 00:30:27.620
Yeah. Yeah. Or there's some, I've forgotten a lot of them, but there's some really good, good, good one

00:30:27.620 --> 00:30:28.340
-liners to.

00:30:28.540 --> 00:30:29.360
You want some sweet

00:30:29.360 --> 00:30:30.880
one-liners? Yeah, here we go.

00:30:31.080 --> 00:30:32.000
This is

00:30:32.000 --> 00:30:50.200
it. And totally unrelated. I have two more, not, not related to this, but I think Python relevant is Google came out with VO3, which is a, a way to make full film AI content, not just images, but it's images, voice, movie.

00:30:50.380 --> 00:31:12.580
it's insane. And so I've stumbled across this. Now, before you, before you click on this and before you visit it, I must warn you, this is like kryptonite to your YouTube feed. So if you watch this, it will take days to get anything normal on your YouTube feed again. I don't know why do it in incognito. Just trust me. Don't make the mistake me and my daughter made. She's like, dad, I got it. Literally got a text. Dad, you've destroyed my YouTube feed.

00:31:14.460 --> 00:31:21.720
So there's a couple of video, a couple of channels, and there's like multiple ones of these, But I'll link to a couple that are really good.

00:31:22.200 --> 00:31:24.540
There's a Bigfoot and a Yeti channel.

00:31:25.040 --> 00:31:30.640
And all these are like vlogs, like in the day of the life of Bigfoot and so on.

00:31:31.000 --> 00:31:34.820
And oh my goodness, is this so funny.

00:31:35.040 --> 00:31:36.540
And it is incredibly good.

00:31:36.700 --> 00:31:39.720
So you can only make eight second clips, right, with this video thing?

00:31:40.140 --> 00:31:40.500
So what

00:31:40.500 --> 00:31:45.160
they do is they just make clip after clip after clip as like little segments in like the vlog of the life.

00:31:46.040 --> 00:31:47.980
If you haven't seen this, I think you'll be surprised.

00:31:48.000 --> 00:31:51.120
If you, there's the Yeti Bigfoot one, which is real good.

00:31:51.300 --> 00:31:55.300
And then there's also the day in the life of a storm trooper, adventures of Dave and Greg.

00:31:55.940 --> 00:32:04.020
These, these are so funny and you know, they're made with Python somewhere along the way because of all the AI stuff and the VO and whatnot.

00:32:04.480 --> 00:32:08.640
But just remember incognito or you don't blame me.

00:32:10.340 --> 00:32:10.440
Yeah.

00:32:10.500 --> 00:32:12.080
I'll probably just use the Python bytes account.

00:32:13.200 --> 00:32:13.620
Yeah, exactly.

00:32:13.780 --> 00:32:13.860
Yeah.

00:32:13.940 --> 00:32:14.040
Please.

00:32:14.860 --> 00:32:15.460
We'll have nothing.

00:32:16.280 --> 00:32:17.940
I love nothing but these things in there.

00:32:18.040 --> 00:32:18.100
Now,

00:32:18.240 --> 00:32:18.980
it's really

00:32:18.980 --> 00:32:23.880
funny, and it's just one more AI thing in this world that we live in that is just a weird time.

00:32:23.920 --> 00:32:25.000
But it's super creative, too.

00:32:25.140 --> 00:32:27.500
Like, people really are being creative with it.

00:32:27.720 --> 00:32:27.880
Okay.

00:32:28.060 --> 00:32:28.540
And I

00:32:28.540 --> 00:32:40.280
got to just say that, like, you know, wherever you stand on AI, stuff like being able to make movies around with, like, Stormtrooper costumes and stuff, that is out of the realm of most people's

00:32:40.280 --> 00:32:41.200
budget.

00:32:42.000 --> 00:32:47.060
But the ability, I'm sure it's fairly time-consuming to put these things together.

00:32:47.540 --> 00:32:54.500
But now it is in the realm of somebody that just has some good writing, some good sense of humor to be able to put

00:32:54.500 --> 00:32:55.340
these

00:32:55.340 --> 00:32:55.940
things together.

00:32:56.240 --> 00:32:56.380
So

00:32:56.380 --> 00:32:56.980
that's good.

00:32:57.120 --> 00:32:58.700
Yeah, there's definitely good writing here.

00:32:59.380 --> 00:33:00.440
You've got to do the script and stuff.

00:33:00.810 --> 00:33:04.400
But comments are like, this is better content than Disney has done in the last few years.

00:33:04.560 --> 00:33:05.840
It's really funny.

00:33:06.180 --> 00:33:08.300
So, I mean, it's surprisingly well done.

00:33:09.000 --> 00:33:11.960
And the AI is, you know, we live in weird times, Ryan.

00:33:12.120 --> 00:33:12.680
That's all I can say.

00:33:12.800 --> 00:33:22.120
Well, in eight-second clips, I mean, pay attention to the last action movie you've watched that doesn't stick with the same camera angle for more than a few seconds anyway.

00:33:22.720 --> 00:33:23.100
Yeah, yeah.

00:33:23.350 --> 00:33:23.660
It doesn't

00:33:23.660 --> 00:33:24.120
seem that out

00:33:24.120 --> 00:33:24.400
of place.

00:33:24.680 --> 00:33:24.900
All right.

00:33:25.280 --> 00:33:25.720
There's your jokes.

00:33:26.080 --> 00:33:27.580
Seriously, relevant joke.

00:33:27.860 --> 00:33:29.460
Check out the 0.1x engineer.

00:33:29.680 --> 00:33:30.160
That's amazing.

00:33:30.500 --> 00:33:30.700
Yeah,

00:33:30.940 --> 00:33:31.160
definitely.

00:33:31.840 --> 00:33:34.200
Over lunch, maybe grab the logs.

00:33:35.780 --> 00:33:37.960
I'm really warning you, don't do it on your regular account.

00:33:39.960 --> 00:33:48.120
yeah all right well that's it for today a wonderful episode with you again michael thank you yes thank you as well and

00:33:48.120 --> 00:34:03.120
before we sign out this is not something we've been doing lately brian but maybe we should more it's like i just want to encourage people who are watching the youtube channel here either live or in in the future at some point you know please subscribe to channel like the video and help us spread the word yeah

00:34:03.120 --> 00:34:25.840
i guess we don't we don't like do call to action too much but uh like the videos that would be great but i also um uh we can grow the podcast more share it with a friend if you've got some new interns starting say hey you should keep up on python much more you should check out this podcast it's staying up on python in easy mode you got a car rider you're mowing the lawn you're doing the dishes hit play it's all

00:34:25.840 --> 00:34:27.240
good get to later bye

