Python Bytes - #461 This episdoe has a typo

Episode Date: December 9, 2025

Topics covered in this episode: PEP 798: Unpacking in Comprehensions Pandas 3.0.0rc0 typos A couple testing topics Extras Joke Watch on YouTube About the show Sponsored by us! Support our work t...hrough: Our courses at Talk Python Training The Complete pytest Course Patreon Supporters Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) 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 You’ve heard about codespell … what about typos? VSCode extension and OpenVSX extension. From Sky Kasko: 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: The Rise and Rise of FastAPI - mini documentary “Building on Lean” chapter of LeanTDD is out The next chapter I’m working on is “Finding Waste in TDD” Notes to delete before end of show: I’m not on track for an end of year completion of the first pass, so pushing goal to 1/31/26 As requested by a reader, I’m releasing both the full-so-far versions and most-recent-chapter Michael: My Vanishing Gradient’s episode is out Django 6 is out Joke: tabloid - A minimal programming language inspired by clickbait headlines

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 461, recorded December 9th, 2025, and I am Brian Ockin. And I am Michael Kennedy. And this episode is sponsored by yours truly and Michael, so both of us. Talk Python training, always some great stuff. I'm working. I just finished the AI, the recent AI agent course. Oh, you did.
Starting point is 00:00:30 Yeah. Oh, thank you. Yeah, awesome. Really enjoyed it. Some great content there. And so, but there's plenty of other stuff to do. There's even a Pytist course there. But if you'd like a really complete Pytest course, I'd own over to PythonTest.com.
Starting point is 00:00:44 We have a, there's the complete course there. Thanks to Patreon supporters. Also, there's a new book out from Michael and a book 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 by sending us topics, we like that too. You can connect with us. There's a contact forum on the website on Pythonbites.fm, or you can reach us on Blue Sky or Mastodon. And if you'd like to, if you're listening, we love you, but we also would like you to check out our video stuff every once in a while.
Starting point is 00:01:16 Head on over to Pythonbytes.fm. slash live and you can be part of the audience or just watch it afterwards. And finally, please subscribe to our newsletter or essentially it's occasionally we send out little news bits, but mostly it's the show notes from the show. So we send out after we get it all done, we send out a newsletter that has all the links so you don't have to take notes while you're listening. Now, for our first topic, Michael. 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. The first one is PEP 798, unpacking in comprehensions. So this one is a little bit functional. It's currently in draft stage targeting Python 315.
Starting point is 00:02:02 It's pretty minor, but I think it brings some consistency to it. So I link to the conversation here, and the idea is, right now, if I have a function that takes an arbitrary number of positional keywords, you know, you would say star args, right? Star arc, star, star, KW, args is like a pretty common theme that we see. So if I had something that said star args, And I wanted to push a tuple of our, a tuple of values as those positional parameters.
Starting point is 00:02:34 I would say star tuple in the function call. Kind of like you say star star for a dictionary to say keyword arguments, right? So the idea here is that that works for function calls, but it doesn't work for comprehensions, less comprehensions, set comprehensions, and so on, if you have an iterable. Right now what we have, and this is super confusing to me,
Starting point is 00:02:55 I always get the order wrong, or at least I'm always uncertain, of the order is I can say, you know, basically X for X in Y, Y for Y in thing, if I've got a set of lists or intervals and I want to turn them into like one big list as a comprehension. You can basically do like a double comprehension
Starting point is 00:03:16 in one thing and I'm always like, which one is the collection and which one is the item, you know, like, ah. So this kind of solves that. It says you can just say in the corporation, you say, star iterable for iterable in some list of iterables. And it makes it real simple.
Starting point is 00:03:33 Right? So you can do that for pulled up official PEP. You can do it for list comparisons, set comprehensions, dictionary comprehensions. If you have a list, if you have an iterable of dictionaries, you can create a dictionary comprehension. And you can do it for generators if your generator generates iterables.
Starting point is 00:03:54 Does that make sense? Yeah. So that's pretty much it. What do you think? That's cool. So that's not something you do now. This is a proposal. Is that right?
Starting point is 00:04:03 Yes, this is a draft for 315. Okay. And just shout out for a little bit of credit. This is Adam Hartz and Eric Demaine for the people proposing it. And the sponsor is Yela Jzilestra. Sorry, if I messed that up. I gave it my best shot, folks. So anyway, that's my main topic here for this first one is this unpacking in
Starting point is 00:04:25 comprehensions. We've had unpacking in other places. into variables. We've had unpacking into function calls. We have not had them in comprehensions. And they've honestly, this double comprehension, like double layered comprehension thing has always been complicated. And so I'm here for it. I mean, it does add another thing to language and everything you add to a language just makes it more complicated. But in this case, I think it's, I think it's well worth it. Now, go ahead. Oh, I just wanted to say, speaking of a comprehensive, or the unpacking, use the star or asterisk. But one of my favorite names
Starting point is 00:04:58 for that character is splat. Splat. Splat. It's called them splatted comprehensions. Here, hold on. I'll just edit this and we'll fix this real quick. I'm going to change the, you know what, my screen is too small.
Starting point is 00:05:12 I was going to edit the text, right? Okay, so that's all good. Now, the next one is just a really quick follow-up on a pep as well before we move off of focus on me. Remember how excited you were and I was about explicit lazy imports, as in lazy, That, that, uh, are they going to take it out? No.
Starting point is 00:05:31 Okay. Dear PEP 810 authors, Barry Warsaw writes, this steering council is happy, happy, to unanimously accept PEP 810 explicit lazy imports. Congratulations. You now have a job to implement it. Yeah. The same is true for all the other alternative keywords we come up with so lazy it is. I know. That's anyway, a little bit of background on some of the thinking the steering council put on there.
Starting point is 00:05:55 But yeah, unanimously and happy. Yay, good. Yeah, that's pretty good. So happy to see that. And by the way, just a little shout out for the live stream folks. I'm not Barry Warsaw and a bunch of other folks on to do a year and review three hours, two hours and 40 minutes from now on Talk Python. So that's going to be fun. We'll hear from Barry over there, but probably not about the pet.
Starting point is 00:06:19 All right, over to you, Ryan. What am I talking about? I'm going to talk about another new release or an upcoming release. Pandas 3.0. So the Pandas 3.0.0. So 300. There's a release candidate zero. That's been out since sometime last week. But there's, and then apparently there's going to be an official 30 released in a few weeks, that was a week ago. So maybe a couple weeks from now. Not sure. So what do we got in here? I'm pretty excited about this, actually. We've got what's new. There's a dedicated string data type by default. And this is just kind of great.
Starting point is 00:06:58 So if normally in things that with strings in them, they would show up as objects, but clearly they're strings. So there's a new string type. And it does change things a bit. If you have any missing things, it'll be an N-A-N sentinel to say that there's nothing there. What's great about this is if this, once you have this stir-type, D-type, or stir-D-type, you can only put strings or nans in it. There's nothing else allowed. So nothing weird shows up. It's not just a generic object.
Starting point is 00:07:33 There's a lot of other implications around this. The Stry can only hold strings in the Sentinel, of course. The missing values are Sentinel, inferred by default for string data. Anyway, check out the PEP 14 to get a little more information. There is other implications around this, but I think it's a really good thing. Copy on Write also is kind of a really exciting thing that hopefully, nobody will really notice, but the idea is really anything that results in an indexing operation will return essentially a copy of things.
Starting point is 00:08:08 So you don't, there's not, or not a copy, it'll be a reference. It's, and it only, only makes a copy of actually modify something. So, so handles will keep track of whether or not you've changed it. And if you haven't changed it, it's just a copy of the data there. This will say, this should save a lot of time and space. I think that's going to save a ton of especially memory because if I remember correctly, I'm not a hand as experts by any stretch of the imagination, but when you call operations like filter operations or other transform operations, it doesn't in place modified. It returns a new
Starting point is 00:08:43 data frame. Like if I add a column to a data frame with the operation, I get a entire copy of that data frame plus the column, you know, one's the new column. 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. Yeah, and it says the main goal is to change the user API to be more consistent and predictable. And I think this is right, because we're, I mean, we're doing like matrix operations and stuff,
Starting point is 00:09:06 and we'd really like it to be kind of like math where you don't really care about the, you know, size or timing implications. You're just, this is what I want to do. And having that be more consistent and hidden behind the scenes, I think it's going to be great. It's going to make this a lot easier to learn their cleaning up a lot of the API and stuff.
Starting point is 00:09:25 It's really cool. We had covered this in one of the other episodes that was coming. PD call syntax can now be used for data, used in data frame assign and location. 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 or some operation. And it just, it does it right there.
Starting point is 00:09:48 Like instead of having to do a Lambda expression inside, you can just do the expression. It's really kind of a great syntax. We've got a copy of the syntax in the show notes, but that's pretty great. Some changes to deprecation policy, probably because of some of these changes that, you know,
Starting point is 00:10:04 they're doing a three-stage deprecation thing. But I think this is good. I think that basically open source projects are being used more. The ones that have to think about this, how to keep track, keep it fun to maintain, but also moving with the times. And I think these are good calls. A bunch of other.
Starting point is 00:10:22 enhancements as well so check those out but i think this is a really good good direction and i can't wait to see three oh pandas come out this will be great yeah that's pretty exciting that's a pretty major change uh all right um what's up next this episode has typos in it brian oh no i'll try to fix it i know well remember i spoke about code spell all one word code spell and it was a miss spelling finder not a spell checker right the spell checker looks for words that it knows our good and says, I don't know that word. That must be misspelled. In programming, obviously, there's all these symbols and all sorts of stuff. One of the things that drives me crazy is when my editor suggests that a library that I'm importing is misspelled, but it's the library's
Starting point is 00:11:06 name correctly. I'm like, well, I can't write it any other way. This is the only way it works. I'm sorry, Spell Checker, but do I really got to go through and tell you that this is the name of the library I'm using? Yes, apparently I do. So this light code spell, this thing called typos, also looks for known misspellings like ADN for a common misspelling of and so on. So why are we back? Well, Sky Costco wrote and said, Codespell is cool, but you should check out typos. So typos, I believe it is written in Rust.
Starting point is 00:11:39 Yes, 99.9%. That's 3-9s Rust, pretty good. And 0.0% Python, but it's still mentioned. So it must be less than 1 tenth of 1%. But it's a little more full feature. for people that like this. So, for example, it has a GitHub action that you could just put into all of your PRs. That's kind of cool if you want. Is that like a gated thing for, you know, PRs and commits and so on? But the best thing about it, I guess two things. One is it uses the concrete syntax tree rather than actually just searching text.
Starting point is 00:12:12 So what it can do is it can find partial bits of words that are misspelled. Maybe this is actually not related that, but it does find partial misspellies. So, for example, if you write connecton string, instead of connection string with snake casing, whatever, it says, hey, guess what? The word connection and connection underscore string without the eye is a misspelling. Maybe you should change, you know, connecton to connection or connector or whatever. And it gives you a nice little UI for that. So that's one. I really like that.
Starting point is 00:12:42 Actually, that's super cool that it can detect misspellings within, you know, snake case words. Yeah, yeah, this is a big improvement. Picharm does this as well, by the way, which is really nice. But I believe Pytarm is a built checker, not a misspelling finder or whatever. Pretty sure. Anyway, this is really nice that it does this. The other thing that's super cool, and this is why SkyRot to us, is it actually has a VS code in friends, extension and language server. So what you can do is basically install this as an extension in VS code or cursor or Google anti-gravity or, you know, when serving that you
Starting point is 00:13:21 name all the others, right? Because it's also in the open VSX registry. So you can install that there. And then just as you're writing code, you get little squigglys and you get alt-inter actions to fix it. So you don't even have to run the client or the GitHub thing and so on, which the code spell has no editor integration. So it's really the fact that this is like, like that, a little better, runs in editors. That's cool. Yeah. Actually, don't remember the last time I actually ran a spell checker independently. I just rely on those in-editor things. Thanks. So do I.
Starting point is 00:13:53 So do I. So, yeah, it's also got LSP for other things, I guess. Probably, yeah, that means you can even use it in NeoVim or Vim or Z or whatever, right? So it's not just even the extensions. It's actually because the LSP, it even goes farther than that. Cool. Yeah. Anyways.
Starting point is 00:14:10 Thank you, Sky, for the follow-up and good suggestion. All right. Apparently, I'm missing having a testing podcast. So I've got two topics that I'd like to talk. about a couple of testing topics. First one came in. It's called Slowafi. It came in from Brian's skin.
Starting point is 00:14:28 So thank you, Brian, for sending in this idea. So here's an interesting idea. So this is a project to simulate overloaded, slow resource-constrained machines. So basically to make your tests flakier or something. Nice flaky tests. but the idea around it is a test is working fine in locally but you throw it up in CI and it fails for some reason so and it might be because you've got you've got a CI image that that is more constrained so this this allows you to do things like muck with how much memory is around and and how many CPUs are available and stuff it does require it requires you to run it on a Linux machine with C Groups V2 around because that's how it throttles the CPU and memory and stuff.
Starting point is 00:15:25 But it shouldn't be hard to come by and hopefully. And yeah, then you can check to you can muck with things to find out, you know, to try to simulate locally a failure that's happening in CI. So really nice there. The other topic I'd like to talk about testing related is this comes from Ned Batchelder. actually it's his article why your mock breaks later and
Starting point is 00:15:52 actually I think it should be stronger than this basically don't the don'ts and do's of mocking and the gist of it is as overly aggressive mocks can work fine at first but then break later recently a lot of people
Starting point is 00:16:08 were doing all this pop down if you've like let's say you're reading a file and you want you want to pat when the file gets open you don't really actually want to file the muck with the file you want to be able to to mock that or patch it so one of the things that some people do is to patch the open function and one of the ways people do it is patching built-ins
Starting point is 00:16:30 open this is not how you want to do it this is the don't do this version and I'll just zoom in a bit don't do the built-ins open because it like patches everything and it's causing problems in it was causing problems in coverage because because coverage also wants to open something. And you're basically patching open for everything in your program, including coverage when it's running on top of it. So you don't want to do that. You only want to patch where you are.
Starting point is 00:17:00 So the proper way is wherever, like if you're in a, the example is you've got a user file, you want to patch right there in my product. User, the dot following of where it right, exactly where it is. there's that's the gist of it is is don't don't mock the thing
Starting point is 00:17:19 you're importing after you've imported at market there and it's a good good lesson I didn't think that this I thought that was fairly fairly widely known so I didn't realize it was an issue he went ahead and did a search for
Starting point is 00:17:35 Python in GitHub you can search for built ins open with test in there and patches and stuff either are their patches or whatever monkey patching or patching or mock patching found 44,000 files that were doing the bad one within GitHub so um this is all this is all naughty well i don't know what kind of get a GitHub badge you get for 44,000 PRs getting accepted but dad's got himself a real opportunity here to get a one percent sort of batch. I don't think he wants
Starting point is 00:18:08 to fix them all but yeah that's an interesting way an interesting metric yeah and that's Actually, at the end of the article, also, I'd like to point out, he talks about some, some mocking practices. Make sure you use autospec equals true to make sure that your mocks strictly behave like the original. I wholeheartedly agree with that. Make assertions about how your mock is called. Actually, the rest of this is stuff that I actually want to go check out,
Starting point is 00:18:36 because I do remember this functional core imperative shell talk and some of these other things, dependence to injection. I'm not sure if I agree with all of Ned's stuff, but that's all right. Some other interesting things to read about with mocking. I imagine he knows more than I do because I don't usually mock. I don't mock very much.
Starting point is 00:18:53 It's not very nice to do, honestly. It's not very nice. Yeah, but sometimes it's necessary. And sometimes it's necessary. You know what is nice, though? Extras, yeah. Yeah, I do have extras. Should I go ahead and run through him?
Starting point is 00:19:07 All right. So I've already got my stuff up. Let's go. So this is a great, there was a great mini documentary of Fast API, the Rise and Fall, rise and rise, not the Rise and Fall, the Rise and Rise of Fast API with Sebastian Ramirez. And it's like an eight minute video. It's a really fun video of him talking about it. He's such a genuine, nice dude also.
Starting point is 00:19:33 Yeah. Yeah, he really is. I am still writing, Lean TDD, the eBook in progress. you go to the table of content oh I made a couple of changes so somebody requested that not only do I when I release a new chapter to release the full thing but also the latest one 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 of the new chapters so I'm going to do that now or at least have started we'll see it's a little extra work but that's all right. I got the building on Lean done, and it was long enough to talk about lean, I think, that it made sense to split it. 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. So I'm going to do that. I wanted to do a sneak peek. Oh, never mind of the table of contents
Starting point is 00:20:32 in progress so far. So I'm making some good progress. I've got an outline for where I'm going in the future. Where are we now? We're going to do. finding waste in TDD next year. It's not going to be a huge book. Probably, I'm guessing. So right now we're up to what, what 30 pages is a PDF. I'm guessing it will be under 100 pages when I'm done. So it's not a huge book, but it's also not expensive.
Starting point is 00:20:56 It's $10. At least my experiences, PDFs usually have more content per page than ebooks. At least if you ask Amazon, how many pages is it? Yeah, and even like way more, yeah, it's more content per page for e-book, but also per print book. So print book isn't usually an 8.5 by 13 page. So, yeah. Last one, my extra Python 3142.
Starting point is 00:21:21 It was released December 5th. We haven't been, we haven't had 314 around for that long. But as people are upgrading, which is great. And they're not afraid to upgrade, but they're finding a few things. So there were a handful of fixes. There were some exceptions in multi-processing. I didn't notice those, but some people noticed them. Data classes without anits
Starting point is 00:21:42 We're throwing exceptions. Anyway, they fixed some critical things in 314 and I appreciate the core team being on top of it. So that's great. Yeah, awesome. That one flew under my radar. Somehow I didn't notice it. So very exciting.
Starting point is 00:21:54 It's time to upgrade some stuff. All right. Do you have any extras? Well, I do. I have some repeat extras in a sense in that you and I both pulled this Sebastian Ramirez one out and I don't really have much more to say other than I want to say for sure.
Starting point is 00:22:08 This is a super nice documentary. It's super highly produced. It's done by Cult Repo. What a bad name. The comments suggest like, what is this like a weird cult or something? A much better channel name would be repo culture, culture repository or repository or repository it's something about like it covers open source basically, right? But Cult repo is weird.
Starting point is 00:22:27 Anyway, it's the same group that did the one hour Python documentary that's really highly produced. So that's all I want to say about that. And with regard to the book, Brian, for the Talk Python in production. book, I actually started keeping a change log. I think we talked to, I think even you brought this up, keep a change log. Don't let your friends dump get logs into change logs. Keep your, keep your change long. And so I'm, I'm keeping this for people who are like, what has changed about the book? Because at least, well, on Amazon, Amazon says they will release new versions
Starting point is 00:22:57 as they feel like it if I upload a new EPUB. And really, yeah, but it doesn't say the timeframe of it. And those should automatically show them people's devices as updates. And then the Gumroad version, if you buy it directly from me, obviously, I push up new versions and have like numbers. And my book has a version number in it, right? Which is kind of fun. Anyway, so I'm keeping a change log following the keep a change log style so people can see like, do I care? Do I care about the change? Do I need to go back? Whatever. So. Yeah. And I also want to tell people that it's the, it used to be like, you know, several years ago when I did a first e-book. it was a little little sketchier to figure out how to get a book onto your Kindle without
Starting point is 00:23:42 like without going through Amazon and it's way easier now if you just like if you grab a book like an ebook for me or from Michael you can just email it to yourself you can set up an email address that you just email it just shows up on your Kindle yeah you your Kindle gets an email so mine mine something with the word paper right in it I don't remember exactly what it is Yeah, and it's totally, you've figured out once. And I've got, yeah, it's not bad. It's not easy. It's not easy.
Starting point is 00:24:12 It is very easy. It's not hard. Yeah, yeah. And real time follow-up, Sky, as in the same Sky that recommended typos. It looks like 3142 came out just three days after 3.14.1. Okay, very interesting. All right, a couple more extras for me. I was on Vanishing Gradients, so that I told you that's going to be there.
Starting point is 00:24:29 That's out. That was a very fun episode. I have fun chat with Hugo Bowen Anderson. And Django 6 is now official release. Last week, I talked about what was coming. But the day after we did that, it's now actually out. Right? So if you're waiting on that, Django 6 is out.
Starting point is 00:24:46 See what it holds for you. Now, Brian, I think I have a pretty fun, pretty fun joke. This is a little more elaborate than just like a dad joke or something. Are you ready? So one of the, there's like these joke programming languages that actually compile and stuff. And one that I really love is a lolcats, LOL cats, all one word.
Starting point is 00:25:03 So good. So good. Actually, has multiple implementations of it. And it's good. So, but we don't live in the time of Lawcats anymore. That was like an early meme of the internet. So we now live in a hyper-hyped, crazy headline, overdone age, as you know. So I present to you the tabloid language. Oh, my God. Are you ready? Oh, my God. Here we go. It's a minimal programming language inspired by click bait headlines shocking new programming language bewilders programmers at google and facebook get up new headline tutorial so let's look at an example here discover how to fibina this is that this is import basically discover how to no this is the function actually discover how to fibonacci with a b n rumor this is like a try or something rumor has it what if n smaller than one shocking development
Starting point is 00:26:00 B. Lies. Rumorize it. You won't want to miss B. Shocking development. Fiminacci of B, A plus B in minus 1. End of story. In the story. Expert claims limit to be 10. You won't want to miss. First 10 Fibonacci numbers. You won't want to miss. Apparently it's print. And then I don't know what this last one is. Experts claim nothing to be Fibonacci of 1.01. limit. I think that's like a test or assert. Please subscribe with like no output. I'm going to run it. Hold on. Hold on. Run this. Oh my God. It runs. What about factorial? You won't want to miss this. Hello world. Discover how to factorial within. Rumor has it. What if N is actually zero. Shocking development one. Lies. Shocking development. So good. Oh, no. Lies is the else. Yeah. Lies is else. Yeah. Lies. Because there's a there's an assertion. It was lies. No, not the assertion. It's really good, actually. And notice, it runs. It runs.
Starting point is 00:27:06 It runs in the browser. What is this built on? I don't know. I'm not sure if it's WebAssembly or if it's just JavaScript implementation. It's all JavaScript. So. This is awesome. It's so good, isn't it?
Starting point is 00:27:19 Yeah. I think we need a, but, you know, it used to be that this would be difficult, but we just have to have the spec for this, and we could get, like, clod or something to translate larger programs. to tabloid. I might rewrite Python Bites the website in it. I think lies, exclamation, it requires an exclamation mark for lies. Oh, by the way, people were just listening.
Starting point is 00:27:43 This is all the keywords, the entire language is all caps. Of course. Of course. Anyway, I think it's pretty excellent. This is old. This is old. I didn't realize. I just ran across it, but it's four years old.
Starting point is 00:27:56 Anyway, well done. Well done. whoever made this. This is amazing. This is awesome. Yeah. Oh, yeah. Also, Kiva in the audience points out that every time you print something, it also ends in an exclamation mark, even if the text itself doesn't have an exclamation mark. Oh, yeah, obviously. Of course. It was asked to. Lies. This is the end of the show. Lies, we have more. No, this is really good. It's good. So also for people, uh, Watching the video, you'll notice a little less junk in my office.
Starting point is 00:28:34 I'm starting to clean up after Thanksgiving. We'll get there. Yeah, anyway. Great episode as always, Michael. Thank you. Thank you, everybody for listening. And we'll see you all next week. What if actually this was the end now?
Starting point is 00:28:46 See you later. Lies. Lies.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.