#407: Back to the future, destination 3.14
About the show
Sponsored by us! Support our work through:
Connect with the hosts
- Michael: @mkennedy@fosstodon.org
- Brian: @brianokken@fosstodon.org
- Show: @pythonbytes@fosstodon.org
Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too.
Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Michael #1: Python 3.14.0 alpha 1 is now available
- First of seven planned alpha releases.
- Many new features for Python 3.14 are still being planned and written. Among the new major new features and changes so far:
Brian #2: uv supports dependency groups
- we covered dependency groups in episode 406
- as of 0.4.27, uv supports dependency groups
- docs show how to add dependencies with uv add --group
- also “The --dev, --only-dev, and --no-dev flags are equivalent to --group dev, --only-group dev, and --no-group dev respectively.”
- To install a group, uv pip install --group doesn’t work yet.
- It’s waiting for PyPA to decide on an interface for pip, and uv pip will use that interface.
- But sync works.
$ uv init # create a pyproject.toml $ uv add --group foo pytest $ uv venv # create venv $ uv sync --group foo # will install all dependencies, including group "foo"
Michael #3: dive: A tool for exploring each layer in a docker image
- via Mike Fiedler
- Features:
- Show Docker image contents broken down by layer
- Indicate what's changed in each layer
- Estimate "image efficiency"
- Quick build/analysis cycles
- CI Integration
Brian #4: pytest-metadata
- An incredibly useful plugin for adding, you guessed it, metadata, to your pytest results.
- Required for pytest-html but also useful on it’s own
- Adds metadata to
- text output with --verbose
- xml output when using --junit-xml, handy for CI systems that support junit.xml
- Other plugins depend on this and report in other ways, such as pytest-html
- By default, already grabs
- Python version
- Platform info
- List of installed packages
- List of installed pytest plugins
- You can add your own metadata
- You can access all metadata (and add to it) from tests, fixtures, and hook functions via a metadata fixture.
- This is in the Top pytest Plugins list, currently #5.
Extras
Brian:
- I’ve started filtering deprecated plugins from the pytest plugin list.
- I’m also going to start reviewing the list and pulling out interesting plugins as the topic of the next season of Test & Code.
Michael:
- Pillow 11 is out
- pip install deutschland
- Talk Python has a dedicated blog, please subscribe!
Joke: Dog names
Episode Transcript
Collapse transcript
00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
00:04 your earbuds. This is episode 407, recorded October 28, 2024. And I am Brian Okken.
00:10 And I'm Michael Kennedy.
00:11 And this week we're sponsored by ourselves. So please check out our offerings. There's all of
00:18 the fabulous courses at Talk Python Training there. And then over at pythontest.com,
00:24 we've got the complete pytest course and also the short course, Hello pytest.
00:27 And also thank you to our Patreon supporters who we don't do a shout out enough to,
00:32 but thank you very much. We appreciate it. If you'd like to connect with the show,
00:36 we'd love to hear from you. You can connect with us on Fostadon. We're at mkedeny,
00:42 at Brian Okken, and at Python Bytes, all at Fostadon. And also those links are in the show notes,
00:47 as well as in at pythonbytes.fm. You can find out when the next upcoming episode is going to be.
00:55 And I was going to mention this later. I'll just go ahead and mention it right now.
00:59 Next week on November 4th, we are going to be recording early. So it'll be at 730 in the
01:04 morning instead of our normal time. And that's Pacific time instead of our normal 10 a.m. Pacific
01:09 because of work for me. Anyway, so that's what's going on next week. But at pythonbytes.fm,
01:16 you can sign up for our newsletter. You can get the show notes. You can sign up to and look to see
01:21 when the next live recording is. But right now, I'd like to hear from Michael to see what you had
01:26 to talk about.
01:27 Shall we teleport, transport to the future? Brian, I want you to imagine a time when it is not so gloomy
01:34 and rainy about 11 months from now, when we have a new version of python that comes onto the scene 314.
01:40 And that future can be for you now in a limited sense because 314 alpha one is now available.
01:48 The pi version of pi, thorn.
01:50 That's right. So that's the first alpha one release. And there will be seven in theory,
01:58 you know, by plan, at least unless something goes wrong. This is the first of seven alpha releases
02:03 before we go beta, before we go release candidate, and then we finally ship. Right. So it has some of
02:08 the new ideas, but not all of the new ideas. It comes with performance improvements and actually quite a bit
02:14 more, which is pretty interesting. So if you read the blog post announcement, well, it looks like,
02:19 okay, so we've got this new PEP called deferred evaluation of annotations. Now, I think this was
02:25 meant to land in 311 or 312, something like that. And all of the frameworks and libraries that thought
02:33 typing should matter. Like fast step behind.
02:35 Yes. And typer and pydantic and so on. And I count myself as a big fan of all of those libraries.
02:41 Those all those people are like, Hey, hold on, hold on. This is not just a thing for my pie.
02:46 These types are not just for my pie. And if you take away their evaluation, all of our awesome
02:51 frameworks go away. And I think that would be a massive step back for Python. A lot of people
02:56 agreed, made some changes. So that wasn't done as far, at least in a limited way. But you know,
03:01 having these type annotations does have a performance cost of say an import, potentially,
03:07 it does have weird issues where you've got indirect or sort of half defined types that you want to
03:14 talk about. I have a function or a method on a class, and I want to say it returns one of those
03:18 classes or, you know, it's like an equals. It takes another one of these classes and it tells you if
03:22 it's equal to it. So you had to do weird tricks like typing dot self, or you could have quotes,
03:28 the name of a type that's not defined yet, but eventually someday it will be defined if you
03:32 get around to looking for it. So this will allow you to not worry about those types of things.
03:37 And there's a new API if you consume them, if you were Pydantic or FastAPI or whatever,
03:42 there's a new way to say, let me read the annotation metadata about this. That's slightly different,
03:49 but it's still there. Okay. Improved error messages. We all love improving, further improved
03:54 error messages. So there's that. And then, so that sounds like when you read it like, okay,
03:58 that's the thing. But actually, if you go and look, where's the link? The release notes are
04:05 in here somewhere. So you click here and you, there's a release notes. Oh, really? Where did it go?
04:15 Maybe I haven't had notes. But anyway, Brian, there's a ton of changes, a ton of changes from there.
04:20 I think, oh, I know where it is. They don't call it release notes. Here's how you do it.
04:24 You click on the PEP and then you scroll down until you get past the PEP and it has other changes.
04:30 So yeah. So there's, if you go to either of those links, it'll tell you about their message,
04:35 tell you about the PEP. But then there's, if you look at the scroll bar, a bunch of stuff below that.
04:40 For example, incorrect use. Yeah. I think that's actually the news, not the stuff that was called out.
04:45 Incorrect usage of await and asynchronous comprehensions is now detected. I don't know exactly what you could have
04:52 done wrong before, but if you're doing it wrong, I guess. Anyway, if you're doing it wrong.
04:58 Well, apparently like assert await one. Yeah. So I think what the issue is, you could await a thing
05:02 that is not awaitable potentially in the list comprehension. So now you'll get a warning.
05:08 Okay. Is it warning or error?
05:09 Syntax error.
05:10 Syntax error.
05:10 Yeah. Syntax error. But you can disable the syntax error because apparently it used to work. If you want to
05:16 just keep doing that, that's fine. Let's see. Some stuff about dunder debug. The numerical things. Now,
05:22 have a float dot from number and complex dot from number, which converts to a float type or a complex
05:28 type, which is somewhat interesting. So the thing is, this is not a parsing operation. It takes one
05:33 number and converts it. And if you give it a string, it'll be an error. So this is like, I just want to
05:37 make sure I'm always working in numbers and convert them in probably a more efficient way.
05:40 Oh, better than like a cast thing. Yeah. Yeah. Yeah. Where the cast is just
05:45 with a type annotation type of deal. Whereas this is a true transformation, right?
05:50 Nice. So we get the new annotation lib, which talks about, which provides those features that I talked about for
05:56 PEP 749, the deferred type annotations. Arg pars, get some updates. AST, concurrent features,
06:03 C types, decimal, daytime, disk, fractions, functools, HTTP. It's funny. You know, HTTP, this was something
06:10 nice. You can say Python dash M HTTP, that server, I think is it, whatever. So if you have just
06:16 a directory and you're like, I need to have this as a web view. For example, if you have a, an HTML file
06:22 there and it says, I want to open up forward slash some CSS file or forward slash some JavaScript file
06:27 or something along those lines. If you just open it, it goes, I don't know what these files are. Right. But if this
06:32 web server were to serve it, it would easily work. So you could just type Python dash M space,
06:36 ACP dot server, enter, and it'll pull up a little web, like no, no op web server that you can then
06:42 actually interact with that stuff with. So it now has a dark mode. Okay.
06:45 Oh, you should have led with that, man. That's cool.
06:48 Yeah. This is contributed by Jorick Hanson. And I thought, okay, Jorick must be a huge fan of dark
06:55 mode to want.
06:56 As am I. Yes. Yeah.
06:57 Right. Okay. Jason, get some updates. Operator ops, Pathlib, Pathlib, actually the changes to Pathlib are interesting. I'm going through this list to
07:05 point out, like there's a lot of changes just in this alpha one release, but Pathlib now has,
07:11 add methods like new functionality to Pathlib to recursively copy and move files and directories.
07:17 Oh yes. I'm here for this. Yeah. Copy. Copy is a file or directory tree to a destination. Copy
07:22 into copies into a destination directory, move and then move into. That's awesome.
07:27 That's good. So Barney Gale did that. Thank you. PDB, pickle, PyDoc, sim table, sys, and unit tests. It ain't dead. No, it ain't.
07:36 Anyway.
07:36 In space.
07:37 So there's also optimizations. For example, asyncio is now implemented using doubly linked list
07:43 implementations. Hat tip for the, comp side data structures.
07:46 Level up there for native tasks, which speeds up execution by 10% on standards, standard high
07:53 performance benchmarks and reduces memory usage. So who wouldn't want that? That sounds great.
07:57 Exactly.
07:57 Exactly. All right. There's more you can read about it. And I just touched on it. Like each
08:01 thing I said had a paragraph or list of bullet points you could go into if you wanted. So that's it. Now
08:06 back to the future, back to the present, whatever, back to their current time.
08:10 Yeah. Or the fast time. So just last week on October 21st, episode 406, we talked about,
08:17 we talked about a lot of stuff, but one of the things was PEP 735 with dependency groups in
08:22 pyproject.toml and I didn't know when we could play with them. And the answer is now because,
08:28 because uv decided to do that right away. So, uv just had a, put a change in,
08:36 in, in, in, in version 0.4.27, in the change log, they say, they're the dependency groups are
08:45 supported, which is super cool. there's even a PEP support for PEP 735. I couldn't believe this
08:52 was so fast. It was like just a few days after we talked about it. so they must listen to the
08:56 podcast. That's pretty awesome. Yeah, probably. And this was like, oh yeah, three days ago, the,
09:01 it was merged in. so this is pretty cool. So there's a whole bunch of added stuff. And so I went
09:07 off and played with it. so there's, there's a --group is that added to uv add and uv remove.
09:14 So the, when you add dependencies or remove dependencies, you can say group and it puts
09:19 them in groups, the --dev and things like that. There's a couple of those, those,
09:24 so --dev used to be an extra dependency. Now it's a dependency group called dev. And,
09:31 and so --dev is the same as saying --group dev. it's more clear in the, in, in the list, in the documentation, if the documentation is updated. So there's a couple
09:43 of things where it, it isn't quite updated. So, there's a lot of, it was very clear on how to
09:49 add dependencies to dependency groups with uv. Now you can see, you say uv add or, uv remove,
09:56 that, that works great. but how do you install them then? So that's what I tried to play with.
10:03 So, also, the, the documentation for default groups is up so you can, click around in the uv talks about, default groups and dependency groups. and here we have
10:13 like the dev for pitests. Of course, you're going to have pitests in your dev dependencies. and
10:19 there's the, there's the little tip for the, the --dev flags. Okay. So I'm like, okay,
10:25 so how do I install stuff? So I expected what I expected to have work is to say uv pip install dash dash
10:32 --group dev and be able to just install those and not the project. Well, that doesn't
10:38 work yet. So, there is a issue, filed by Hinnick and the, of this, this should work and it
10:47 doesn't, pip install group, but the, the issue is that they want to, they want to be like the same
10:53 compatibility with the interface for pit. So they're just waiting for a pipe EA to define what that interface
10:59 uses. And that's fair. So, so we've got all these dependencies and you can't install stuff, right?
11:04 No, not quite. So I asked, I also asked on LinkedIn, if anybody knew and, Tushar,
11:12 responded saying, Hey, the docs, which they don't, but it says uv sync group will work. So I checked out
11:19 the docs and I can't find it. The sync doesn't talk about groups, but it does work. I tried it. You could,
11:25 so essentially this works. So, so what do you do? You create, you have a, you say you added a
11:31 dependency group, then you can say uv sync. And if you add the group like --group,
11:36 and then the group name, and you can add a bunch of those, then your virtual environment will sync
11:41 to match what your project says. So basically that's how you can install. You can use sync to install your
11:47 stuff, long winded, but that's a, that's how you can do it. So nice. Oh, that's awesome.
11:52 Anyway. Yeah. So this lets you say, unlike a requirements.dev, it lets you say,
11:57 here's a separate set of dependencies that I need for a certain action or set of tasks on my project.
12:03 It doesn't necessarily pull in the base dependencies, right? That's the big, the big difference.
12:07 Well, that's the, that's the idea, but with UV, it's different. So with uv currently with using
12:13 sync, it will pull in your base dependencies and the extras. you can't do just the group yet.
12:20 Got it. Cause it's not defined. It's not agreed upon yet. How to say it.
12:24 Right. So, the syntax is there though. So you can play with syntax and I'm, it's very
12:29 comfortable. I'm actually, I probably, there would be very seldom, like for me, I'm okay with this being,
12:35 having to install the project and then the dependencies, but there's just, there are times
12:40 where you just want to install a group, like to build the documentation or something like that.
12:45 Yeah. I'm, I'm fine with it as well. You know, one that might be, on most people wouldn't
12:50 guess for, but in the ML space, some of these dependencies are massive. For example, if you want
12:55 to use the large English model for spacey, you specify that as specified as a dependency, you don't
13:02 Python, maybe you run it as a Python call. Anyway, that, that thing is like 500 megs or something.
13:07 Right. So you might want to just not download it and install that as well.
13:10 Right. Especially if a, if you have like a modular CI system where one of the build stages is like,
13:15 built in documentation or linting, static linting or something like that, you might not
13:19 want to pull in the world just to do one of your stages. So yeah, that's a great, great case. Okay.
13:25 Let's dive into the next thing, huh? Okay. Dive comes to us unknowingly by Mike feeder.
13:33 let's see. Yeah. Mike Fiedler. So he mentioned this in a group discussion that I was also looking at.
13:39 I don't know that he sent it in specifically for us, but here it is. I'm taking it because
13:43 it's a cool idea. So here's the thing. If you have some sort of container system, like a Docker image,
13:50 you have a bunch of steps. And when you apply the way you make the containers, as you go to a Docker
13:55 file and you put in lines, like do this action, then this action, then this action. And they can be,
14:00 they're usually some kind of Linux command, or maybe you'll copy these files or run this Python command
14:06 once you've copied the right stuff over. And so they can be big, like apt install this one thing,
14:11 but this one thing has 20 dependencies, or you might be running, install the development requirements or a
14:18 compiler that you didn't need. So you might end up with slow builds and large images. What do you do
14:24 about that? You run this dive thing on it. So this thing's pretty cool. So what it does is there's a little,
14:29 a animated graphic you can have here if you go to the GitHub page and, you know, hat tip for anything
14:34 UI, please animated GIF would be awesome, wouldn't it? So anyway, you can have this here. And the idea is,
14:43 it basically allows you to see every layer. So each line of code that you've run, like make a directory,
14:49 copy these files, uv pip install -r requirements, or something along those lines. And each line you click on,
14:56 it gives you all the files, like a tree that you can explore with the file size of the, of the
15:03 image, the resulting image, and then also kind of a delta. So as you click around, it'll say these files
15:08 were added, these files were changed, these files were deleted on this step. So you can see this is the
15:13 reason this file is here because on line four, we ran this command, which added these files. Why is that?
15:18 Oh, that's cool.
15:19 Isn't it? Right?
15:20 Yeah.
15:20 So if you were shipping containers around, shipping images around, you know, like pushing it to Docker
15:26 Hub and then pulling it somewhere else, like you should definitely look at this. It's not something
15:29 I'll probably care about because I just build my containers on the server, then use them, which is
15:33 also a way to do it. But if you ship them around and you care about their size or they're building slow
15:38 or whatever, this is awesome. Check this out.
15:40 Also for security concerns to make sure things don't get added that you don't know about.
15:44 Right. Or even just, I want to make sure that there's no compilers on here because if somebody
15:49 were to break into the container and they could use the compiler, then they could say, upload some
15:53 C++ code, compile it and run it. Right. You know, the so-called living off the land sort of issues
15:58 after somebody breaks into a thing. So you just say dive space your image, or you can alias it to,
16:05 this is pretty nice actually. So there's something I've started doing with some of the tools if I'm
16:11 already on a system that has Docker. So you can do this with glances. You can do this with dive.
16:15 You can do this with other things as one way to do this is I could brew install dive onto my Mac,
16:21 but then who knows what that's doing to my computer. I'm running arbitrary code off the internet. I
16:25 probably trust it, but you know, right. So what you can do is you can alias. So you can run this from
16:32 Docker and then you can alias dive to just be the sequence of Docker commands that you want to run. So
16:38 even dive itself runs in Docker and then it talks to the other Docker container that you pointed at,
16:42 and that's it, which is a really nice pattern that's getting to be more popular.
16:45 It's Docker inception.
16:47 It's, it's Dockers all the way down, but yeah, you just create an alias and then it's just Docker run
16:51 dash it, remove the image, map the volume it needs over and then off it goes. Yeah, it's really cool.
16:57 All right. What else real quick? I'll wrap this up. so it'll show your image broken down by layer.
17:02 Like I said, what's changed. It has a metric like cyclomatic complexity equivalent, but for Docker,
17:09 they made this up, I believe an estimated image efficiency. The lower left pane of the base layer
17:15 shows an experimental metric that'll guess how much wasted space your image contains. That's kind of
17:19 interesting. you could do a quick build analytic, a bit, a quick build test. So instead of going and
17:24 building the thing and then running dive, you can say dive build and it'll actually build the thing
17:30 and then test it instantly. So it was like one line. And then there's CI integration, for, you know,
17:35 basically doing some of this stuff in CI and ways in which you can make it fail the CI if it fails
17:40 some metrics and so on. Oh, that's cool. Yeah. Pat Decker out there says, I've been using
17:44 dive for a while. Neat. Awesome. Glad to hear the testimony. Yeah. So yeah. And people can check
17:49 out obviously it's, it's open source written and go 46,000 get up stars. So it's, pretty well
17:55 known and used. That's pretty nice. Also, I like the, this CI integration because if I can't get it
18:00 from to a feature from the command line, it doesn't exist. I was concerned. So anyway, cool. Nice.
18:07 I've, I've got to just, I guess a little like blast. We talked about the future. Let's talk about the past
18:13 a little bit. I had a question. I haven't talked about pytest metadata for a while,
18:18 but I had a question just this last week. Somebody, got ahold of me and said, Hey,
18:22 I'm, I've got these, these, pytest CI system, the pytest CI system put together. I'd like to,
18:28 I'd like to send some extra data from the test environment to, to the, to the report server.
18:35 Is there a way to get metadata, like extra metadata and pytest to like add it to the, to the results and
18:42 then put it somewhere else in the, in the result system. And I said, well, have you checked out the
18:46 plugin called pytest metadata? It does exactly that. so I guess I'm just reminding everybody
18:53 that pytest metadata is a really cool plugin. It does exactly what you would think it would do.
18:58 It bundles metadata with your results, or at least that's exactly what I think it would do.
19:03 it isn't testing your metadata. It's adding metadata to the, to the results.
19:07 So some of the things that does right off the bat, which is kind of fun, is it automatically stuffs in,
19:12 for the account, right? Yep. Four different keys. It's key value pairs for the metadata. It does
19:19 the Python version, the platform. So Python version is like, you know, whatever Python version,
19:25 the platform is a string that, that we get out from Python to say what kind of like, you know,
19:30 for macOS it's Darwin or something else. and then, the packages, it lists all the pytest,
19:37 all the pytest packages that are there. and then actually it says the description pytest packages.
19:43 I think it's, I'm gonna have to check this out. I'm not sure if it's all packages that are available
19:47 or just the ones associated with it. Yeah. The name says pytest, but the example
19:51 lists more than pytest, right? Yeah. Yeah. So I'm not sure. but then there's plugins,
19:56 and it lists all the, the pytest plugins that are there, that you have, bundled,
20:01 but I don't really use it for that. I mean, that's interesting, but really I add stuff. So we've got
20:07 like my, I I'm often the, the target environment that I'm testing. What version is that? What, what,
20:13 what extra packages are on that? So if I'm, I'm testing, you know, embedded systems, so I'm,
20:19 I'm checking information about the system. I'm testing and adding that to the metadata frequently,
20:23 but you can do whatever you want, but this adding is cool and it's really easy to do.
20:27 You can add it during, you can even add it at the beginning, like on command line,
20:32 if you know it at command line, but within the test, you can do it within, within a fixture,
20:36 within a test as well. You're going to add metadata and it's reported. It's reported in the command
20:41 line. If you do dash, the, the --verbose that gets, or dash B, will it, it adds like
20:47 reports all the metadata, but it also comes out in the J unit XML. and, and a lot of,
20:54 JSON results and other plugins, will pull this metadata out also because it's a very widely used
21:00 plugin. so, very useful if you want to pass that along. it's, it was, I believe it was
21:06 generated specifically for the, by test HTML, plugin because it's a same contributor,
21:13 Dave Hunt and others, but, but it's, the metadata is used even without the HTML,
21:19 in the, in our top pie test plugins list. the metadata is number five and HTML is number six.
21:27 So they're both very popular, but, metadata is popular by itself. So yeah,
21:31 very cool. I love it. That's a great idea. Anyway. So that's, those are our items.
21:38 I have a couple extras or one extra. Do you have any extras?
21:40 Hit them. Okay. Yeah. I got a few, but they're quick as well. I'll, it makes sense to start
21:45 right here because I did make some changes to the plugin list. So just the other day, I was looking
21:52 through, the top pie test plugins list on over on python test.com and notice that there was stuff
21:59 in there that I don't like talking about because they're deprecated and even the developers don't
22:03 want you to use them. So I've started to start filtering those. So I'm sorry, I'm going to go
22:08 through the list and check out to see if they're deprecated ones, because, you can already find
22:14 this information out if you want to find out with the, with the list of, what, which ones I'm
22:19 pulling out, but why would you want to do that? You want, we want to know, the top
22:23 pie test plugins that I should look at. And if there's ones you shouldn't don't. So yeah,
22:28 those are coming out. And then I thought, you know, I've, I've been wondering to do,
22:34 a new series. I'm on, the testing code podcast. And I thought, why not look at these plugins? So
22:41 I'm, I'm not going to go through the entire list. Plus it changes like every month, a little bit,
22:46 but I'm going to go through some of these and pull out some that I think people should know
22:50 about. So I'm going to do like a series of plugin episodes. So that'll be coming up. How about you?
22:57 Any extras? A couple. Let's see what we got. So let's start here. So Hugo van Camande said,
23:05 guess what? Pillow, you know, the Python image library, 11.0.0 is out with not just support for
23:12 Python 3.13, but free threaded Python wheels. So you're doing a bunch of image processing.
23:18 You want to speed that up, the free threaded Python T or whatever it is you run is good.
23:23 Drop support for three, eight, cause that's so old school or moved a bunch of stuff and then added,
23:27 many things. So if you go look here, I believe you look at the, look at all the changes in this.
23:34 So pretty, pretty awesome. How much has changed here? So if you do stuff with images and Python,
23:40 use pillow, there's a new one. That's a big release. But if you're like, what could I do with images in
23:45 Python? Well, check out pillow. It does a lot. So that's cool. We have, you know, you've heard
23:50 of pip install anti-gravity. You've heard pip install this or sorry, import this and import anti-gravity.
23:56 But what about pip install Deutschland? And what does that do? So this comes from Grandknapp says,
24:04 "Hello, Michael and Brian, here's a recommendation for the 14% of your listeners who are in Germany."
24:10 I remember I talked about that as analytics from Imam a while ago. And it says, "Just pip install Deutschland
24:15 for lots of useful German datasets regularly updated." And so you go over here and it's got things like,
24:21 "Do you want to go and find addresses, barrier lines, building areas, building borders, I suppose,
24:32 and so on." My, German construction terms are not that good, but anyway, something along these lines,
24:38 right? and you basically, it just has data for all these different components or things you might
24:44 want to know about in Germany, which is pretty cool. Yeah, that's pretty cool. That's a lot more than just
24:49 buildings. There's, there's a, there's quite a bit there, isn't there? Yeah. Yeah. Addresses,
24:53 history points, underground stuff. It's got Autobahn information. Yeah. Yeah. We need a pip install for
25:01 a lot of countries like pip install USA. It chants a little USA, USA, USA, then it installs it.
25:07 All right. America, America, America's got borders. Okay. So, and another big thing that's fun is I just
25:17 released a talk Python blog. So I've got my personal blog and there's tons of RSS at talk Python, like for
25:22 the podcast and stuff, as you would guess, but a dedicated blog so I can post interesting things
25:27 and series that I plan on working on that are more talk Python related, not just for my personal blog.
25:33 So anyway, it's got a couple of posts already and yeah, I tried to go for the super clean, super
25:39 readable version here, Brian. So trying to make it just, yeah, thanks. So this is built. Yeah, go ahead.
25:47 I was going to ask you what it's built with. Well, it's built with Hugo, which is a glorious
25:51 static site builder. But what's interesting is it's hosted under talk Python.fm/blog, not like blog.talkpython.fm.
25:58 And I'm using engine X to point different sub URLs to different sections. So like most of talk Python
26:05 is a Python app, obviously, but then this part is Hugo and they just kind of coexist under the same
26:10 URL structure, which is fun. Okay, nice. Yeah, I might write about that actually at some point. But
26:15 yeah, it's built with Hugo, kind of like our own stuff, right? Our own personal things.
26:18 Yeah, I'm just having some Hugo. I'm having Hugo issues, but...
26:22 Are you? Well, I'm still having Hugo love, so it's okay. We'll even it out there. All right. I got a
26:28 joke for you, but I can't find... This is a cartoon I saw, but I can't find it again. I thought I bookmarked
26:34 it in our thing that bookmarks it and the title of it is there, but the URL to it is not. It just says dog
26:39 joke. I'm like, huh, I wonder where that is. And I've tried to search for it. I can't find it,
26:43 but I can tell you the joke, okay? Okay. Are you ready? Yes. Imagine, imagine if you will,
26:49 a little girl just getting her first puppy. The dad is brought it home and they're out in the backyard
26:56 and he's about to share some wise advice with his daughter to help her become accustomed to having a
27:02 puppy and all the new responsibilities and so on, right? Yeah. So he, he, she's just sitting there like
27:08 gleefully petting the new puppy and says, now they're thinking of a name for it, right? He says,
27:12 now, sweetie, you need to think very carefully about the name for this puppy because you're
27:17 going to have to remember it for the rest of your life and enter it on every webpage that has a stupid
27:22 security question. Yeah. So that's the advice of the dad. Remember this name of your first pet
27:27 because you're going to have to remember that for the rest of your life. Yeah. That was the joke.
27:32 That's good. No picture because I can't find it. I've got a dog joke. So we, let's, let's add another
27:37 joke. So let's do it. Okay. So kind of a dog joke. So a guy walks into a library and he's,
27:43 looking for a book and he's, and he walks up to the, the librarian says, says, there's a
27:48 particular book I'm looking for, but I can't remember the name of it. it's a, it's, it's a,
27:53 it's a book about Pavlov's dog and Schrodinger's cat. And the librarian says that rings a bell,
27:59 but I'm not sure whether we have it here or not. Perfect. Pretty good. A lot of science in there.
28:05 A lot of some social science, some hard science. I love it. Yeah. Yeah. All right. Some uncertainty.
28:11 Yeah. Yeah. Might be there. Might be there. And it rings a bell. cool. Well, awesome episode
28:17 again. I think so. Thank you, Michael. And thank you everybody for listening. So I guess we'll,
28:23 talk next week. Bye. Yep. Bye.