Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#407: Back to the future, destination 3.14

Published Mon, Oct 28, 2024, recorded Mon, Oct 28, 2024
0:00
00:28:26
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Connect with the hosts

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

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:

Michael:

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 Fosstodon. We're at mkedeny,

00:42 @brianokken, and at Python Bytes, all at Fosstodon. 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 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 --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 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 spaCy, 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 git 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 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 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 --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 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.


Want to go deeper? Check our projects




Subscribe to Python Bytes