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

#461: This episdoe has a typo

Published Tue, Dec 9, 2025, recorded Tue, Dec 9, 2025
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: PEP 798: Unpacking in Comprehensions

  • After careful deliberation, the Python Steering Council is pleased to accept PEP 798 – Unpacking in Comprehensions.
  • Examples

    [*it for it in its]  # list with the concatenation of iterables in 'its'
    {*it for it in its}  # set with the union of iterables in 'its'
    {**d for d in dicts} # dict with the combination of dicts in 'dicts'
    (*it for it in its)  # generator of the concatenation of iterables in 'its'
    
  • Also: The Steering Council is happy to unanimously accept “PEP 810, Explicit lazy imports”

Brian #2: Pandas 3.0.0rc0

  • Pandas 3.0.0 will be released soon, and we’re on Release candidate 0
  • Here’s What’s new in Pands 3.0.0
    • Dedicated string data type by default
      • Inferred by default for string data (instead of object dtype)
      • The str dtype can only hold strings (or missing values), in contrast to object dtype. (setitem with non string fails)
      • The missing value sentinel is always NaN (np.nan) and follows the same missing value semantics as the other default dtypes.
    • Copy-on-Write
      • The result of any indexing operation (subsetting a DataFrame or Series in any way, i.e. including accessing a DataFrame column as a Series) or any method returning a new DataFrame or Series, always behaves as if it were a copy in terms of user API.
      • As a consequence, if you want to modify an object (DataFrame or Series), the only way to do this is to directly modify that object itself.
    • pd.col syntax can now be used in DataFrame.assign() and DataFrame.loc()
      • You can now do this: df.assign(c = pd.col('a') + pd.col('b'))
    • New Deprecation Policy
    • Plus more
  • -

Michael #3: typos

Like codespell, typos checks for known misspellings instead of only allowing words from a dictionary. But typos has some extra features I really appreciate, like finding spelling mistakes inside snake_case or camelCase words. For example, if you have the line:

*connecton_string = "sqlite:///my.db"*

codespell won't find the misspelling, but typos will. It gave me the output:

*error: `connecton` should be `connection`, `connector`  
╭▸ ./main.py:1:1  │1  connecton_string = "sqlite:///my.db"  
╰╴━━━━━━━━━*

But the main advantage for me is that typos has an LSP that supports editor integrations like a VS Code extension. As far as I can tell, codespell doesn't support editor integration. (Note that the popular Code Spell Checker VS Code extension is an unrelated project that uses a traditional dictionary approach.)

For more on the differences between codespell and typos, here's a comparison table I found in the typos repo: https://github.com/crate-ci/typos/blob/master/docs/comparison.md

By the way, though it's not mentioned in the installation instructions, typos is published on PyPI and can be installed with uv tool install typos, for example. That said, I don't bother installing it, I just use the VS Code extension and run it as a pre-commit hook. (By the way, I'm using prek instead of pre-commit now; thanks for the tip on episode #448!) It looks like typos also publishes a GitHub action, though I haven't used it.

Brian #4: A couple testing topics

  • slowlify
    • suggested by Brian Skinn
    • Simulate slow, overloaded, or resource-constrained machines to reproduce CI failures and hunt flaky tests.
    • Requires Linux with cgroups v2
  • Why your mock breaks later
    • Ned Badthelder
    • Ned’s taught us before to “Mock where the object is used, not where it’s defined.”
    • To be more explicit, but probably more confusing to mock-newbies, “don’t mock things that get imported, mock the object in the file it got imported to.”
      • See? That’s probably worse. Anyway, read Ned’s post.
    • If my project myproduct has user.py that uses the system builtin open() and we want to patch it:
      • DONT DO THIS: @patch("builtins.open")
        • This patches open() for the whole system
      • DO THIS: @patch("myproduct.user.open")
        • This patches open() for just the user.py file, which is what we want
    • Apparently this issue is common and is mucking up using coverage.py

Extras

Brian:

Michael:

Joke: tabloid - A minimal programming language inspired by clickbait headlines

Episode Transcript

Collapse transcript

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

00:05 This is episode 461, recorded December 9th, 2025.

00:10 And I am Brian Okken.

00:11 And I am Michael Kennedy.

00:12 And this episode is sponsored by yours truly and Michael.

00:17 So both of us Talk Python Training.

00:20 Always some great stuff.

00:22 I just finished the AI, the recent AI agent course.

00:29 Oh, you did?

00:29 great yeah thank you yeah awesome really enjoyed it uh some great content there and um so but

00:36 there's plenty of other stuff to do there's even a py test course there but if you'd like a really

00:40 complete py test course head on over to python test.com we have uh there's the complete course

00:46 there uh thanks to patreon supporters also there's um a new book out from michael and uh and a book

00:52 that i'm working on so lots of ways you can support us and if you don't if you just want to support us

00:58 by sending us topics.

00:59 We'd like that too.

01:00 You can connect with us.

01:02 There's a contact form on the website on pythonbytes.fm

01:05 or you can reach us on Bluesky or Mastodon.

01:08 And if you'd like to, if you're listening, we love you.

01:11 But we also would like you to check out our video stuff every once in a while.

01:16 Head on over to pythonbytes.fm/live and you can be part of the audience

01:20 or just watch it afterwards.

01:22 And finally, please subscribe to our newsletter or essentially it's occasionally we send out little news bits,

01:29 but mostly it's the show notes from the show.

01:32 So we send out, after we get it all done, we send out a newsletter that has all the links

01:38 so you don't have to take notes while you're listening.

01:40 Now for our first topic, Michael.

01:42 Our first topic is going to be a tour of peps, a brand new PEP in a PEP that we spent a fair amount of time talking about.

01:49 The first one is PEP 798, Unpacking in Comprehensions.

01:55 So this one is a little bit funky.

01:58 It's currently in draft stage targeting Python 3.15.

02:02 It's pretty minor, but I think it brings some consistency to it.

02:07 So I linked to the conversation here.

02:09 And the idea is right now, if I have a function that takes an arbitrary number of positional keywords,

02:17 you would say star args, right?

02:20 Star args, star kwa args is like a pretty common theme

02:25 So if I had something that said star args, and I wanted to push a tuple of values as those positional parameters, I would say star tuple in the function call.

02:37 Kind of like you say star star for a dictionary to say keyword arguments, right?

02:41 So the idea here is that that works for function calls, but it doesn't work for comprehensions, list comprehensions, set comprehensions, and so on, if you have an iterable.

02:52 Right now what we have, and this is super confusing to me, I always get the order wrong,

02:56 or at least I'm always uncertain of the order, is I can say, you know, basically X for X in Y,

03:04 Y for Y in thing, if I've got a set of lists or intervals and I want to turn them into

03:11 like one big list as a comprehension, you can basically do like a double comprehension

03:15 in one thing. And I'm always like, which one is the collection and which one is the item,

03:21 you know, so this kind of solves that.

03:24 It says you can just say in the comprehension, you say star iterable for iterable in some list of iterables.

03:32 And it makes it real simple, right?

03:34 So you can do that for, pulled up official pep.

03:37 You can do it for list comprehensions, set comprehensions,

03:42 dictionary comprehensions.

03:43 If you have a list, if you have an iterable of dictionaries,

03:47 you can create a dictionary comprehension.

03:49 And you can do it for generators.

03:50 if your generator generates iterables.

03:54 Does that make sense?

03:55 Yeah.

03:55 So that's pretty much it.

03:58 What do you think?

03:59 That's cool.

03:59 So that's not something you do now?

04:01 This is a proposal?

04:02 Is that right?

04:03 Yes, this is a draft for 3.15.

04:06 Okay.

04:06 And just shout out for a little bit of credit.

04:08 This is Adam Hartz and Eric Demain for the people proposing it.

04:13 And the sponsor is Yelda Zilastra.

04:17 Sorry, if I messed that up, I gave it my best shot, folks.

04:20 So anyway, that's my main topic here for this first one

04:23 is this unpacking in comprehensions.

04:26 We've had unpacking in other places, into variables.

04:29 We've had unpacking into function calls.

04:30 We have not had them in comprehensions.

04:32 And they've honestly, this double comprehension, like double layered comprehension thing

04:36 has always been complicated.

04:38 And so I'm here for it.

04:39 I mean, it does add another thing to language and everything you add to a language

04:43 just makes it more complicated.

04:45 But in this case, I think it's well worth it.

04:49 Now, go ahead.

04:50 Oh, I just wanted to say, speaking of the unpacking, use the star or asterisk, but one of my favorite names for that character is splat.

05:00 Splat.

05:01 Splat.

05:01 Let's call them splatted comprehensions.

05:04 Here, hold on.

05:04 I'll just edit this and we'll fix this real quick.

05:07 I'm going to change the, you know what, my screen is too small.

05:12 I was going to edit the text, right?

05:13 Okay, so that's all good.

05:15 Now the next one is just a really quick follow-up on a PEP as well.

05:19 Before we move off of Focus on Me.

05:22 Remember how excited you were and I was about explicit lazy imports?

05:26 As in lazy...

05:29 Are they going to take it out?

05:30 No.

05:31 Dear Pep 810 authors, Barry Warsaw writes, this steering council is happy, happy to unanimously accept Pep 810 explicit lazy imports.

05:42 Congratulations.

05:43 You now have a job to implement.

05:44 And it's, yeah.

05:46 The same is true for all the other alternative keywords

05:48 we come up with.

05:49 So lazy it is.

05:51 I know.

05:52 That's anyway, a little bit of background on some of the thinking the steering council put out there.

05:55 But yeah, unanimously and happy.

05:58 Yay.

05:59 Good.

05:59 Yeah, that's pretty good.

06:00 So happy to see that.

06:02 And by the way, just a little shout out for the live stream folks.

06:05 I'm going to have Barry Warsaw and a bunch of other folks

06:08 on to do a year in review three hours, two hours and 40 minutes from now on Talk Python.

06:14 So that's going to be fun.

06:16 We'll hear from Barry over there, but probably not about the path.

06:19 All right, over to you, Brian.

06:21 What am I talking about?

06:22 I'm going to talk about another new release or an upcoming release, Pandas 3.0.

06:29 So the Pandas 3.0.0, so 3.0.0.

06:33 There's a release candidate zero that's been out since sometime last week.

06:40 And then apparently there's going to be an official 3.0 released in a few weeks.

06:44 but that was a week ago so maybe a couple weeks from now not sure um so what do we got in here

06:48 i'm pretty excited about this actually uh we've got um what's new there's a there's a dedicated

06:54 string data type by default and this is just kind of great so if uh normally in things that with

07:01 strings in them they would show up as objects but clearly they're strings so there's a new string

07:06 type um and it does change things a bit um if you have any the any missing things it'll be an uh

07:13 N-A-N, sentinel, to say that there's nothing there.

07:17 What's great about this is once you have this str type, D type,

07:22 or str D type, you can only put strings or nans in it.

07:26 There's nothing else allowed.

07:29 So nothing weird shows up.

07:31 It's not just a generic object.

07:33 There's a lot of other implications around this.

07:36 The str can only hold strings in the sentinel, of course.

07:40 The missing values are sentinel inferred by default for string data.

07:45 Anyway, check out the PEP 14 to get a little more information.

07:51 There will, there's other implications around this, but I think it's a really good thing.

07:54 Copy on write also is kind of a really exciting thing that hopefully nobody will really notice.

07:59 But the idea is really anything that results in an indexing operation will return essentially a copy of things.

08:08 So you don't, there's not, or not, not a copy.

08:10 It'll be a reference.

08:12 It's, and it only, only makes a copy of actually modify something.

08:16 So, so pandas will keep track of whether or not you've changed it.

08:20 And if you haven't changed it, it's just a copy of the data there.

08:23 This will say, this should save a lot of time and space.

08:26 So I think that's going to save a ton of, especially memory.

08:30 Because if I remember correctly, I'm not a pandas expert by any stretch of the imagination.

08:35 But when you call operations like filter operations or other transform operations, it doesn't in place modify it.

08:42 It returns a new data frame.

08:43 Like if I add a column to a data frame with the operation, I get an entire copy of that data frame plus the column.

08:50 You know, one of the new column.

08:52 If you've got five million rows loaded and you call those five or ten times, like you're all of a sudden, it's piling up fast.

08:57 Yeah.

08:58 And it says the main goal is to change the user API to be more consistent and predictable.

09:02 And I think this is right because, I mean, we're doing like matrix operations and stuff,

09:06 and we'd really like it to be kind of like math where you don't really care about the

09:12 size or timing implications.

09:14 You're just, this is what I want to do.

09:16 And having that be more consistent and hidden behind the scenes, I think it's going to be

09:20 great.

09:20 It's going to make this a lot easier to learn.

09:23 They're cleaning up a lot of the API and stuff.

09:25 It's really cool.

09:27 We had covered this in one of the other episodes that was coming.

09:30 PD call syntax can now be used in data frame assign and location.

09:37 And this idea is that basically you could just say, I want to assign a new column with the addition of like two other columns or something,

09:44 or some operation.

09:45 And it just does it right there.

09:48 Like instead of having to do a lambda expression inside, you can just do the expression.

09:52 It's really kind of a great syntax.

09:55 We've got a copy of the syntax in the show notes, but that's pretty great.

09:58 Some changes to deprecation policy, probably because of some of these changes that they're doing a three-stage deprecation thing.

10:07 But I think this is good.

10:08 I think that basically open source projects are being used more.

10:12 The ones that they have to think about this, how to keep track, keep it fun to maintain, but also moving with the times.

10:20 And I think these are good calls.

10:22 A bunch of other enhancements as well, so check those out.

10:24 But I think this is a really good direction.

10:26 and I can't wait to see 3.0 pandas come out.

10:29 This will be great.

10:30 Yeah, that's pretty exciting.

10:31 That's a pretty major change.

10:33 All right.

10:34 What's up next?

10:35 This episode has typos in it, Brian.

10:37 Oh, no.

10:38 I'll try to fix it.

10:39 I know.

10:41 Well, remember I spoke about code spell, all one word, code spell,

10:45 and it was a misspelling finder, not a spell checker, right?

10:50 The spell checker looks for words that it knows are good and says,

10:53 I don't know that word.

10:54 That must be misspelled.

10:55 In programming, obviously, there's all these symbols and all sorts of stuff.

10:59 One of the things that drives me crazy is when my editor suggests that a library that I'm importing is misspelled,

11:05 but it's the library's name correctly.

11:08 I'm like, hmm, well, I can't write it any other way.

11:10 This is the only way it works.

11:11 I'm sorry, spellchecker, but do I really got to go through and tell you that this is the name of the library I'm using?

11:16 Yes, apparently I do.

11:18 So this like code spell, this thing called typos, also looks for known misspellings like ADN for a common misspelling of and and so on.

11:28 Super good.

11:28 Why are we back?

11:30 Well, Sky Cosco wrote and said, code spell is cool, but you should check out typos.

11:36 So typos, I believe it is written in Rust.

11:39 Yes, 99.9%.

11:41 That's three nines Rust.

11:43 Pretty good.

11:43 And 0.0% Python, but it's still mentioned.

11:45 So it must be less than one-tenth of 1%.

11:50 But it's a little more full-featured for people that like this.

11:52 So, for example, it has a GitHub action that you could just put into all of your PRs.

11:57 That's kind of cool, if you want.

11:58 It's like a gated thing for PRs and commits and so on.

12:02 But the best thing about it, I guess two things.

12:05 One is it uses the concrete syntax tree rather than actually just searching text.

12:12 So what it can do is it can find partial bits of words that are misspelled.

12:17 Maybe this is actually not related to that, but it does find partial misspellings.

12:21 So for example, if you write connecton string instead of connection string with snake casing,

12:27 whatever, it says, hey, guess what?

12:28 The word connection and connection underscore string without the I is a misspell.

12:33 Maybe you should change, you know, connecton to connection or connector or whatever.

12:38 And it gives you a nice little UI for that.

12:40 So that's one.

12:41 I really like that.

12:41 But like that's super cool that it can detect misspellings within, you know, snake case words.

12:48 So, yeah, yeah, this is a it's a big improvement.

12:51 And PyCharm does this as well, by the way, which is really nice.

12:53 But I believe PyCharm is a built checker, not a misspelling finder or whatever.

12:58 Pretty sure.

12:59 Anyway, this is really nice that it does this.

13:01 The other thing that's super cool, and this is why Sky wrote to us,

13:06 is it actually has a VS Code in Friends extension in language server.

13:12 So what you can do is basically install this as an extension in VS Code

13:16 or Cursor or Google Antigravity or, you know, you name all the others, right?

13:22 Because it's also in the OpenVSX registry.

13:25 So you can install that there.

13:26 And then just as you're writing code, you get little squigglies

13:29 and you hit get alt enter actions to fix it.

13:32 So you don't even have to run the client or the GitHub thing and so on,

13:35 which the code spell has no editor integration.

13:38 So it's really the fact that this is like that, a little better, runs in editors.

13:43 That's cool.

13:44 Yeah.

13:44 Actually, I don't remember the last time I actually ran a spell checker independently.

13:49 I just rely on those in-editor things.

13:52 So do I.

13:53 So do I.

13:53 So yeah, it's also got LSB for other things, I guess.

13:58 Yeah, that means you can even use it in NeoVim or Vim or Zed or whatever, right?

14:04 So it's not just even the extensions.

14:06 It's actually because the LSP even goes farther than that.

14:09 Cool.

14:09 Yeah.

14:10 Anyway, thank you, Sky, for the follow-up and good suggestion.

14:14 All right.

14:15 Apparently, I'm missing having a testing podcast.

14:18 So I've got two topics that I'd like to talk about, a couple of testing topics.

14:24 First one came in.

14:25 It's called Slowlify.

14:26 It came in from Brian Skin.

14:28 So thank you, Brian, for sending in this idea.

14:33 So here's an interesting idea.

14:35 So this is a project to simulate overloaded, slow, resource-constrained machines.

14:43 So basically to make your tests flakier or something.

14:48 Nice flaky tests.

14:49 But the idea around it is a test is working fine locally,

14:55 but you throw it up in CI and it fails for some reason.

14:59 And it might be because you've got a CI image that is more constrained.

15:05 So this allows you to do things like muck with how much memory is around

15:11 and how many CPUs are available and stuff.

15:14 It requires you to run it on a Linux machine with Cgroups V2 around

15:22 because that's how it throttles the CPU and memory and stuff.

15:25 But it shouldn't be hard to come by, hopefully.

15:29 And yeah, then you can check to muck with things to find out,

15:35 to try to simulate locally a failure that's happening in CI.

15:38 So really nice there.

15:40 The other topic I'd like to talk about testing-related is,

15:45 this comes from Ned Batchelder.

15:47 Actually, it's his article, Why Your Mock Breaks Later.

15:52 And actually, I think it should be stronger than this.

15:55 basically don't the don'ts and do's of uh mocking and the gist of it is uh overly aggressive

16:03 mocks can can work fine at first but then break later recently a lot of people were doing uh

16:09 all this pop down if you've like let's say you're reading a file and you want you want to pat you

16:16 when the file gets opened you don't really actually want to file the muck with the file you

16:19 want to be able to to mock that or patch it so one of the things that some people do is to patch the

16:25 open function and one of the ways people do it is patching built-ins open this is not how you want

16:32 to do it this is the don't do this version and uh let's just zoom in a bit don't do the built-ins

16:38 open because it it like patches everything and it's causing problems in uh it was causing problems

16:45 of coverage because coverage also wants to open something and you're basically patching open for

16:51 everything in your app in your program including coverage when it's running on top of it so you

16:56 don't want to do that you only want to patch where where you are so the proper way is wherever

17:02 like if you're in a the example is you've got a user um file you want to patch right there in my

17:08 product.user, the dot following of where it is.

17:13 Exactly where it is.

17:15 That's the gist of it is, don't mock the thing you're importing

17:20 after you've imported it, mock it there.

17:22 And it's a good lesson.

17:24 I didn't think that this, I thought that was fairly widely known,

17:29 so I didn't realize it was an issue.

17:31 He went ahead and did a search for Python.

17:37 In GitHub, you can search for built-ins open with tests in there and patches and stuff, either patches or whatever, monkey patching or patching or mock patching.

17:49 Found 44,000 files that were doing the bad one within GitHub.

17:54 So this is all naughty.

17:57 I don't know what kind of GitHub badge you get for 44,000 PRs getting accepted, but Ned's got himself a real opportunity here to get a 100% sort of badge.

18:07 I don't think he wants to fix them all, but yeah.

18:10 No, that's an interesting way, an interesting metric.

18:12 Yeah, and actually at the end of the article, also I'd like to point out, he talks about some mocking practices.

18:21 Make sure you use autospec equals true to make sure that your mocks strictly behave like the original.

18:27 I wholeheartedly agree with that.

18:30 Make assertions about how your mock is called.

18:32 Actually, the rest of this is stuff that I actually want to go check out

18:36 because I do remember this functional core imperative shell talk

18:40 and some of these other things, dependency injection.

18:42 I'm not sure if I agree with all of Ned's stuff, but that's all right.

18:45 Some other interesting things to read about with mocking.

18:48 And I imagine he knows more than I do because I don't usually mock.

18:52 I don't mock very much.

18:53 It's not very nice to do, honestly.

18:55 It's not very nice.

18:56 So yeah, but sometimes it's necessary.

19:00 And sometimes it's necessary.

19:01 You know what is nice, though?

19:02 Extras.

19:03 Extras, yeah.

19:04 Yeah, I do have extras.

19:05 Should I go ahead and run through them?

19:07 All right.

19:07 So I've already got my stuff up.

19:09 Let's go.

19:10 This is a great, there was a great mini documentary of FastAPI,

19:16 The Rise and Fall, Rise and Rise, not The Rise and Fall, The Rise and Rise of FastAPI with Sebastian Ramirez.

19:23 And it's like an eight-minute video.

19:26 It's a really fun video of him talking about it.

19:29 He's such a genuine, nice dude also.

19:33 Yeah, he really is.

19:35 I am still writing, Lean TDD, the e-book in progress.

19:41 You go to the table of content.

19:43 Oh, I made a couple of changes.

19:44 So somebody requested that not only do I, when I release a new chapter to release the full thing,

19:51 but also the latest one.

19:52 And that way people can just like just throw the latest one on their Kindle and just have one chapter where they can either replace the whole thing or if they've taken notes on other stuff to just do the updates, the new chapters.

20:05 So I'm going to do that now or at least have started.

20:08 We'll see. It's a little extra work, but that's all right.

20:11 I got the building on lean done and it was long enough to talk about lean.

20:17 I think that it made sense to split it.

20:20 And I was going to do finding waste in test-driven development as part of that chapter, but I'm going to make it its own chapter now.

20:25 So I'm going to do that.

20:27 I wanted to do a sneak peek.

20:28 Oh, never mind.

20:30 Of the table of contents in progress so far.

20:33 So I'm making some good progress.

20:35 I've got an outline for where I'm going in the future.

20:37 Where are we now?

20:39 We're going to do finding waste in TDD next year.

20:43 It's not going to be a huge book.

20:45 Probably, I'm guessing.

20:46 So right now we're up to, what, 30 pages?

20:49 is a PDF.

20:51 I'm guessing it will be under 100 pages when I'm done.

20:54 So it's not a huge book, but it's also not expensive.

20:56 It's $10.

20:57 At least my experience is PDFs usually have more content per page than e-books,

21:02 at least if you ask Amazon how many pages is it.

21:05 Yeah, and even like way more.

21:08 Yeah, it's more content per page for e-book, but also per print book.

21:11 So print book isn't usually an 8.5 by 13 page.

21:15 So yeah.

21:16 Last one, my extra Python 3.14.2 was released December 5th.

21:24 We haven't had 3.14 around for that long, but people are upgrading, which is great,

21:29 and they're not afraid to upgrade, but they're finding a few things.

21:32 So there were a handful of fixes.

21:34 There were some exceptions in multiprocessing.

21:37 I didn't notice those, but some people noticed them.

21:40 Data classes without an NITs were throwing exceptions.

21:43 Anyway, they fixed some critical things in 3.14, And I appreciate the core team being on top of it.

21:49 So that's great.

21:50 Yeah, awesome.

21:51 That one flew under my radar somehow.

21:52 I didn't notice it.

21:53 So very exciting.

21:54 Time to upgrade some stuff.

21:56 All right.

21:56 Do you have any extras?

21:58 Well, I do.

21:58 I have some repeat extras in a sense.

22:01 In that you and I both pulled this Sebastian Ramirez one out.

22:05 And I don't really have much more to say other than I want to say for sure.

22:08 This is a super nice documentary.

22:09 It's super highly produced.

22:10 It's done by Cult Repo.

22:12 What a bad name.

22:12 The comments suggest like, what is this?

22:15 like a weird cult or something.

22:17 A much better channel name would be Repo Culture, or Culture Repository, or Repository Culture.

22:23 It's something about like, it covers open source basically, right?

22:26 But Cult Repo is weird.

22:27 Anyway, it's the same group that did the one hour Python documentary

22:32 that's really highly produced.

22:33 So that's all I wanna say about that.

22:35 And with regard to the book, right?

22:36 For the Talk Python in production book, I actually started keeping a changelog.

22:42 I think we talked to, I think even you brought this up.

22:43 Keep a changelog.

22:44 Don't let your friends dump Git logs into change logs.

22:47 Keep your change log.

22:48 And so I'm keeping this for people who are like, what has changed about the book?

22:52 Because at least, well, on Amazon, Amazon says they will release new versions as they feel like it

22:59 if I upload a new EPUB.

23:01 Really?

23:02 Yeah, but it doesn't say the timeframe of it.

23:04 And those should automatically show on people's devices as updates.

23:08 And then the Gumroad version, if you buy it directly from me,

23:11 obviously I push up new versions and have like numbers.

23:14 and my book has a version number in it right which is kind of fun anyway so i'm keeping a change log

23:19 following the keep change log style so people can see like do i care do i care about the change do

23:25 i need to go back whatever so yeah and i also want to tell people that um it's the it used to be like

23:33 you know several years ago when i did a my first ebook um it was a little little sketchier to

23:39 to figure out how to get a book onto your kindle without um like without going through amazon and

23:46 it's way easier now um if you just like if you grab a book like an ebook for me or from michael

23:52 you can just email it to yourself you can set up a an email address that you just email it to

23:56 yourself and it just shows up on your kindle yeah you your kindle gets an email so mine mine is

24:01 something with the word paper right in it i don't remember exactly what it is but yeah and it's it's

24:06 totally um you figure it out once and and i've got um yeah it's not bad it's not easy it's not easy

24:12 it is very easy it's not hard so yeah yeah and uh real time follow-up sky as in the same sky that

24:18 recommended um typos it looks like 3 14 2 came out just three days after 3 14 1. okay very interesting

24:25 all right a couple more extras for me i was on vanishing gradients so that i told you that's

24:29 gonna be there that's out that was a very fun episode i a fun chat with hugo bone anderson and

24:35 Django 6 is now officially released.

24:37 Last week I talked about what was coming, but the day after we did that, it's now actually out.

24:43 So if you're waiting on that, Django 6 is out.

24:46 See what it holds for you.

24:47 Now, Brian, I think I have a pretty fun joke.

24:50 This is a little more elaborate than just a dad joke or something.

24:52 Are you ready?

24:53 Yeah.

24:56 There's these joke programming languages that actually compile and stuff.

24:59 And one that I really love is lolcats, L-O-L-Cats, all one word.

25:03 So good.

25:05 So good.

25:05 It actually has multiple implementations of it, and it's good.

25:09 But we don't live in the time of lolcats anymore.

25:13 That was like an early meme of the internet.

25:16 So we now live in a hyper-hyped, crazy headline, overdone age, as you know.

25:23 So I present to you the tabloid language.

25:26 Oh, my God.

25:27 Are you ready?

25:29 Oh, my God.

25:30 Here we go.

25:31 It's a minimal programming language inspired by clickbait headlines.

25:35 Shocking new programming language bewilders programmers at Google and Facebook.

25:39 GitHub new headline tutorial.

25:42 So let's look at an example here.

25:43 Discover how to Fibonacci.

25:45 This is import, basically.

25:47 Discover how to.

25:48 No, this is the function actually.

25:50 Discover how to Fibonacci with A, B, N.

25:53 Rumor, this is like a try or something.

25:56 Rumor has it.

25:57 What if N smaller than one?

25:59 Shocking development B.

26:01 Lies.

26:02 Rumor has it.

26:03 You won't want to miss B.

26:06 Shocking development.

26:07 Fibonacci of B, A plus B, N minus one.

26:10 End of story.

26:10 End of story.

26:11 Expert claims limit to be 10.

26:15 You won't want to miss first 10 Fibonacci numbers.

26:18 You won't want to miss.

26:18 Apparently it's print.

26:23 And then I don't know what this last one is.

26:25 Experts claim nothing to be Fibonacci of 101 limit.

26:30 I think that's like a test or an assert.

26:32 Please subscribe and like.

26:33 No output.

26:34 I'm going to run it.

26:34 Hold on.

26:35 Hold on.

26:35 Run this.

26:36 Oh my God.

26:36 It runs.

26:39 What about factorial?

26:40 You won't want to miss this.

26:41 Hello world.

26:42 Discover how to factorial with n.

26:44 Rumor has it.

26:45 What if n is actually zero?

26:47 Shocking development one.

26:48 Lies.

26:49 Shocking development n times back.

26:52 So good.

26:52 Oh no.

26:53 Lies is the else.

26:54 Yeah.

26:55 Lies is else.

26:56 Yeah.

26:56 Lies.

26:57 Because there's an assertion.

26:59 It goes lies.

27:00 That's like, no, not the assertion.

27:02 It's really good actually.

27:03 and notice it runs it runs it runs in the browser what is this built on i don't know i'm not sure

27:10 if it's WebAssembly or if it's just javascript implementation it's all javascript so okay this

27:16 is awesome it's so good isn't it yeah i think i think we need a uh but you know it used to be

27:23 that this would be difficult but we just have to have the spec for this and we could get like

27:27 clod or something to translate larger programs to uh to tablet i might rewrite python bites the

27:34 website in it i think lies exclamation it requires an exclamation mark for lies oh by the way people

27:42 were just listening this is all all the keywords the entire language is all caps of course lies

27:48 of course anyway i think it's pretty excellent this is old this is old i didn't realize i just

27:54 ran across it but uh it's four years old anyway well done well done whoever made this is

28:00 amazing this is awesome yeah oh yeah also um uh kiva in the out in the audience points out that

28:08 every time you print something it also ends in an exclamation mark even if the text itself doesn't

28:12 have an exclamation mark oh yeah obviously i mean like of course it has to lies this is the end of

28:20 the show lies we have more no this is really good it's good so also for people watching the video

28:30 I you'll notice a little less junk in my office I'm starting to clean up after Thanksgiving and

28:36 we'll get there yeah anyway great episode as always Michael thank you thank you everybody

28:41 for listening and we'll see you all next week what if actually this was the end now see you later

28:48 lies


Want to go deeper? Check our projects