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

#459: Inverted dependency trees

Published Mon, Nov 24, 2025, recorded Mon, Nov 24, 2025

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 #0: Black Friday is on at Talk Python

Brian: This is peer pressure in action

Michael #1: PEP 814 – Add frozendict built-in type

  • by Victor Stinner & Donghee Na
  • A new public immutable type frozendict is added to the builtins module.
  • We expect frozendict to be safe by design, as it prevents any unintended modifications. This addition benefits not only CPython’s standard library, but also third-party maintainers who can take advantage of a reliable, immutable dictionary type.
  • To add to existing frozen types in Python.

Brian #2: From Material for MkDocs to Zensical

Michael #3: Tach

  • Keep the streak: pip deps with uv + tach
  • From Gerben Decker
  • We needed some more control over linting our dependency structure, both internal and external.
  • We use tach (which you covered before IIRC), but also some home built linting rules for our specific structure. These are extremely easy to build using an underused feature of ruff: "uv run ruff analyze graph --python python_exe_path .".
  • Example from an app I’m working on (shhhhh not yet announced!)

Brian #4: Some Python Speedups in 3.15 and 3.16

Extras

Brian:

Michael:

Joke: git pull inception

Episode Transcript

Collapse transcript

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

00:05 This is episode 459, recorded November 24th, 2025.

00:10 And I am Brian Okken.

00:11 And I am Michael Kennedy.

00:12 And we want to thank everybody that supports us through the stuff we sell to you guys

00:19 and provide services like the courses at Talk Python Training, the Complete pytest course,

00:24 our Patreon supporters, of course, we love you.

00:26 and also like everybody that buys books and stuff.

00:31 Connect with us if you'd like to, like to send us some topic ideas

00:35 or have a comment about what we said on the show.

00:37 Feel free to connect with us.

00:38 There's a contact us form on pythonbytes.fm, but you can also reach us on Bluesky or Mastodon

00:48 and those links are in the show notes.

00:50 If you are listening to us and occasionally would like to maybe see what we look like

00:54 or see the topics that we're putting on the screen, you can join us on YouTube at pythonbytes.fm/live.

01:03 And there you can also subscribe to the show and also get notified when the upcoming ones are going on.

01:12 Usually Monday at, we need to change this, usually Monday at 11,

01:16 but all the older versions are there too.

01:18 And if we ever change it for personal reasons, you can get notified there.

01:22 And of course, please sign up for the newsletter.

01:24 We love to send you all of the links of the things we talked about in the show are sent to you right to your inbox.

01:31 And we don't spam you.

01:33 It's just the show notes, really.

01:35 What do you got for us up first, Michael?

01:36 Actually, we have some pre-topics.

01:39 We have a topic zero topic.

01:42 How about that?

01:43 Yeah.

01:43 Topic zero.

01:44 So I don't know if people notice.

01:46 I mean, if you've read your email or listened to the radio or anything like that, you might know that it is the week of Black Friday.

01:53 And I think there's a lot of restraint on our end, Brian, by keeping it to the week.

01:57 Like I was getting Black Friday sales in October and this is wrong.

02:02 This is disrespecting Halloween amongst other things.

02:05 Yeah.

02:06 Anyway, Black Friday, I launched the Black Friday sale over at Talk Python.

02:10 And this year is different than the last year.

02:12 Traditionally, I just sort of done, hey, get the everything bundle, get all the courses

02:16 on in forever sort of thing.

02:17 But I wanted to do a couple of different deals.

02:19 So now there's three options you can pick from.

02:21 you can pick i have what's called the ai python bundle so two of our most popular courses agentic

02:27 ai programming with python the one that i wrote and that's if you want to use things like water

02:34 cursor or junior or whatever to build applications with alongside you and we have llm building blocks

02:41 in python by vincent mormonam which is uh basically if i'm going to build something that uses an llm

02:48 as an API kind of really cool stuff in both courses they're both really well reviewed and

02:53 received you can get that for like half off as a special mini bundle then the whole library thing

02:58 is still on you can get it at at super discounts and I'm also offering the talk python in production

03:03 book it's doing really well for a while it's been a good while at number one in software engineering

03:08 on Amazon which is amazing it's nice it's got pure five star reviews on gumroad at least as of

03:14 yesterday. I haven't looked today, but I think that's still true. So really well received.

03:19 That's also on sale at a discount. So that's Black Friday at Talk Python. talkpython.fm

03:24 slash Black-Friday. Check it out, please. It's, as you said, at the top brain, it's a really

03:31 great way to support a show. Make sure that we keep doing what we're doing here on the podcast.

03:34 And with that, how about you? Well, I was actually not planning on doing a Black Friday thing,

03:40 but I saw your topic in there. So I thought, yeah, why not? I'll do a Black Friday thing too.

03:46 So the complete pytest course bundle, I put that on sale. And if you go, so you have to use a coupon

03:51 code, the coupon code, if you go to the, if you just say, yeah, I want to get this. If you type

03:57 in Black Friday, hit apply, then it's a 20% discount. But yeah, I don't think that looks

04:04 big enough um i think i think we'll also do a save 50 so if you do save 50 um and apply that

04:11 that's better that's 29 bucks now um so you get half off um 20 off or half off your choice

04:18 um so uh doing that it'll be in the show notes uh but i kind of want okay so i was trying to match

04:25 michael because he was doing 20 on some of the stuff so i did i did the black friday for 20

04:28 But then I read my newsletter from Pragmatic, and Pragmatic is doing a 50% off for Black Friday.

04:39 So you can get all Pragmatic books.

04:43 If you save 50, you get 50% off.

04:45 And that includes Python testing with pytest.

04:48 So you can grab the video course or the book or both.

04:53 So those are my Black Friday deals.

04:55 Awesome.

04:56 And yeah, I don't, I mean, I know sometimes it feels overly salesy, but I did not do Black Friday one year and I got a ton of email like, Michael, where's your Black Friday sales? I've been hoping that you would do one. So I know at least a subset of people genuinely look forward to it.

05:09 And I personally, if there's something I really want for my learning path, I try to get it whenever I get it.

05:16 But there's some things that are like, it depends on your budget.

05:20 And there's some things that I don't need to have right away and I'd like to use.

05:24 And there's a lot of stuff that I've purchased on Black Friday sales.

05:28 And I appreciate that independent retailers and independent people like you and me do the Black Friday thing.

05:36 people that the full price is just a smidge out of their price range that's good yeah absolutely

05:41 all right let's talk about python stuff i mean that was python stuff but you know other stuff

05:45 yeah pure python and i'm talking a language level python okay there's a lot more to python than just

05:52 the language i think some people get confused i saw this comment on reddit of all places somebody

05:57 said hey what podcast should i listen to to learn python like why would you do that that's stupid

06:02 why would you listen to a podcast like just it's a simple language just go here and take the

06:06 I was like, a little bit broader.

06:07 But today, no, actually, we're talking built-ins.

06:10 We're talking runtime.

06:13 So PEP 814, this one is a really natural addition now that Python 3.14 came out.

06:19 This is add frozen dict as a built-in type.

06:22 Comes from Victor Stinner, who does a ton of performance stuff as a core developer.

06:27 Thank you for that, Victor.

06:28 And the idea is that when you have a frozen type, you get a lot of guarantees that you

06:34 can work against that make your life easier, your bugs, et cetera, right? With a regular dictionary,

06:40 you might say, oh, I need to return this dictionary to a thing. And you don't do a copy,

06:43 you just hand it over. And then somebody changes it. You're like, wait, you aren't supposed to

06:47 change it. I'm just trying to give you some data, right? So these frozen types are great for if you

06:51 don't want something to change, it's not going to change. Also, in the code that would try to change

06:55 it would get an error, right? So you're like, no, you're not supposed to do this. Figure something

06:58 else out, right? The intention is sort of conveyed through the exceptions, I guess, of a cause.

07:03 But also, it's really good for concurrency, which is the link back to 3.14.

07:08 Now that we have true parallelism, we, I don't know how many people are doing this,

07:13 but find yourself a re-entered lock and use it in your code if you're writing true parallel code, right?

07:18 Because race conditions, deadlocks, well, it starts with race conditions, ends with deadlocks, and hopefully fix.

07:23 Anyway, you want to do that, and you've got to lock mutable code.

07:26 But if you're reading, two things are reading from the same data structure, and it's not changing,

07:30 well, there ain't no problem with that.

07:32 You can read with a hundred threads in parallel and they're all going to get the same answers

07:36 deterministically, right?

07:37 So having frozen dict adds dictionaries in as a type that is basically purely thread safe

07:43 if you use a frozen dict instead of a regular one.

07:46 Cool, right?

07:46 That is cool.

07:47 I wonder if this will ripple up into other data types like classes and stuff.

07:51 That is a very good question.

07:53 So I have an answer for you as well.

07:54 So there's some interesting things.

07:56 I linked to the discussion, not the pep.

07:57 And there's like a really thoughtful conversation by lots of people that you know from the show.

08:01 It's like, well, okay, that's cool.

08:04 Can I equate a dictionary with a frozen dict?

08:08 Because what you'll see from the PEP is frozen dict actually derives from something that is not a dictionary.

08:13 So it's not, if you said, is instance a dictionary frozen dict, it would say no.

08:17 I'm not so sure how I feel about that, but that's how it is.

08:20 So the question is, well, can you say equal, equal?

08:23 And is it ordered and so on?

08:25 It is ordered, but is that order dependent and the equals and so on, right?

08:28 So there's a lot of stuff coming along.

08:30 And here you can go see all the conversation there.

08:32 So I also, just like you, Brian, like, well, what else is frozen in Python?

08:35 Like, what do we already have?

08:37 You know, if we didn't have a frozen dictionary.

08:39 So I put together a list of existing frozen types and structures in Python.

08:44 Tuple, frozen set.

08:45 Frozen set was the motivation for frozen dict.

08:47 Like, well, if we got a frozen set, why can't we have a frozen dictionary?

08:50 You know what I mean?

08:51 String, obviously, bytes, ranges, memory views.

08:54 Memory views are interesting to put over like a buffer, but you don't want it to be written to.

08:58 but you've also got mapping proxy types you've got a record class in the form of data classes

09:05 and then data classes you can say frozen is true so this is as close as you're going to get probably

09:09 to what you're asking for right frozen classes you technically could more or less do that if you had

09:17 private variables and only read-only properties but that's a lot of work you might as well just

09:22 create a frozen data class i don't know but yeah so there's a whole bunch of stuff that i put in

09:26 here that people can check out.

09:28 I put a little extra data sheet because I'm like, huh,

09:31 I also want to know this.

09:33 Yeah.

09:34 Yeah. All right.

09:35 I'm looking forward to Python 3.15 being more frozen.

09:38 How about that?

09:39 More frozen. Yeah.

09:40 More frozen.

09:41 Might be faster too.

09:42 Yeah. It definitely has a possibility for faster, safer code more easily.

09:46 Yeah.

09:47 Document it though.

09:48 Yeah, got to document it.

09:49 I'm bringing up an interesting topic that this was suggested by John Hagen.

09:55 Thanks, John.

09:56 Material for MakeDocs.

09:57 So I use MakeDocs and I use Material for MakeDocs.

10:01 Material for MakeDocs is a theme for MakeDocs, but it also adds some cool stuff to it.

10:07 So it's like a theme++ or something.

10:11 And I use it for both personal projects and for at work because it's just as easy to work with.

10:20 Anyway, there's some news about Material.

10:22 So the news that came out is that the team behind it is putting the Material for MakeDocs project in maintenance mode.

10:32 So for new updates, I don't know because I didn't really fully read this,

10:40 but I'm guessing that they're going to, let's see, changes the issue tracker.

10:46 Are they encouraged to open bug reports following?

10:49 okay, they'll fix critical bugs and security vulnerabilities.

10:53 That's right.

10:53 That's a good, that's fair.

10:56 Because a lot of people use it, including me.

10:58 So I care about that.

11:00 But why are they putting it in maintenance mode?

11:02 It's because the efforts that they're putting in this, they're switching over to a new project called Zensicle.

11:09 Zensicle?

11:10 Anyway, interesting name.

11:12 Modern static site generator built on material for MakeDocs team,

11:15 built by the material for MakeDocs team.

11:17 So it's a backwards compatibility, and we're going to link to a post that is actually all the, it's like a four post series talking about the transition because it affects a lot of people.

11:27 So they're transforming Material for MakeDocs, they're starting Zensicle, and they've got a Material for MakeDocs insiders program, and they're closing down GitHub discussions on Material for MakeDocs.

11:41 So it doesn't seem like it's profit-driven because they were actually making a decent amount

11:49 off of GitHub sponsorships for this, but maybe that's part of it.

11:55 But the gist of it is at the top, they said they want Zensicle

12:00 to overcome technical limitations of MakeDocs.

12:03 There's so many people that were using it, though, and not using any other form of MakeDocs,

12:07 but in part of this discussion they were talking about that a lot of the stuff in the forum and a lot of stuff in just GitHub issues were really not their problem.

12:20 There were like really issues with MakeDocs or issues with some other dependencies that they were using.

12:26 So Zensicle is going to just wrap up.

12:29 It's going to be a replacement for MakeDocs and MakeDocs, material for MakeDocs.

12:33 And I think a few of the other plugins that used to work with all of this, they're pulling those in to have a support model so that they can actually support everything that matters to people that use it.

12:48 The new website, Zensicle.org, is just fun to look at.

12:52 There's this cool animation thing.

12:56 Yeah, it's really cool.

12:58 So for people listening, you got to check it out.

13:00 Zensicle.org.

13:01 It's a black background with this kind of a yellow light laser thing going around in circles.

13:09 I don't know what that shape is.

13:12 Like a donut.

13:15 Thank you, Henry Schreiner.

13:17 It's also a...

13:20 Henry jumped in the show.

13:21 It's also a rust rewrite, and it's five times faster.

13:25 So a lot faster.

13:26 I'm pretty excited to try that out.

13:28 I haven't tried this yet, but since I'm a heavy material for MakeDocs user, I'll definitely be checking this out.

13:36 So one of the things I was curious about is the whole, like, how does this work for, like, is it going to go away or what's the open source model?

13:45 It's still going to be open source and MIT licensed.

13:50 And there's a compatibility back.

13:52 They're trying to make it backwards compatible.

13:54 So when you switch over, you can use your make ducks YAML file just as is.

13:59 And hopefully it works.

14:00 I haven't tried this yet.

14:01 And I, you know, I actually haven't like customized it too much.

14:04 So it's probably going to work fine for me.

14:06 But I do want to check out this, this compatible backwards compatibility thing to switch it over.

14:11 I like some of the cool features that they're, they're trying to build in and faster is great.

14:17 The other, the other thing I was, so how are they making money?

14:22 is the Zensicle Spark model.

14:24 So this is going to be, so what's Zensicle Spark?

14:29 It's for basically, actually, I think it's more than this,

14:33 but part of it is companies that use it or groups, teams that use it, even startups.

14:39 It's not just for enterprise people, but groups can go ahead and sign up for this

14:46 and have better support model.

14:47 So they can prioritize supporting people that are paying them, which makes sense.

14:52 But those fixes will help everybody.

14:55 So that's good.

14:57 One of the cool things that they're doing also during the transition is material for

15:02 MakeDocs, one of the ways they made money is they had both an open version that's just

15:08 free for everybody.

15:09 And then they would release new features to an insiders group.

15:13 So you could get new features right away.

15:15 And then they would sort of trickle into the general population features.

15:19 they're getting um i don't know if there's going to be something similar for the spark thing but

15:25 for material for make docs they've just opened up the floodgates anything that was in the insiders

15:29 is now part of uh the open source thing so if you want to stick to that you get all the features

15:35 so anyway just news for people that use make docs yeah nice i'm i'm optimistic here if their website's

15:43 anything to go by no it's i'm optimistic i think it will it's the kind of thing that'll make it

15:49 really polished and really nice if they get a decent number of customers.

15:52 So good.

15:53 And I do like that they're just actually putting the people on the people with their pictures.

15:59 She just, these are the people behind it.

16:01 It's not something just no faceless people making your money off you.

16:07 Exactly.

16:08 Cool.

16:09 That's right.

16:09 Keep Python independent.

16:11 Okay.

16:11 So I want to talk about something that was sent in to us by Gerber Decken.

16:18 And this is sort of the hat trick, if you will, Brian.

16:21 Two weeks ago, you talked about pip-dep-tree and UV-pip-tree, right?

16:26 And then the last week, you talked about dep-tree.

16:29 This time, I want to talk about a couple of things.

16:33 I want to talk about uv.

16:35 I mean, I got to look at this.

16:36 This is a bit of a statement here.

16:39 I know it's rough.

16:40 Rough, analyze, graph.

16:42 And you give it a virtual environment and some place to start or file

16:47 or something like that. And it will generate basically an architectural layer diagram.

16:53 This portion of your application depends on these other modules, which depend on those modules. And

16:59 is there any form of circular weirdness or whatever, right? So if you want to understand

17:03 how that works, this is like, it'll give you just a list. So this thing tech, which I'm covering,

17:09 he sent in is a Python tool to visualize and enforce dependencies using this architecture.

17:14 and it basically takes that output that I described and then turns it into a UI, okay?

17:20 Okay.

17:21 So there's a little graph that shows how it works, but basically you just create a TOML file

17:28 and then you run a command and it will scheme your code.

17:30 It will generate basically that, more or less, that output.

17:33 And then you can upload that, not your code, just this little TOML file that basically has module names

17:40 and nothing else in it, to this service that will turn that into a graph, okay?

17:43 So I did that by creating one for a project that I'm not talking about yet, but I'm working on here.

17:50 And you can see we've got this cool little thing and it shows like, how are you, how is it put together?

17:56 What pieces depend on what, right?

17:57 What depends on services?

17:59 And then as you interact with it, you can click on like, I want to see what views depend upon.

18:03 Oh, that's a lot.

18:04 But if I click on view models, you can see there's a nice layered architecture, right?

18:08 view models depend on services infrastructure modules and db models but it doesn't depend on

18:15 the stuff above it that depends on it so you don't get these weird cycles and other things and there's

18:20 like a little cms component it's used by the views it's used by the services and nothing else so you

18:24 can get this like cool little understanding of different parts of your app what do you think

18:30 this is cool so this is um maybe because we were talking about pipped up tree before this is not

18:36 the third-party stuff is just this is your yeah this is your own code so how does your own code

18:42 within itself like a set of sub modules depend upon each other because if you look at this um

18:48 you actually look at the code this view model section probably has 30 or 50 classes in it

18:53 this infrastructure bit has maybe 20 different things like utilities for web stuff urls and so

18:59 on and text parsing and um numeric converting libraries and you know stuff like that this dv

19:04 Everything has, I think, five database models and a helper class or something.

19:09 But they just show up as these blocks.

19:10 So you can kind of get a sense of like, how do these things interact?

19:14 The lines are drawn by analyzing all the individual files, I believe,

19:17 and seeing which ones point to things from other categories.

19:20 Oh, nice. This is cool.

19:22 Yeah. So I uploaded this picture.

19:25 I shared this. I create these shareable graphs.

19:27 So you can actually play with this graph yourself as well.

19:30 Yes. And then Christian asks, is this unmaintained?

19:33 Yes, I believe TAC has become unmaintained, but you can still run it.

19:37 It still looks like it's okay.

19:38 So that's a good point.

19:39 I did notice after I put this together that somewhere it's got like a, although the GitHub

19:46 repo, no, it's not TAC that is at least doesn't have an explicit statement that has gone into

19:51 maintenance mode or anything.

19:52 But if you look at TAC, it goes to gauge.sh.

19:56 And if you go to gauge.sh, this product is changed and it's becoming some AI thing that means nothing to me.

20:07 So I don't know.

20:08 But I imagine they'll probably keep it running.

20:11 And apparently it's also open source.

20:14 So you could go and fork it and just run it yourself or whatever.

20:16 I don't know.

20:17 So there is some component in this whole chain that is, it's the visualization of it, not the parsing.

20:22 I think TAC, which does the parsing, still works fine.

20:25 but then it uploads the gauge.

20:26 And the gauge thing is in question about whether that will still work.

20:30 But, you know, you could always go and make yourself, you know, fork it.

20:34 I mean, how hard would it be to make, given the file, which I don't have it easy,

20:38 I can pull it up, but given a file that lists these relationships,

20:41 how hard is it to graph it, right?

20:42 You could AI your way to something that draws your pictures out of tech

20:46 in like an afternoon if you really had to.

20:49 This visualization left is an exercise for the reader.

20:52 Exactly.

20:52 Like you could visualize it if you knew the right series of prompts, I don't know, or you wanted to write it or something.

20:57 No, anyway, that's a good point, Christian. Thank you. Over to you, Brian.

21:00 Well, I wanted to talk about upcoming speedups in Python. So there's a couple news articles that

21:08 came by that I noticed talking about some efforts to speed up Python in the future. So we're at

21:15 Python 3.14 right now. 3.15 is in the works and 3.16 later, right? So one of the things,

21:22 This is a post by Ken Jin, a plan for 5% to 10% faster free-threaded JIT by Python 3.16.

21:30 And the highlight is 5% faster for 3.15, 10% faster for 3.16.

21:37 And some of the names popped out as why I should pay attention to this.

21:42 This was brought up during the Python Core Dev Sprint in Cambridge hosted by ARM.

21:48 They planned this project.

21:50 The planners of the project that were present is Savannah Ostrowski, Mark Shannon, Ken Jen, this person, Diego Russo, and Brent Butcher, accompanied by other CPython core team members as well.

22:07 And also, I'm like, well, 5% to 10%, that's not that big of a deal.

22:12 It says, you might wonder, 5% seems awfully conservative.

22:15 However, note that this figure is a geometric mean.

22:18 the number can range from slower to significantly faster.

22:22 All numbers are high performance figures.

22:26 So I think that means they're optimistically thinking it's going to be a lot faster.

22:32 So it's interesting that the LLM involvement here is a little interesting.

22:37 Plan for 3.15 profiling support via LLVM21.

22:43 Oh, not LLVM.

22:44 That's probably performance-driven compiler optimization.

22:48 stuff. Yeah. Yeah.

22:50 Where you profile it and then the compiler says let me look at the profiler

22:54 output and then actually re-optimize based on how you actually ran. You know, like

22:58 that sort of fact. I bet it's something like that.

23:00 Yeah, but it's also looking forward to some support from

23:05 LLVM20 and then LLVM21.

23:07 So some of those lower level parsing improvements

23:12 are going to help with the JIT. So trace recording, better machine code,

23:16 Register allocation, top of stack caching, reference count elimination.

23:20 That's an interesting one.

23:22 More constant promotion and basic free threading support.

23:26 So I'm looking forward to seeing there's some graphs and some more information that's really above my pay grade.

23:35 That just-

23:36 Bars and stuff, they must be in things.

23:37 We don't know.

23:39 Yeah, it looks like, it's got like those bar graphs with the eyes,

23:44 like max admin and stuff.

23:45 Oh, wow.

23:47 Yeah, so the potential.

23:48 Yeah, anyway.

23:50 Interesting.

23:50 I'm glad that we're getting some JIT speed up.

23:54 So this is cool.

23:55 Another speed up is, this is from Emma's blog.

24:00 I forgot to grab what Emma's last name is, but Emma's blog.

24:05 Decompression is up to 30% faster in CPython 3.15.

24:11 This is cool.

24:12 So, you know, and this is based on the Z standard being added to the standard library.

24:22 So really, I didn't really get why we cared about the Z standard before.

24:27 But hey, if we can decompress that much faster, that's great.

24:31 There's compression and decompression happening all over the place that you don't even really know is going on.

24:37 So, you know, I actually ended up for the very first time, I think ever using compression in my Python app for a non, not because I somehow received a zip file or a tarball or something and wanted to process it, but like as a part of operation of the app.

24:52 So I'll run this by you, tell me what you think.

24:55 So this project that I'm working on that, that shall not be named has to store text and it has to store about 250 K of text per database record for like a certain thing.

25:07 But you never search it.

25:08 You never index it.

25:09 You mean you don't have a database index, like you find it through other

25:12 keys and you just want to process it.

25:13 And I'm like, well, how long does it take to compress and decompress that?

25:17 How much smaller does it get?

25:18 So I used XZ, which is also built in a Python and it goes down to about a

25:23 10th of the size.

25:24 So for caching and database records, it's instead of being 250 K it's like 25 K

25:30 and you want to process it as part of a web request.

25:32 You're like, yeah, let me just unzip it and send it back to you or whatever.

25:35 And yeah, I found it really useful.

25:36 So I'm all of a sudden super excited about fast decompression inside the, inside of CPython.

25:40 Yeah.

25:42 Little, little bits matter if you do the right ones.

25:45 So yeah.

25:47 And by the way, it's, it's like millisecond level type of time to do that.

25:51 So you might think, well, I mean, it's going to make your site slow, right?

25:54 You know, but if you can store 10 times as much data without running out of disk space

25:57 or cash or whatever, like that also helps a lot, you know?

26:00 Yeah.

26:00 It helps with your, your, how much you're paying for database services as well.

26:05 So yeah.

26:06 All right.

26:06 Oh, one more thing for Henry on the compression thing.

26:10 ZSTD is used by Python build standalone.

26:12 So having the ability to handle that without dependencies is great.

26:15 And faster next year too.

26:16 Yeah, thanks for the background info there.

26:17 And, you know, just shout out, like, I'm such a fan of Python build standalone as a way to,

26:22 like getting Python on your, a computer, your computer, server, whatever,

26:26 is just ridiculous with uv plus Python build standalone now, right?

26:30 Seconds, not trouble, right?

26:32 You know, uv, make a virtual environment, desperation, Python.

26:35 Yeah, it just changed.

26:37 It's one of those things that changed everybody's workflow.

26:40 And I don't even think about having to install a different version anymore.

26:45 It just happens.

26:46 And just does.

26:47 All right, you got any extras while you got your screen up?

26:49 Sure.

26:51 The one extra I've got is that the Lean TDD book, one of the things I'm putting it out while I'm writing it.

27:01 This week, I'm doing Thanksgiving prep, so I'm not going to release a chapter this week.

27:04 but there'll probably be one next week.

27:08 And that one's on building on lean.

27:10 Last one was building on TDD.

27:13 What I wanted to talk about though is I appreciate the issues.

27:17 So I decided to just use GitHub repo as an issue tracker for this.

27:23 And I've gotten a couple so far, not very many, but maybe that's a good thing.

27:29 A typo came in and actually it's one that like was, I was just missing.

27:33 I was reading all the time.

27:34 And so I appreciate that.

27:36 And then one of the ones was, was that I really appreciate is like discussion of extra topics

27:43 I should build in.

27:43 So I had, one of the things I've done is like release the headings and subheadings

27:49 for different chapters and, and, and different parts of the chapter.

27:53 And I'm hoping in the hopes of that people will go, oh, you gotta make sure you don't

27:58 forget to talk about this.

28:00 And that's what I got from looks like Jonah.

28:04 I'm not going to try to pronounce that, but I'll say Jonah.

28:08 In the chapter on considering considerations for applications for applying Lean TDD,

28:14 talked about not just technical considerations, but what we're really doing to social considerations.

28:23 And I've faced this too.

28:24 I'm like, oh, yeah, I didn't even think about this.

28:26 There's a lot of people just meant like just opposed to doing test-driven development or opposed to doing different kinds of tests for various reasons.

28:35 And I wasn't planning on talking about that, but I think it's very essential.

28:39 I'm glad that I'm getting people's feedback.

28:41 Could be the other way.

28:42 They only want to do TDD and they want to do integration tests because they're impure.

28:47 Yuck.

28:47 You know, I mean, there's a whole spectrum of things you probably got to speak to.

28:51 Yeah.

28:52 Go ahead.

28:52 And they even brought up some other things, like we don't have time to test. Testing makes it harder to refactor. Your tests are not compatible with our architecture. I did a release, even though the tests are failing because it's too important to get the code out there. Yeah, these are great things to talk about.

29:09 Yeah, for sure. I set up a issue tracker discussion board for the Talk Python in production book too. And it's been pretty active. I really appreciate it. There's a couple of things I could respond to. So if you're waiting on me, I'm forgotten, I'm forgotten.

29:21 And I told you that this was a follow-up to the dependency thing, but here's another.

29:28 This one's by Bob Belderbus.

29:29 I didn't think it was big enough to make its own thing, but check this out.

29:32 Bob says, I need to see which packages were pulling in a certain dependency instead of

29:38 what packages depend.

29:40 So you can actually go and do uv tree and give it a package and say --invert

29:45 to answer who depends upon this.

29:47 And look at this picture.

29:48 I see that's not really helpful.

29:50 But you look at it and it actually says six was pulled in by bleach, which was pulled in by Jenga bleach, which was pulled in PyBytes platform.

29:57 Also six pulled in Python.

29:59 DateUtil, why is that even there?

30:00 So it's like a reverse of your depth tree.

30:04 So you can focus it on a node and basically filter and restrict it just to the stuff that works with that leaf node, I guess.

30:10 So you'd look at it.

30:11 Yeah.

30:11 So if you're thinking about cleaning up your dependencies and say, well, I don't want to pull in six anymore.

30:16 it might not matter because a bunch of your dependencies are already pulling it in.

30:21 Right, exactly.

30:22 And so you could also ask the question like, well, do I really need that dependency?

30:26 Yeah.

30:26 Or could I find something else that would allow me to get rid of this thing,

30:29 this lower level dependency that's causing a problem?

30:32 You know, that's often a question to try and answer.

30:34 All right.

30:35 Well, that is it for...

30:37 Well, now I want an extra feature that says, hey, uv, can you tell me which packages

30:43 don't have any transitive, aren't transitive dependencies?

30:46 Hmm. Yeah. cool. So, okay. Let's talk a joke. So do you remember Brian last week,

30:54 it was like so many things went down. And one of the things that we had, we had AWS go down

30:59 two weeks ago and take out a huge chunk of the internet, I think for 14 hours because of DNS,

31:04 because of course it was, it was DNS to the database, which was the foundation of all the

31:08 other things. And then we had Azure go down in the beginning of the last week. And then was it Friday,

31:13 Thursday I don't know GitHub itself went down not the web page but all the git based operations

31:19 like git pull git push etc that talked to GitHub over the git CLI and other tools was failing for

31:25 hours and so my question or my question my joke is which is a question can GitHub even push fixes

31:32 to GitHub when GitHub is down like what do they do how do you fix GitHub if git is surely and I'm

31:38 oh my gosh surely there's a lot of ways that you deploy code within github by doing some kind of

31:43 git pull or get push with a web hook or something like that might have been a huge portion of the

31:48 problem yeah yeah the fix was probably instantaneously known but you can't roll back

31:56 or you know get rollbacks can't do that um exactly they're like how who is going to log in here and

32:01 fix this i cannot fix this oh no i'm curious how they did it then i mean this is this funny but

32:08 also it probably was an issue exactly so i thought we might have a um an educational joke this week

32:14 can github even push to github when github is down this looks like uh um who is the guy in the

32:21 matrix neo who's that actor keanu reeves yeah this looks like a young keanu reeves i'm not sure who

32:26 this actually is but from like bill and ted days yeah exactly whoa man how'd they even fix it

32:34 anyway i don't know how they fixed it but when it came back i was very excited that it was back

32:38 awesome all right well uh fun episode and i hope everybody everybody in the u.s or anybody that

32:45 celebrates turkey day outside of the u.s i hope you have a wonderful exgiving and um and everybody

32:50 else hope you have a great week also yeah thanks to you next week bye everyone bye


Want to go deeper? Check our projects