WEBVTT

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

00:00:04.980 --> 00:00:09.060
This is episode 425, recorded March 24th, 2025.

00:00:09.890 --> 00:00:10.700
I am Brian Okken.

00:00:10.960 --> 00:00:11.660
And I'm Michael Kennedy.

00:00:12.040 --> 00:00:15.520
We are excited to announce that this episode is brought to you by Posit Connect.

00:00:16.020 --> 00:00:17.720
Listen to their segment later in the show.

00:00:18.360 --> 00:00:19.680
You can also connect with us.

00:00:20.750 --> 00:00:27.680
And if you go to our show notes and visit all the links, we're on Bluesky and Mastodon mostly lately.

00:00:28.560 --> 00:00:38.000
And if you'd like to actually thank you for listening, but also if you'd like to watch us live, you can check us out at pythonbytes.fm/live.

00:00:38.540 --> 00:00:43.200
Usually Mondays at 10 a.m., but it's spring break this week, so we're doing it a little early.

00:00:43.980 --> 00:00:55.780
And then finally, if you'd like to have all the links that we talked about delivered plus extra information delivered right to your inbox, go to pythonbytes.fm and sign up for the newsletter.

00:00:56.120 --> 00:00:56.960
We don't spam you.

00:00:57.050 --> 00:00:58.220
We just send you the newsletter.

00:00:58.580 --> 00:00:59.220
What

00:00:59.220 --> 00:00:59.900
do you got for us

00:00:59.900 --> 00:01:00.700
today, Michael?

00:01:01.020 --> 00:01:05.700
I want to kick off with a Twitter thread of all things.

00:01:06.260 --> 00:01:07.780
And this one's pretty interesting.

00:01:08.360 --> 00:01:13.400
So Armin Roeneker, original creator of Flask, put out a question.

00:01:13.840 --> 00:01:19.580
And it got a lot more attention than I would imagine it justified.

00:01:20.580 --> 00:01:22.580
And I found it so simple.

00:01:23.100 --> 00:01:25.080
And I just found it pretty interesting.

00:01:25.380 --> 00:01:25.620
Okay.

00:01:25.700 --> 00:01:31.340
The question is, if you use Python, but you don't use uv, why?

00:01:31.740 --> 00:01:32.760
You don't use it yet, why?

00:01:33.200 --> 00:01:33.260
Right?

00:01:33.340 --> 00:01:37.940
So I got like 215 responses, almost 1,000 likes, things like that.

00:01:38.200 --> 00:01:45.120
So I want to just call out some of, I'm not going to go read all 215 top level.

00:01:45.500 --> 00:01:47.720
He says, I'm going to call out some of the ones that I thought were interesting.

00:01:48.280 --> 00:01:50.760
And just get your thoughts, Brian, as well.

00:01:51.080 --> 00:01:55.380
So for example, someone said, I'm not going to also give attributes because there's a bunch.

00:01:55.600 --> 00:02:02.420
take forever. So someone said, I get it replaces pip in pi e and v, but should I use it instead of

00:02:02.420 --> 00:02:11.020
the built-in Python dash m v and v, v and v, right? Yes. Yes, you should. Yes, yes, you should also

00:02:11.620 --> 00:02:16.480
do that. The reason I'm calling this out, the reason I'm making this a topic is there were a

00:02:16.540 --> 00:02:22.539
lot of, I think a lot of misconceptions or a lot of people are like, what's UV? So I think those

00:02:22.560 --> 00:02:28.200
are worth touching on. So what are the awesome things about using uv, V, E, and V instead of

00:02:28.620 --> 00:02:35.000
Python, V, E, and V is, well, what if you don't have Python? Python, V, and V will just say error,

00:02:35.160 --> 00:02:40.660
no Python, right? uv says, oh, well, why don't we just get you the latest version of Python? Or you

00:02:40.660 --> 00:02:47.640
can say 3.12 or 3.11 or whatever version you want, or a specific minor version, right? Or build version,

00:02:47.740 --> 00:02:55.100
right? 3.13.1 instead of 3.13.2, whatever, right? So it frees you from even having to worry about

00:02:55.520 --> 00:02:59.780
having Python set up. I got two new computers, Brian, two new computers. I got a new laptop and

00:02:59.780 --> 00:03:05.520
a new Mac mini, and I have not installed Python on it. And I'm actually was a little bit bugged

00:03:05.900 --> 00:03:12.040
when something I had to brew install installed Python. I'm like, darn it, you're messing up my

00:03:12.240 --> 00:03:16.959
flow, right? I don't want any Python in here other than virtual environments. And I want those to be

00:03:16.980 --> 00:03:23.500
managed by uv. And the thing is, it's two seconds. Like with Pi, E, and V, what it does is it

00:03:23.740 --> 00:03:28.440
downloads and it builds locally, which if you don't have it can take 10 minutes or more. With uv,

00:03:28.570 --> 00:03:31.100
it takes two seconds, right? It's a thing of beauty.

00:03:31.300 --> 00:03:33.600
Well, I just ran into the build,

00:03:33.900 --> 00:03:39.960
a problem with the build recently, because if the, there's issues, especially on Windows,

00:03:40.460 --> 00:03:46.059
when if you've got your dependencies mucked up somehow, it can cause you to have to recompile

00:03:46.080 --> 00:03:52.720
some stuff and or try to recompile some stuff and and then you have to make sure they have the right

00:03:53.020 --> 00:03:56.600
like compiler libraries on your computer and stuff like that so that's a mess.

00:03:57.320 --> 00:03:59.040
Someone says but I need Python

00:03:59.040 --> 00:04:00.020
installed to make

00:04:00.020 --> 00:04:02.240
Python programs. I don't know yes but

00:04:02.570 --> 00:04:08.720
oh it's the previous comment. But I mean it is installing it using uv to install like it isn't

00:04:08.980 --> 00:04:14.360
installing it like you normally think but behind the scenes uv is putting it on your computer.

00:04:14.860 --> 00:04:15.180
This

00:04:15.180 --> 00:04:39.340
is an interesting one. I want to hear your thoughts on this. I'm anti this only because of my workflow, not against the person who made the comment. Because I don't use it because it places the VE and V folder inside of your project. And I can't run executables from there due to corporate policy. Many such use cases. No idea why Astral doesn't address this with more urgency. Someone responded, that sounds like a bad corporate policy.

00:04:39.640 --> 00:04:41.760
Also, it does. You can configure it to do that.

00:04:42.120 --> 00:04:45.840
Yeah, exactly. There's an environment variable you can set, have it, put it in somewhere else.

00:04:46.400 --> 00:05:01.180
Now, one of the things that made me never, ever adopt Conda is if you would go and create a Conda environment for a data science project, it puts it into some hidden folder, centralized hidden folder inside of your profile instead of inside your project.

00:05:01.300 --> 00:05:07.920
So I would go to a project and I'm like, did I, you know, a couple of months later and be like, did I ever make a virtual environment for this? Maybe.

00:05:08.400 --> 00:05:09.100
But then you got to say,

00:05:09.520 --> 00:05:11.680
Conda activate and name the virtual environment.

00:05:11.800 --> 00:05:13.120
I'm like, what did I call it?

00:05:13.390 --> 00:05:13.880
You know what I mean?

00:05:13.960 --> 00:05:15.500
They're like, oh, drives me crazy.

00:05:15.720 --> 00:05:17.580
And with it being inside the project folder,

00:05:17.670 --> 00:05:19.660
you can look, go, yep, there's a virtual environment there.

00:05:19.960 --> 00:05:20.480
I'm good to go.

00:05:20.720 --> 00:05:23.860
Same reason that I don't like calling mine.vnv.

00:05:24.070 --> 00:05:25.300
I just leave it without the dot

00:05:25.640 --> 00:05:27.900
because I can quickly see in the finder

00:05:28.300 --> 00:05:30.520
or a regular LS or whatever that,

00:05:30.710 --> 00:05:32.700
hey, look, it does have a virtual environment.

00:05:33.400 --> 00:05:33.600
All right.

00:05:33.900 --> 00:05:36.900
I'm too lazy to switch from Py, Env, and Pip.

00:05:37.400 --> 00:05:38.820
It seems like a U problem.

00:05:40.200 --> 00:05:42.820
There's lazy, like, I'm not going to walk two miles to the store.

00:05:43.480 --> 00:05:49.380
And then there's, I can't be bothered to put the word uv space pip instead of pip in my command.

00:05:50.440 --> 00:05:52.940
Well, and like, I'm lazy.

00:05:53.140 --> 00:05:59.420
That's why I am using uv because it speeds up everything and I can get on with my day faster.

00:05:59.740 --> 00:05:59.980
Yeah.

00:06:00.440 --> 00:06:06.280
Matthew Rocklin of Dask and Coiled had a really interesting comment once on Talk Python that basically like,

00:06:06.520 --> 00:06:12.180
So much in programming happens because we're leveraging the natural inclination for programmers to be lazy.

00:06:12.740 --> 00:06:15.680
Set it up so they can do this, so they have to do less work, and we'll do it.

00:06:15.980 --> 00:06:16.160
All right.

00:06:17.120 --> 00:06:18.020
I'll keep going quicker now.

00:06:18.380 --> 00:06:19.000
Trust issues.

00:06:19.360 --> 00:06:20.640
What if they do a bait and switch, right?

00:06:20.800 --> 00:06:21.620
It's VC-backed.

00:06:21.680 --> 00:06:23.000
What if they go, oh, all of a sudden?

00:06:23.640 --> 00:06:24.300
Two comments there.

00:06:24.580 --> 00:06:27.500
One, it's open source, and I'm sure a lot of people have forked it.

00:06:27.710 --> 00:06:30.440
Two, although there are still some potential issues,

00:06:30.700 --> 00:06:35.200
somebody's got to run the Python Build standalone for some of the features, but there's that.

00:06:35.660 --> 00:06:38.540
And they've already said that they won't, right?

00:06:38.820 --> 00:06:43.160
Charlie Marsh said, like, our business model does not hinge upon charging for uv.

00:06:44.080 --> 00:06:45.620
It's kind of an open core model.

00:06:45.920 --> 00:06:48.480
Okay, but Google used to say, don't be evil.

00:06:49.020 --> 00:06:49.640
So, yeah.

00:06:49.920 --> 00:06:52.460
Yeah, but Brian, I totally hear you.

00:06:53.000 --> 00:06:56.540
But did you look, when they said it, like, around their back, they had their fingers crossed.

00:06:57.700 --> 00:06:59.940
Look, I'm just telling you, you got to double check these things.

00:07:00.760 --> 00:07:01.260
No, I'm just kidding.

00:07:01.460 --> 00:07:01.980
I know they did.

00:07:02.080 --> 00:07:09.400
Actually, yeah, when VCs get involved and it's all well and good when there's lots of money and things get tight, then it could potentially.

00:07:09.430 --> 00:07:10.120
Well, and also we'll

00:07:10.120 --> 00:07:11.240
switch to something else then.

00:07:11.900 --> 00:07:15.260
We'll switch to uv fairly quickly if it becomes bad.

00:07:15.420 --> 00:07:15.780
We'll switch.

00:07:15.780 --> 00:07:16.760
Yeah, we'll switch to VU.

00:07:17.260 --> 00:07:19.140
So I have a reason,

00:07:19.500 --> 00:07:21.020
but when you run out of good reasons.

00:07:21.620 --> 00:07:21.840
All right.

00:07:21.920 --> 00:07:23.040
Another one, masochism.

00:07:23.250 --> 00:07:25.500
I haven't switched yet because I'm masochistic.

00:07:26.600 --> 00:07:27.040
Another one.

00:07:27.100 --> 00:07:32.540
Many times I've tried similar tools and always come back to pip and pip-tools, aka pip compile.

00:07:33.100 --> 00:07:33.860
Those, they just work.

00:07:34.170 --> 00:07:35.200
I don't want something cool.

00:07:35.600 --> 00:07:40.460
I know, but adding the word uv in front of each of these commands, like uv pip compile,

00:07:40.760 --> 00:07:44.240
UV pip install, it's not a huge risk to roll that back.

00:07:45.140 --> 00:07:48.460
Yeah, and we've tried the other ones also, and they were not as fun.

00:07:48.720 --> 00:07:49.020
Exactly.

00:07:49.900 --> 00:07:54.000
I tried this week and was expecting uv install requests instead of uv add.

00:07:54.460 --> 00:07:55.360
And I brought this one up.

00:07:55.430 --> 00:07:56.780
I switched back to pip envy.

00:07:56.840 --> 00:08:01.080
I thought that was interesting because there's sort of two workflows with uv.

00:08:01.740 --> 00:08:05.840
One says, treat it like poetry or hatch and let it manage your project.

00:08:06.120 --> 00:08:08.560
And that's the uv add style, right?

00:08:08.620 --> 00:08:10.280
It manages the lock file and so on.

00:08:10.500 --> 00:08:12.320
They were expecting uv install requests.

00:08:12.720 --> 00:08:17.540
If they typed uv pip install requests, they would have been carrying on with the regular workflow.

00:08:17.620 --> 00:08:23.700
And I do think it's worth shouting out that there's like two unrelated workflows for projects.

00:08:23.860 --> 00:08:28.300
And one is sort of the project manager poetry hatch style.

00:08:28.680 --> 00:08:31.440
And one is the more low level pip style.

00:08:31.820 --> 00:08:32.080
Yeah.

00:08:33.080 --> 00:08:33.219
Yeah.

00:08:34.360 --> 00:08:34.560
Okay.

00:08:35.140 --> 00:08:39.919
But the uv is like you can kind of flow between the styles and it all just works.

00:08:40.260 --> 00:08:45.140
Whereas in the other one, like you kind of had to buy into it or not.

00:08:45.820 --> 00:08:45.960
Yeah.

00:08:46.120 --> 00:08:46.820
It's all or nothing.

00:08:46.920 --> 00:08:47.060
Yeah.

00:08:47.440 --> 00:08:48.200
Another one really quick.

00:08:48.340 --> 00:08:49.140
We partially use it.

00:08:49.240 --> 00:08:52.340
We will transition when Pindabot support is available.

00:08:52.720 --> 00:08:53.600
See previous comment.

00:08:53.820 --> 00:09:01.540
If you say uv pip install and uv pip compile and use a requirements.txt file compiled by uv, you've got Dependabot support.

00:09:02.020 --> 00:09:05.160
For me, Dependabot support is a net negative.

00:09:05.340 --> 00:09:06.840
I hate Dependabot so much.

00:09:07.120 --> 00:09:13.380
I've tried to turn it off on some of my projects and I can't get it turned off without turning off all the security features at GitHub.

00:09:13.820 --> 00:09:18.740
So I've just had to set up mail rules that say delete anything from Dependabot that says bump.

00:09:19.020 --> 00:09:19.620
Bump this thing.

00:09:19.940 --> 00:09:26.400
Because I would wake up on Monday and I'd have probably 25, 30 separate messages from Dependabot saying,

00:09:26.730 --> 00:09:27.180
hey, guess what?

00:09:27.280 --> 00:09:28.220
You've got an update for this.

00:09:28.320 --> 00:09:29.100
You've got an update for that.

00:09:29.310 --> 00:09:29.600
I'm like,

00:09:29.820 --> 00:09:31.820
oh, Dependabot, please stop doing this.

00:09:32.220 --> 00:09:34.520
And if they would just go, your project has 17 updates.

00:09:35.040 --> 00:09:35.220
Okay.

00:09:35.640 --> 00:09:36.660
That would be kind of helpful.

00:09:37.100 --> 00:09:39.280
17 times your project has an update is not helpful.

00:09:39.760 --> 00:09:44.960
That said, if you use uv space pip compile and require it's not TXC, you have Dependabot support.

00:09:45.440 --> 00:09:45.580
All right.

00:09:45.700 --> 00:09:47.600
Last thought, I'll leave it with this one from Jared Sheel.

00:09:47.940 --> 00:09:50.980
seeing a whole lot of Stockholm syndrome in the replies to this question.

00:09:51.880 --> 00:09:52.200
Okay.

00:09:52.800 --> 00:09:52.960
Interesting.

00:09:53.620 --> 00:09:54.040
A lot

00:09:54.040 --> 00:09:56.340
of people were sort of, you know,

00:09:56.420 --> 00:10:00.220
they were tied to the things that were not working well or they were tied to the things.

00:10:00.340 --> 00:10:01.220
Well, this is how we do it.

00:10:01.480 --> 00:10:02.280
And I know it sucks.

00:10:02.540 --> 00:10:04.200
It's not better, but this is how we do it.

00:10:04.600 --> 00:10:04.980
You know what I mean?

00:10:05.260 --> 00:10:05.460
Yeah.

00:10:05.980 --> 00:10:06.080
Yeah.

00:10:06.200 --> 00:10:12.420
The one thing that I would like to, okay, there's a reason that you really get a lot of the benefit of UV

00:10:12.540 --> 00:10:14.400
if you globally install it.

00:10:14.400 --> 00:10:16.200
You do the curl install or something, right?

00:10:18.020 --> 00:10:23.720
That is, and also using, letting it install Python for you.

00:10:24.620 --> 00:10:33.180
With all the other Python dependencies, you can use your own custom, like a custom PyPI, like your own in-house PyPI.

00:10:34.040 --> 00:10:42.160
With that part, the curl install and the installing the binaries, Python binaries, I don't know if you can do that.

00:10:42.220 --> 00:10:50.780
So I think that that still might be a decent reason is because you're using a firewall in a company and that part isn't working right.

00:10:51.290 --> 00:10:59.380
But you can still pip install uv and I have done time tests and it's still faster to use the use uv even if you pip install it.

00:10:59.450 --> 00:11:00.320
So you

00:11:00.320 --> 00:11:01.240
just don't get all the benefits.

00:11:01.760 --> 00:11:02.300
Yeah, absolutely.

00:11:02.600 --> 00:11:02.740
Awesome.

00:11:03.540 --> 00:11:03.600
Yeah.

00:11:03.780 --> 00:11:04.940
Anyway, you got to already have a project.

00:11:05.050 --> 00:11:05.880
You can't start.

00:11:06.100 --> 00:11:06.700
You got to have Python.

00:11:06.750 --> 00:11:08.960
You got to have a V and V and then then you go from there.

00:11:09.340 --> 00:11:09.480
Yeah.

00:11:09.920 --> 00:11:10.100
Anyway.

00:11:10.400 --> 00:11:12.560
Which is fine because mostly that's what you're doing with life.

00:11:12.760 --> 00:11:14.000
You're not like constantly creating a project.

00:11:14.500 --> 00:11:15.480
I love our audience.

00:11:15.920 --> 00:11:16.720
Henry Schreiner.

00:11:16.800 --> 00:11:17.340
Hey, Henry.

00:11:17.780 --> 00:11:21.680
Just shouted out, Dependabot just added support last week for uv lock.

00:11:22.260 --> 00:11:22.580
How about that?

00:11:23.019 --> 00:11:25.460
Do you know how out of date that Twitter thread is?

00:11:25.580 --> 00:11:26.400
So last week.

00:11:27.000 --> 00:11:27.980
So last week.

00:11:29.220 --> 00:11:33.540
Well, and also a lot of the knowledgeable people probably didn't respond because it's on X.

00:11:34.740 --> 00:11:35.200
Yeah, that's true.

00:11:35.260 --> 00:11:40.500
Well, I mean, there's a surprising amount of interaction over there for what it is.

00:11:40.780 --> 00:11:40.960
Okay.

00:11:41.320 --> 00:11:41.580
Over to you.

00:11:41.920 --> 00:11:42.180
Okay.

00:11:43.280 --> 00:11:44.740
Let's talk about uv a little bit.

00:11:46.660 --> 00:11:46.860
Okay.

00:11:46.920 --> 00:11:47.420
We haven't done

00:11:47.420 --> 00:11:47.740
that yet.

00:11:49.819 --> 00:11:53.520
So I want to talk about this cool project from Tim Hopper.

00:11:54.280 --> 00:11:54.740
I love Tim.

00:11:55.600 --> 00:11:56.400
I kind of miss seeing him.

00:11:57.100 --> 00:12:01.880
He's one of the fellows that I used to run into at conferences all the time and haven't been to conferences lately.

00:12:02.140 --> 00:12:02.940
So hi, Tim.

00:12:03.360 --> 00:12:07.460
Anyway, he put out the Python developer tooling handbook.

00:12:08.220 --> 00:12:11.760
And it's an in-progress thing, but he's been working on it for a while.

00:12:13.200 --> 00:12:14.560
Yeah, Tim Hopper, great guy.

00:12:14.800 --> 00:12:18.700
Anyway, the Python developer tooling handbook.

00:12:18.940 --> 00:12:25.920
And it's walking through a lot of the, basically, the new models for doing things.

00:12:26.200 --> 00:12:31.500
There's, I don't know, it says it, I guess he does comment on a lot of these things.

00:12:31.840 --> 00:12:34.560
UV, Poetry, Flit, Subtools, Hatch.

00:12:35.800 --> 00:12:40.780
But I was noticing right away he's doing tutorials and how-tos and explanations

00:12:41.660 --> 00:12:44.320
and kind of a cool, and then some references

00:12:44.780 --> 00:12:47.340
and kind of a cool way to set up some documentation.

00:12:48.680 --> 00:12:52.320
But like, let's say publish your first Python package

00:12:52.960 --> 00:12:55.440
or let's do a create your first Python project.

00:12:56.120 --> 00:12:58.480
And instead of doing a lot of the history,

00:12:58.700 --> 00:13:00.560
he's just popping to you to the right answer.

00:13:01.160 --> 00:13:02.340
It's UVANet.

00:13:03.180 --> 00:13:09.860
And I mean, actually, a lot of the other init, like initializing projects, I haven't liked

00:13:09.980 --> 00:13:10.100
before.

00:13:10.360 --> 00:13:12.700
Even like the FLIT init, I didn't like.

00:13:12.960 --> 00:13:14.880
But UVANet is pretty darn good.

00:13:15.740 --> 00:13:16.900
They're doing a good job.

00:13:17.460 --> 00:13:20.920
And anyway, so using and then adding dependencies.

00:13:21.580 --> 00:13:25.720
And I love this, like, let's skip all the, well, you could do it nine different ways.

00:13:25.860 --> 00:13:27.320
Just tell me the way to do it.

00:13:27.880 --> 00:13:28.940
Or at least a way.

00:13:29.220 --> 00:13:31.500
It's opinionated, but it's a good opinion.

00:13:32.800 --> 00:13:36.380
And publishing your first package, talking about setting it up.

00:13:36.640 --> 00:13:37.680
Anyway, a cool resource.

00:13:38.060 --> 00:13:39.920
I hope to see it grow a lot.

00:13:41.020 --> 00:13:42.760
So anyway, I like it.

00:13:42.900 --> 00:13:44.340
It encourages people to test.

00:13:44.440 --> 00:13:48.240
It encourages people to use TestPyPI first before they go somewhere else.

00:13:49.140 --> 00:13:54.140
Although be careful because there's a lot of projects that don't use TestPyPI,

00:13:54.740 --> 00:13:56.940
and they clean that one out every once in a while.

00:13:57.040 --> 00:13:59.820
So even if a package is available

00:13:59.820 --> 00:14:04.260
on the test PyPI, it might not be available on the big PyPI.

00:14:04.860 --> 00:14:05.460
Yeah, yeah.

00:14:05.900 --> 00:14:08.980
So you're like, oh, it uploaded, so that means there's no name conflict.

00:14:09.330 --> 00:14:10.000
Like, no, no, no.

00:14:11.140 --> 00:14:12.020
Search PyPI.

00:14:12.380 --> 00:14:12.480
Yeah.

00:14:13.240 --> 00:14:16.860
But one of the things I wanted to bring up also is, let's see, right at the top.

00:14:18.380 --> 00:14:21.860
It says, this is not a book about programming Python.

00:14:21.940 --> 00:14:29.280
Instead, the goal of this book is to help you understand the ecosystem of tools used to make Python development easier and more productive.

00:14:29.680 --> 00:14:30.540
So it's going to grow.

00:14:31.230 --> 00:14:37.160
I commented about some of the testing already, and he said he's going to add some stuff about testing as well.

00:14:38.520 --> 00:14:46.320
He said the handbook is structured according to the DIA taxes framework, which, okay, didn't know anything about this.

00:14:46.520 --> 00:14:48.300
Tutorial, how to, explanation, and reference.

00:14:48.420 --> 00:14:54.080
So I'm not going to link to it, but there's a link here on his project about it.

00:14:54.300 --> 00:14:56.120
And I'm going to have to read more about this.

00:14:56.160 --> 00:14:56.780
This is interesting.

00:14:57.160 --> 00:14:58.000
I've never heard about this.

00:14:58.400 --> 00:15:00.040
I had not heard of it either, but it does look interesting.

00:15:00.380 --> 00:15:07.220
Anyway, and some great information about setting up Ruff to check your code and things like that.

00:15:07.520 --> 00:15:16.580
So I've been so excited about UVV and V and UVPIP and stuff like that that I kind of forget that I'm using Ruff all the time also.

00:15:17.260 --> 00:15:19.340
And it's kind of bundled into there.

00:15:19.740 --> 00:15:19.840
So

00:15:19.840 --> 00:15:20.640
I'm

00:15:20.640 --> 00:15:31.180
curious, while we're talking, like kind of transition to rough for a second, I was listening to that interview you did recently where you were talking about, I think you interviewed Charlie recently.

00:15:33.320 --> 00:15:37.860
And I, there's, I like, I like how detailed rough can be.

00:15:38.410 --> 00:15:46.760
But this is one of the things that I think I'm, I'm, rough can you can go in the PyProjectTML or there's roughTML also now.

00:15:47.380 --> 00:15:52.800
and I kind of like, I think I might transition to using the ruff.toml or try to

00:15:53.280 --> 00:15:58.080
because I end up having like a decent amount of tweaking the rules a little bit

00:15:58.140 --> 00:15:59.580
and I'm not really tweaking the project.

00:15:59.740 --> 00:16:00.060
I'm just

00:16:00.060 --> 00:16:01.980
tweaking the linting rules.

00:16:02.380 --> 00:16:06.340
So are you using, do you use rough and where do you put your rules?

00:16:06.340 --> 00:16:08.640
I love rough and I'm all about the rough.toml.

00:16:08.860 --> 00:16:13.280
Yeah, it definitely takes more than a page of small font on my screen.

00:16:13.760 --> 00:16:14.040
Okay.

00:16:14.460 --> 00:16:20.260
I don't want to, you know, you could reasonably have a PyProject.toml that's smaller than the ruff.toml.

00:16:20.640 --> 00:16:21.720
So, you know, I don't want to put those together.

00:16:22.040 --> 00:16:29.680
Yeah, and I loved Charlie's comment about the rules of even he doesn't turn them all on.

00:16:29.730 --> 00:16:30.400
That would be silly.

00:16:31.460 --> 00:16:32.080
So I tried it.

00:16:32.270 --> 00:16:33.600
I tried turning all the rules on.

00:16:34.380 --> 00:16:36.620
And there's some rules that are inconsistent.

00:16:36.820 --> 00:16:39.740
There's like two or three rules that are conflict with other rules.

00:16:39.960 --> 00:16:43.900
So you have to decide, you know, if you turn them all on, there's actually a built-in conflict.

00:16:43.960 --> 00:16:45.740
because a couple of the rules are conflict.

00:16:45.900 --> 00:16:48.560
But it gives you really great detailed information about how

00:16:48.560 --> 00:16:50.280
to fix it.

00:16:50.980 --> 00:16:55.120
Yeah, another benefit from using a rough TOML over pyproject.toml

00:16:55.460 --> 00:17:01.260
is if you're using Docker or basically any continuous integration style thing

00:17:01.660 --> 00:17:04.400
where it looks at, well, if any of the source files change,

00:17:04.400 --> 00:17:08.939
I need to rebuild or redeploy, restart your web apps, your APIs or whatever.

00:17:08.980 --> 00:17:15.420
you can make changes to your ruff.toml and having if you exclude that with like a docker ignore for

00:17:15.600 --> 00:17:19.860
example okay then you rebuild it it'll say yep there's no changes right unless those changes

00:17:19.970 --> 00:17:25.240
are like real code changes so i know it's not a huge deal but that's like a plus one in the column

00:17:25.290 --> 00:17:26.280
of separating those things

00:17:26.280 --> 00:17:27.000
yeah

00:17:27.000 --> 00:17:30.540
so if you're just doing a handful of rules it might be fine in your

00:17:31.080 --> 00:17:38.299
pyproject.toml but if you're experimenting with turning on more and more um uh rules um then uh

00:17:38.320 --> 00:17:39.960
yeah, putting it separate.

00:17:40.170 --> 00:17:46.640
I do, it's both surprising and cool that by default not all of them are on,

00:17:46.820 --> 00:17:49.420
because a lot of linters in the past, they defaulted to all on,

00:17:49.860 --> 00:17:53.080
and you'd try to use the tool and it would just like blow up with errors.

00:17:54.560 --> 00:17:55.800
But rough does not.

00:17:57.220 --> 00:18:00.020
It's got some good standard ones and then you have to go

00:18:00.020 --> 00:18:00.640
turn them on.

00:18:01.100 --> 00:18:01.160
So

00:18:01.160 --> 00:18:01.660
anyway.

00:18:02.280 --> 00:18:02.420
Yep.

00:18:02.730 --> 00:18:07.420
One more piece I saw in the tool book here that it was being added with a uv ad.

00:18:07.720 --> 00:18:17.880
I put rough into my system using uv toolinstall ruff because just globally and then have a ruff.toml for each project to configure it.

00:18:18.090 --> 00:18:22.660
So that way you don't have to have updates to your project or make sure you remember and install.

00:18:22.820 --> 00:18:24.860
It's just like a globally available tool.

00:18:25.620 --> 00:18:25.700
Yeah.

00:18:25.880 --> 00:18:26.080
Yeah.

00:18:26.360 --> 00:18:27.080
I should do that.

00:18:27.380 --> 00:18:28.100
I don't know why I don't.

00:18:30.560 --> 00:18:31.000
Anyway.

00:18:31.800 --> 00:18:36.280
Well, should we talk about the wonderful people at Posit that are helping us today?

00:18:36.620 --> 00:18:37.040
Absolutely.

00:18:37.180 --> 00:18:44.380
Okay. This episode of Python Bytes is brought to you by the folks at Posit. Posit has made a huge

00:18:44.600 --> 00:18:49.200
investment in the Python community lately. Known originally for RStudio, they have been building

00:18:49.500 --> 00:18:55.380
out a suite of tools and services for Team Python. Today, I want to focus on hosting your Python-based

00:18:55.860 --> 00:19:01.959
data science workloads. This includes dashboards, reports, plots, interactive web apps, all the way

00:19:02.300 --> 00:19:03.960
to custom Flask and Django apps.

00:19:04.280 --> 00:19:06.100
Their service is Posit Connect.

00:19:06.680 --> 00:19:09.240
Posit Connect makes it easy for data scientists

00:19:09.500 --> 00:19:11.480
to share work built with Python code.

00:19:11.780 --> 00:19:13.940
If you have a streamlit app, dashboard,

00:19:14.580 --> 00:19:17.240
Plotly interactive plots, a FastAPI service,

00:19:17.520 --> 00:19:20.220
or even a Quarto report, just give Posit Connect

00:19:20.620 --> 00:19:22.820
the code it needs to maintain the asset

00:19:23.400 --> 00:19:25.460
and Connect automatically does the rest.

00:19:25.760 --> 00:19:28.580
Connect will manage your APIs and serve your interactive apps.

00:19:29.000 --> 00:19:31.940
And if desired, update your ports and dashboards

00:19:31.960 --> 00:19:37.060
a scheduled basis. That's right. No more need to explain to the stakeholders why the dashboard or

00:19:37.100 --> 00:19:42.420
plot stopped updating last week. You get to focus on your data science and leverage your skill set

00:19:42.620 --> 00:19:47.700
while Connect makes you look good, keeping your code running in private. With Connect, you get a

00:19:47.820 --> 00:19:54.380
private URL on your Connect server, ensuring that your asset is continuously available to your

00:19:54.500 --> 00:19:59.940
shareholders. You can also control which users have access to the asset. Let Posit Connect handle

00:19:59.960 --> 00:20:01.980
the delivery and DevOps

00:20:02.460 --> 00:20:04.420
including you're involved

00:20:04.770 --> 00:20:05.700
in sharing your work.

00:20:06.180 --> 00:20:07.480
You focus on what you do best.

00:20:07.810 --> 00:20:10.060
So if you work on a data science team,

00:20:10.420 --> 00:20:12.200
you owe it to you and your org

00:20:12.270 --> 00:20:13.380
to check out Posit Connect.

00:20:13.860 --> 00:20:16.680
Visit pythonbytes.fm/connect today

00:20:17.010 --> 00:20:19.500
and get a three-month free trial

00:20:20.060 --> 00:20:21.000
to see if it's a good fit.

00:20:21.320 --> 00:20:23.300
That's pythonbytes.fm/connect.

00:20:23.860 --> 00:20:26.520
The link is in your podcast player's show notes.

00:20:26.940 --> 00:20:29.560
Thank you to Posit for supporting Python Bytes.

00:20:29.800 --> 00:20:30.080
Absolutely.

00:20:30.560 --> 00:20:49.080
Thank you, Posit. That's sort of a data science theme, right, Brian? Let's go and talk about something from Adam Chains. And I know we talked about rough, but what about black? So black is still a super important, super influential thing. I imagine with black, without black, maybe rough doesn't exist.

00:20:49.600 --> 00:20:54.500
So I want to come up, I want to point out a tool called Blacken Docs.

00:20:55.120 --> 00:21:03.860
So if you have documentation, and in that documentation, maybe you've got some code blocks, some Python code blocks, and you would like to format them.

00:21:04.300 --> 00:21:10.840
I don't know how well your Markdown Editor formats code, but I'll tell you what, I love my Markdown Editor, which is TypeHora.

00:21:11.180 --> 00:21:19.780
It does not have a reformat according to rough style feature whenever I say tick, tick, tick, Python, hype and stuff, right?

00:21:20.080 --> 00:21:20.500
This does.

00:21:20.960 --> 00:21:24.120
And so you can run this against all sorts of different things.

00:21:24.260 --> 00:21:25.280
So it says documentation.

00:21:26.220 --> 00:21:33.060
But if you look at it, what it will do is it works on restructured text or it works on markdown files.

00:21:33.560 --> 00:21:33.760
Okay.

00:21:33.840 --> 00:21:40.920
For example, I'm working on that Python in production book from Talk Python, which is like 250 pages of markdown.

00:21:41.300 --> 00:21:45.020
There's a crap ton of tick, tick, tick Python, something or other in there.

00:21:45.300 --> 00:21:46.140
Oh, yeah.

00:21:46.540 --> 00:21:47.660
I could run it against that.

00:21:47.680 --> 00:21:48.940
It doesn't have to be documentation.

00:21:49.440 --> 00:21:57.900
Anything that's restructured text or markdown that has Python code, you know, full size code block sections, you can just hit it with that.

00:21:58.220 --> 00:21:58.600
Oh, cool.

00:21:59.100 --> 00:21:59.600
That's cool, right?

00:21:59.880 --> 00:22:00.100
Yeah.

00:22:00.800 --> 00:22:03.560
You can also install a pre-commit hook.

00:22:03.580 --> 00:22:04.320
It comes with one.

00:22:05.040 --> 00:22:08.400
And then when anybody commits, it'll automatically format that.

00:22:08.560 --> 00:22:10.540
And I think, does it do doc strings as well?

00:22:10.820 --> 00:22:11.320
Let's see.

00:22:11.660 --> 00:22:17.720
I believe, yeah, you can run it on Python files to reformat doc strings.

00:22:17.900 --> 00:22:18.040
Yeah.

00:22:18.340 --> 00:22:21.620
So doc strings and basically markdown and restructure text.

00:22:21.740 --> 00:22:22.540
That's pretty awesome, right?

00:22:22.860 --> 00:22:23.060
Yeah.

00:22:23.420 --> 00:22:23.600
So

00:22:23.600 --> 00:22:24.380
there

00:22:24.380 --> 00:22:24.620
you go.

00:22:24.620 --> 00:22:27.940
You can even turn it off with some comments like, no, please don't do it here.

00:22:28.640 --> 00:22:29.080
And so on.

00:22:29.320 --> 00:22:30.020
So just to

00:22:30.020 --> 00:22:34.040
be clear, I mean, it's probably obvious, but it's not, it's not, it's, it's

00:22:34.320 --> 00:22:38.780
formatting the code blocks within your Markdown files to black style.

00:22:38.860 --> 00:22:40.960
There aren't black styles for Markdown.

00:22:41.200 --> 00:22:41.680
Yes, exactly.

00:22:42.200 --> 00:22:42.360
Okay.

00:22:42.680 --> 00:22:44.540
Although that's an interesting idea as well.

00:22:45.400 --> 00:22:49.240
I actually wouldn't mind a, something like black for Markdown because it drives me,

00:22:49.600 --> 00:22:56.380
I, I do headings with the pound and pound, pound and, and, but Markdown allows the underscore,

00:22:56.660 --> 00:22:59.620
the dashed line line underneath it.

00:22:59.940 --> 00:23:00.040
And

00:23:00.040 --> 00:23:00.940
I hate that.

00:23:01.240 --> 00:23:01.480
Trust me.

00:23:01.540 --> 00:23:01.940
I do too.

00:23:02.460 --> 00:23:03.960
It's like somebody came from a structured text

00:23:04.060 --> 00:23:05.100
and stuck it in there.

00:23:05.500 --> 00:23:07.460
So let's make it easier to convert our restructured text.

00:23:07.820 --> 00:23:08.200
No.

00:23:08.680 --> 00:23:09.620
No, please don't do that.

00:23:10.460 --> 00:23:12.320
We're here because we don't like structured text.

00:23:12.520 --> 00:23:13.660
Don't you understand what's happening?

00:23:15.520 --> 00:23:15.760
All right.

00:23:15.760 --> 00:23:17.660
Well, anyway, thanks, Adam, for that.

00:23:17.720 --> 00:23:18.820
That's a cool looking project.

00:23:19.280 --> 00:23:19.500
Yeah.

00:23:20.900 --> 00:23:24.440
I'm going to stick with some data science themes

00:23:25.000 --> 00:23:26.280
a little bit longer.

00:23:27.120 --> 00:23:33.120
so uh i want to talk about reinventing notebooks as reusable python programs have you heard of this

00:23:33.470 --> 00:23:35.580
uh marimo marimo thing

00:23:35.580 --> 00:23:40.660
marimo yes i just had the founder of marimo on talk python okay

00:23:40.660 --> 00:23:41.080
and

00:23:41.080 --> 00:23:41.500
yeah

00:23:41.750 --> 00:23:46.000
yeah it's it's not out yet but it's been you know been recorded and available on youtube

00:23:46.000 --> 00:23:46.580
okay

00:23:46.580 --> 00:23:47.040
um

00:23:47.480 --> 00:23:51.239
if this is sort of interesting i'm like oh okay somebody else is reinventing

00:23:51.620 --> 00:23:58.020
notebooks or something. But this is pretty cool. So this is, what are we looking at here? What

00:23:58.140 --> 00:24:04.060
we're looking at is, I'm going to pop down to some code examples, is that a notebook doesn't have to

00:24:04.200 --> 00:24:09.400
look like a notebook anymore in like JSON form or something. It can look like Python, or at least

00:24:09.540 --> 00:24:15.560
with the Marimo environment. And I'm not quite sure, you probably know more than I do then.

00:24:16.680 --> 00:24:19.720
Can you just open these up into notebooks,

00:24:19.990 --> 00:24:22.360
or do you have to do something special to get them open?

00:24:22.760 --> 00:24:25.720
So it's a different

00:24:25.720 --> 00:24:27.459
execution environment

00:24:28.240 --> 00:24:32.120
than, say, in Jupyter Space Lab or Jupyter Space Notebook.

00:24:32.360 --> 00:24:33.080
It's a different runtime.

00:24:33.600 --> 00:24:33.780
Okay.

00:24:34.120 --> 00:24:35.459
But they're real similar.

00:24:36.580 --> 00:24:37.380
Okay, got it.

00:24:37.720 --> 00:24:41.040
But I really like that it's just Python.

00:24:41.280 --> 00:24:42.680
Well, it's not just Python code.

00:24:42.840 --> 00:24:43.800
It's extra stuff also.

00:24:44.280 --> 00:24:48.480
It looks like they add some decorators to make their environment understand what it is.

00:24:48.520 --> 00:24:58.340
Like there's app.sell and at app.sell and at app.function and probably other stuff too.

00:24:58.860 --> 00:25:01.500
But some of the benefits of this are like incredible.

00:25:01.940 --> 00:25:06.420
So some of the benefits are that you can version with Git easier.

00:25:06.980 --> 00:25:10.340
Well, you can do that with JSON too, but the diffs don't really make a lot of sense often.

00:25:10.920 --> 00:25:12.800
The diffs are all over the place.

00:25:13.180 --> 00:25:14.440
You can test with pytest.

00:25:14.720 --> 00:25:16.460
And that one, I'm like, really?

00:25:17.299 --> 00:25:18.740
That's been one of the problems.

00:25:19.220 --> 00:25:23.280
Because in the past, testing is kind of an issue.

00:25:23.380 --> 00:25:25.680
Or at least it has been a long time ago when I tried it.

00:25:26.540 --> 00:25:27.840
Maybe they've solved it other ways.

00:25:28.420 --> 00:25:33.760
But testing even with Doctest and some of the other stuff in there.

00:25:33.860 --> 00:25:35.220
Embedding SQL and Markdown.

00:25:35.760 --> 00:25:39.640
Like all the sort of stuff that you can normally do with Python, you can now still do with these.

00:25:40.660 --> 00:25:42.480
And that's just kind of cool.

00:25:43.520 --> 00:25:46.020
I wanted to check this out and try it out.

00:25:46.440 --> 00:25:48.080
This is available for everybody to run, right?

00:25:48.880 --> 00:25:50.520
Yeah, it's available for people to run.

00:25:51.050 --> 00:25:52.220
You can download it, run it locally.

00:25:52.350 --> 00:25:54.400
They also have some cloud options.

00:25:55.000 --> 00:25:55.880
And it's really neat.

00:25:56.040 --> 00:25:57.960
There's super nice ways to host it.

00:25:58.740 --> 00:26:02.100
You just say run it as a service.

00:26:02.260 --> 00:26:03.640
One of the things that's pretty interesting here,

00:26:03.640 --> 00:26:06.140
let me steal the stage for a moment,

00:26:06.520 --> 00:26:09.760
is this all runs inside of,

00:26:10.880 --> 00:26:12.220
in your browser, client-side.

00:26:12.400 --> 00:26:15.280
So that's one of the big differences with, say, Jupyter versus this,

00:26:15.520 --> 00:26:18.740
is it's powered by WebAssembly and PyOxide.

00:26:19.580 --> 00:26:19.900
Okay.

00:26:20.400 --> 00:26:21.200
PyOdyed, rather, sorry.

00:26:22.620 --> 00:26:25.960
And so, for example, this one that I pulled up, I'll put it in the show notes,

00:26:26.120 --> 00:26:28.280
is the F1 Driver Career Explorer.

00:26:28.740 --> 00:26:29.960
And look how nice this looks, Brian.

00:26:30.320 --> 00:26:33.060
Like in terms of relative, compare that to Jupyter, for example,

00:26:33.200 --> 00:26:35.420
I think it's got like a really beautiful style.

00:26:35.880 --> 00:26:37.460
You know, you can check out, well, this is old.

00:26:37.620 --> 00:26:40.260
We've got to put Ferrari in here for Hamilton.

00:26:40.680 --> 00:26:42.180
You only got Mercedes and McLaren.

00:26:42.820 --> 00:26:47.320
But it was powered by, say, DuckDB WebAssembly, for example, and F1 data.

00:26:47.760 --> 00:26:51.160
And, yeah, it's got little Explorer sort of things.

00:26:51.460 --> 00:26:53.420
And it just feels really polished.

00:26:53.480 --> 00:26:57.680
It also has a collaborative edit sort of thing, like Jupyter Notebooks.

00:26:58.080 --> 00:26:59.460
Sorry, like Google Docs, rather.

00:27:00.200 --> 00:27:01.820
So you can, like, pair up on them.

00:27:02.000 --> 00:27:03.180
There's a lot of neat stuff about this.

00:27:03.380 --> 00:27:04.600
Okay, but this is, okay.

00:27:04.960 --> 00:27:07.800
It's still cool, but I misunderstood.

00:27:08.200 --> 00:27:10.540
I thought maybe it was just a new way to run Jupyter.

00:27:10.540 --> 00:27:12.360
notebooks. Yes,

00:27:12.510 --> 00:27:14.740
but with a decent amount of new features,

00:27:14.950 --> 00:27:18.200
I mean, yeah. Well, I guess the

00:27:18.200 --> 00:27:18.940
thing I'm

00:27:19.200 --> 00:27:22.920
missing then or not understanding is, is there a relation between this

00:27:23.020 --> 00:27:26.900
and Jupyter notebooks? Can you use any of the rest

00:27:26.900 --> 00:27:29.700
of the Jupyter environment? I believe so. I'm

00:27:29.700 --> 00:27:30.560
trying

00:27:30.560 --> 00:27:30.760
to

00:27:30.980 --> 00:27:34.500
remember now how much integration there is between those, but yeah, I think so.

00:27:34.770 --> 00:27:37.460
Okay, cool. I'll investigate more.

00:27:37.940 --> 00:27:38.440
Anyway,

00:27:39.340 --> 00:27:40.940
I'm still pretty excited about it.

00:27:40.940 --> 00:27:41.640
It looks pretty neat.

00:27:42.580 --> 00:27:43.520
I'll have to play with it a bit.

00:27:44.380 --> 00:27:45.180
Yep, absolutely.

00:27:46.220 --> 00:27:48.320
It's also another thing that it really tries to solve

00:27:48.500 --> 00:27:50.360
is they are trying to solve the...

00:27:50.360 --> 00:27:50.780
Oh, you know what?

00:27:50.780 --> 00:27:52.640
I said it had a Google Docs integration.

00:27:52.880 --> 00:27:53.360
Not exactly.

00:27:53.800 --> 00:27:54.720
But what they're trying to solve

00:27:54.840 --> 00:27:59.460
is the real challenges of integrating notebooks with Git.

00:28:00.020 --> 00:28:01.260
So, for example, with notebooks,

00:28:02.039 --> 00:28:03.580
they're really JSON files,

00:28:03.720 --> 00:28:06.100
and then they've got the input blocks and the output blocks.

00:28:06.500 --> 00:28:07.800
So if you've run some code

00:28:07.820 --> 00:28:09.840
and it's dependent on anything that might change.

00:28:10.280 --> 00:28:12.480
You'll get like huge, instead of getting a nice merge,

00:28:12.560 --> 00:28:16.360
you'll get two conflicts of giant embedded blobs and so on.

00:28:16.590 --> 00:28:16.720
Yeah.

00:28:17.290 --> 00:28:19.880
The other thing that this really addresses around notebooks

00:28:20.660 --> 00:28:23.820
is notebooks allow you to run them in any order,

00:28:24.040 --> 00:28:25.780
which is kind of insane, right?

00:28:25.940 --> 00:28:29.200
Like I could run cell one, cell two, cell three, cell four,

00:28:29.700 --> 00:28:33.000
change cell two, run cell four again to see what the output is.

00:28:33.090 --> 00:28:36.560
But maybe the changes would have made cell two be different

00:28:36.740 --> 00:28:37.640
or cell three be different.

00:28:37.780 --> 00:28:39.280
You can skip over.

00:28:39.560 --> 00:28:42.600
You'll have little numbers on the side of which order it was running.

00:28:42.700 --> 00:28:48.020
It'll be like 1, 7, 8, 19, 14 or something.

00:28:48.220 --> 00:28:49.540
As you go down, you're like, oh, this.

00:28:50.340 --> 00:28:55.820
So this is reactive in the sense that every variable you create is wrapped.

00:28:56.080 --> 00:28:59.080
It's not technically wrapped in a reactive behavior thing.

00:28:59.300 --> 00:29:02.640
They parse the DOM every time you run anything.

00:29:03.120 --> 00:29:04.980
And they create relationships between cells.

00:29:05.040 --> 00:29:08.200
They'll say like, okay, cell 10 uses something from cell 1 and cell 3.

00:29:09.260 --> 00:29:13.460
So if you run cell 3, it knows that cell 10 is out of date

00:29:13.960 --> 00:29:15.660
or potentially will just rerun it for you.

00:29:16.140 --> 00:29:19.540
So it keeps track of the relationships even depending on the order

00:29:20.000 --> 00:29:22.500
so that you don't end up with like stale data

00:29:22.680 --> 00:29:25.860
and then run another cell that pulls in that stale data and so on.

00:29:25.860 --> 00:29:27.440
So it's trying to really address that as well.

00:29:27.640 --> 00:29:28.180
That's cool.

00:29:28.560 --> 00:29:28.640
Yeah.

00:29:29.280 --> 00:29:32.480
That's one of the things that threw me off when I first started using Notebooks.

00:29:33.060 --> 00:29:33.420
Yeah.

00:29:34.400 --> 00:29:35.060
That's a little weird.

00:29:35.170 --> 00:29:37.900
Like, why is it allowed to just run this piece?

00:29:38.470 --> 00:29:41.460
And from an exploratory perspective, that makes sense.

00:29:41.490 --> 00:29:42.540
Like, well, those were all expensive,

00:29:42.740 --> 00:29:44.900
and now I just want to ask questions down here and over here.

00:29:45.300 --> 00:29:48.560
But from a reproducibility perspective and debugging, it's bad.

00:29:48.780 --> 00:29:49.400
Yeah, yeah.

00:29:50.280 --> 00:29:54.360
So anyway, neat, something fun new to play with.

00:29:55.320 --> 00:29:56.520
Indeed, yeah, it's pretty cool.

00:29:57.000 --> 00:29:59.940
So that's our items.

00:29:59.970 --> 00:30:01.200
Do you have any extras for us?

00:30:01.500 --> 00:30:02.980
I do have some extras.

00:30:03.500 --> 00:30:05.200
Let's see a couple real quick.

00:30:05.919 --> 00:30:11.540
PyCon Taiwan, PyCon Taiwan 2025, is doing a call for proposals.

00:30:11.940 --> 00:30:13.120
It's going to be in the fall.

00:30:13.310 --> 00:30:17.940
And so you've got until April 5th anywhere in the world.

00:30:18.560 --> 00:30:21.700
So if you want to go to Taiwan and present stuff there,

00:30:22.290 --> 00:30:26.300
they have a decent number of English tracks and talks and stuff,

00:30:26.460 --> 00:30:27.540
and they're looking for more.

00:30:27.740 --> 00:30:28.960
So check that out.

00:30:29.260 --> 00:30:31.960
Also, a follow-up on the Hacker News thing.

00:30:32.120 --> 00:30:36.860
Remember, Brian, I was reading the Hacker News thing saying, who's looking for a job?

00:30:37.040 --> 00:30:37.600
Who's hiring?

00:30:38.160 --> 00:30:42.320
Well, Shinjitsu sent us a message and said, I'm sure some other Hacker News readers have

00:30:42.500 --> 00:30:43.160
already told you this.

00:30:43.500 --> 00:30:44.040
No, they haven't.

00:30:44.180 --> 00:30:45.260
So thank you, Shinjitsu.

00:30:46.000 --> 00:30:49.400
But if you haven't, you kind of got this exactly wrong.

00:30:50.060 --> 00:30:50.780
Like, oh, sorry.

00:30:50.780 --> 00:30:56.800
It says, Ask Hacker News Who Is Hiring is a monthly post that asks employers to post what

00:30:56.960 --> 00:31:00.400
jobs they're posting, not people asking which one.

00:31:00.560 --> 00:31:05.700
And who wants to be hired is a monthly topic that has people who are looking for jobs about themselves.

00:31:06.980 --> 00:31:07.940
So did we have that backwards?

00:31:08.050 --> 00:31:08.860
It was actually bad news?

00:31:09.220 --> 00:31:10.720
Yeah, I think that's what it's saying.

00:31:10.770 --> 00:31:11.460
Let me see here.

00:31:11.780 --> 00:31:14.480
Yes, I think I said who wants to be hired was asked by the employers.

00:31:14.710 --> 00:31:17.680
And who is hiring was asked by the people looking for a job.

00:31:18.010 --> 00:31:19.880
But it sounds like it's the other way around.

00:31:20.040 --> 00:31:21.280
So that would make it less rosy.

00:31:22.110 --> 00:31:24.880
So sorry about that, folks, if that was a little bit backwards.

00:31:25.300 --> 00:31:25.860
Oh, okay.

00:31:26.210 --> 00:31:26.340
See?

00:31:27.120 --> 00:31:27.460
Errata.

00:31:28.400 --> 00:31:28.700
Errata.

00:31:29.020 --> 00:31:29.500
Yes, we have

00:31:29.500 --> 00:31:30.100
to have an errata.

00:31:31.080 --> 00:31:31.420
How about you?

00:31:32.320 --> 00:31:33.120
I got a couple of things.

00:31:34.060 --> 00:31:39.400
First off, PyCon US announced that there's a refund policy for international attendees

00:31:40.140 --> 00:31:43.780
if you qualify for certain things.

00:31:43.890 --> 00:31:47.960
And actually, I'm just embarrassed as American that we have to do stuff like this.

00:31:49.310 --> 00:31:53.080
But international travel in the United States has become more complex for many of our community.

00:31:53.460 --> 00:31:56.060
PyCon US welcomes all community members to Pittsburgh.

00:31:56.840 --> 00:32:02.840
But if for some reason you can't come because of various problems, read the post for details.

00:32:04.100 --> 00:32:09.600
But they're a fairly – I think a fairly cool refund policy details.

00:32:09.980 --> 00:32:15.120
So anyway, if you can't come for some reason, check this out and maybe you can get a refund.

00:32:15.120 --> 00:32:15.420
I've been thinking

00:32:15.420 --> 00:32:16.100
a lot about this.

00:32:16.340 --> 00:32:18.640
There's been a lot of badness.

00:32:19.080 --> 00:32:21.560
And I'm not happy about it, Brian.

00:32:21.740 --> 00:32:24.340
I'm not happy that our country is treating people that way.

00:32:24.420 --> 00:32:33.040
It's one thing if you catch somebody trying to sneak over the border and, I mean, it's a political debate on how lenient or aggressive you want to enforce that.

00:32:33.220 --> 00:32:42.900
But when people, especially from fellow ally countries, just try to come over and they get put in jail because they didn't have the right kind of visa or something, that is some bad stuff.

00:32:43.060 --> 00:32:43.640
That's embarrassing.

00:32:44.600 --> 00:32:49.000
Well, you would just never think that that was the way the U.S. would treat people.

00:32:49.060 --> 00:32:53.060
I know they've been a little bit tough on immigration, but, you know, Australia has, Canada has.

00:32:53.080 --> 00:32:56.820
I was detained at the Canadian border for a long time and finally was let into Canada.

00:32:57.480 --> 00:32:58.780
And it's, okay, it's a hassle.

00:32:59.100 --> 00:33:01.820
But this is another level of jerkery.

00:33:02.720 --> 00:33:03.160
Yeah.

00:33:03.620 --> 00:33:06.040
I am glad to see that PyCon is doing this.

00:33:06.420 --> 00:33:07.500
I apologize to the world.

00:33:07.670 --> 00:33:10.760
I guarantee you Brian and I are not supporters of this policy.

00:33:12.040 --> 00:33:13.560
We're supporters of the refund policy.

00:33:13.920 --> 00:33:15.020
Yes, not the

00:33:15.020 --> 00:33:15.880
cause of the refund

00:33:15.880 --> 00:33:16.260
policy.

00:33:16.430 --> 00:33:16.540
Yeah.

00:33:18.740 --> 00:33:18.960
Right.

00:33:19.340 --> 00:33:19.500
Okay.

00:33:20.380 --> 00:33:30.220
Oh, on a slightly more positive note, I finally finished up restructuring the complete pytest course series.

00:33:31.040 --> 00:33:36.560
So originally it was – so this is over at pythontest.com.

00:33:37.620 --> 00:33:47.420
This originally was – I had a remaking the pytest book I wrote as a course, and it was one course.

00:33:47.620 --> 00:33:54.100
But really the book was into three parts and intended to be read at different times during your development process.

00:33:54.330 --> 00:33:57.880
When you're first starting out at pytest, then when you're trying to apply it to projects.

00:33:58.460 --> 00:34:04.700
And then when you're like really good at it and you really want to like take off and get great at it, there's another section.

00:34:05.380 --> 00:34:12.280
And I had it in one course and it doesn't write quite – I don't think it really quite fit how people use pytest and learn pytest.

00:34:12.440 --> 00:34:13.840
So now it's split up.

00:34:13.870 --> 00:34:17.379
So you can still get the complete bundle and it gets the three parts.

00:34:17.800 --> 00:34:22.200
but the three parts learning the basics of pi test is a separate course now you can just buy it

00:34:22.340 --> 00:34:29.760
separate and then um and then you can grab uh part two um and then part three but also part two is

00:34:29.860 --> 00:34:34.179
working with projects part three the booster rockets like building really uh building

00:34:34.460 --> 00:34:38.379
plugins is why you'd probably grab this um and advanced parameterization techniques

00:34:38.379 --> 00:34:39.760
however

00:34:39.760 --> 00:34:40.679
even

00:34:40.800 --> 00:34:45.500
if you didn't buy the other ones i like having them separate now because if somebody's like i

00:34:45.500 --> 00:34:49.700
really want to build my own plugin, you can just go check out this one course instead of taking all

00:34:49.840 --> 00:34:54.520
three of them. So that's my big news there. The other, the other reason why the other structuring,

00:34:54.940 --> 00:35:01.060
restructuring that I did is I, all the chapters are now a single video per chapter for the most

00:35:01.160 --> 00:35:05.520
part. Chapters two and three are a bit long, so I split them up. So they're about 20 minutes each.

00:35:06.120 --> 00:35:12.000
But the thing that I really like about this now is that in each video you can pop in and you can

00:35:12.000 --> 00:35:18.140
change the speed so you can watch like the whole like i'm i'm usually a 1.25 or 1.5 speed kind of

00:35:18.220 --> 00:35:24.160
person um and it was bugging me that you had to reset that setting every three minutes like for a

00:35:24.200 --> 00:35:29.500
three or five minute video now now it's only like you only set it once for a 20 minute video so

00:35:30.300 --> 00:35:34.040
anyway works better for me hopefully it works better for everybody else too so

00:35:34.040 --> 00:35:34.960
that's

00:35:34.960 --> 00:35:35.940
my that's

00:35:36.040 --> 00:35:39.820
my big extra so yeah awesome congrats on getting that all already done that's great

00:35:39.820 --> 00:35:40.820
yeah

00:35:40.820 --> 00:35:41.960
so um

00:35:42.420 --> 00:35:42.780
How about a joke?

00:35:42.820 --> 00:35:43.520
Shall we boldly go?

00:35:44.100 --> 00:35:44.960
No one has gone before.

00:35:45.430 --> 00:35:45.580
Yeah.

00:35:45.870 --> 00:35:49.840
So last week's joke was around, was a Star Trek Klingon theme.

00:35:51.140 --> 00:35:52.940
And we had, who was it?

00:35:53.640 --> 00:35:59.260
We had somebody from Holgi on Mastodon said, again, you probably already know this,

00:35:59.540 --> 00:36:03.800
but there's this thing called Klingon programmers.

00:36:04.490 --> 00:36:06.400
So this is over at Cornell.edu.

00:36:06.820 --> 00:36:10.820
Top 12 things likely to be heard if you are a Klingon programmer.

00:36:11.620 --> 00:36:15.000
And I kind of love this, so we should probably zoom in a little bit.

00:36:15.360 --> 00:36:19.920
Okay, we're not going to read all 12, but number 12 is actually pretty good.

00:36:20.420 --> 00:36:23.040
Specifications are for the weak and timid.

00:36:24.400 --> 00:36:25.240
Do you want to read any of these?

00:36:25.980 --> 00:36:26.580
Let's see.

00:36:27.200 --> 00:36:28.600
This machine is a piece of God.

00:36:28.960 --> 00:36:32.820
I need a dual Pentium processor if I am to do battle with this code.

00:36:34.920 --> 00:36:38.640
Yeah, number four, a true Klingon warrior does not comment his code.

00:36:39.500 --> 00:36:39.900
Debugging.

00:36:40.360 --> 00:36:41.240
Klingons do not debug.

00:36:41.460 --> 00:36:43.140
Our software does not coddle the weak.

00:36:51.080 --> 00:36:53.320
Klingon functions do not have parameters.

00:36:53.500 --> 00:36:55.720
They have arguments, and they always win them.

00:36:57.280 --> 00:36:57.720
I love it.

00:36:58.120 --> 00:37:00.220
All right, let's round out the

00:37:00.220 --> 00:37:01.640
tie back to last week,

00:37:01.720 --> 00:37:04.100
which was we will test in production.

00:37:04.860 --> 00:37:05.400
Okay, yeah.

00:37:05.660 --> 00:37:07.240
So this is, what, number one?

00:37:07.860 --> 00:37:08.720
Number one, do it.

00:37:09.040 --> 00:37:12.600
Our users will know fear and cower before our software.

00:37:13.080 --> 00:37:16.060
Ship it, ship it, and let them flee like the dogs they are.

00:37:17.480 --> 00:37:17.880
Exactly.

00:37:18.260 --> 00:37:18.720
This is good.

00:37:19.540 --> 00:37:24.140
This is a reminder also to everybody that if you think we probably have already heard it,

00:37:24.400 --> 00:37:26.880
there's a decent chance we haven't, so send it to us anyway.

00:37:27.330 --> 00:37:28.140
We don't mind repeats.

00:37:28.560 --> 00:37:31.080
So if you find something funny or something.

00:37:31.080 --> 00:37:31.940
People give us a lot of credit,

00:37:32.100 --> 00:37:32.280
Brian.

00:37:32.440 --> 00:37:34.700
Maybe too much, more than we deserve sometimes.

00:37:35.300 --> 00:37:35.480
Yeah.

00:37:36.640 --> 00:37:36.900
Anyway.

00:37:37.280 --> 00:37:44.620
Well, thanks again for jumping on the call with us and enjoy doing another episode.

00:37:44.810 --> 00:37:48.980
And thank you, everybody that listens and everybody that shares this with other people.

00:37:49.150 --> 00:37:51.640
We like to grow our community.

00:37:52.000 --> 00:37:53.120
Yeah, very much appreciate it, everyone.

00:37:53.370 --> 00:37:53.720
See you all later.

00:37:53.990 --> 00:37:54.300
Bye, Brian.

00:37:54.560 --> 00:37:54.680
Bye.

