Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 393, recorded July 23rd, and I am Brian Okken.
And I'm Michael Kennedy.
If you'd like to watch the show live, you can catch us.
You can go to pythonbytes.fm/live and you can watch it live.
We'd love to have you on board.
Usually it's Pacific time, Tuesdays at 10 a.m.
Sometimes it changes.
And if you'd like to connect with us or offer, if you've got a topic that you'd like to have us cover, you can find out how to contact us on pythonbytes.fm.
Or you can follow all of us on Mastodon and Fosstodon.
So check out those links in the show notes.
Yeah.
Should we jump in?
Let's jump.
I think the first thing I want to talk about comes to us from Matt Wilkie.
And so Matt Wilkie suggested this cool project called Marimo.
Have you heard of it?
No.
Think Jupyter, as in Jupyter notebooks.
I feel like I'm on a vibe lately.
Last time I talked about Saturn, the Mac desktop application that was like a minimalist Jupyter notebook.
This is not that.
This is a what's called a reactive notebook.
And this actually solves one of the big pet peeves of mine about notebooks.
And notebooks are basically human selected go to statements, which is a little bit sus in the end.
I mean, it's great.
But I can go and say, I can go and run cell one, two, three, four, go back and edit cell two, but not run it.
Edit cell three.
And then run cell three.
And then you look at it.
And you have cell one, which ran cell two, which has data and it never ran.
And then old three, four, five, and then new three.
How do you visually know about that?
I mean, I guess there's a little number on the side that says one, two, three, four, five, right?
As you go back up.
But the ones that are not the latest numbers, those are not knowable effectively to you, right?
And so this concept of a reactive notebook is it understands the relationships of the cells and the pieces of data in the cells.
And so probably the best way here is to look at an example.
Okay.
If you go and look, let's see this one.
I'm going to see.
Come on, show me somewhere.
So for example, if I go, I don't know where I would find a good example for you.
Anyway, if I go and say in that cell three there, yeah, here we go.
They've got a cool example on their page.
If you go in there and you make some kind of change to a data cell, for example, if you say the number of items is 100,
and then you print out that number of items says, I'm sorry, a thousand, then it'll say, well, it's a thousand.
But if you go and edit, say, cell three, which then cell four is using some of the outputs from, and you make changes to it, it knows that.
And it automatically re-renders and re-executes that Python code that is in there.
And then you even have UI widgets, which you can put in and slide them around.
And every cell that depends upon that slider bound to that piece of data runs.
Oh, that's cool.
That's how I want it to work anyway.
Yeah.
Exactly.
Yeah.
Another big change here is there's some other things that are worth talking about here is it's also Git friendly in the sense that the notebook format.
So the notebook format for Jupyter, just keep contrasting it, right?
Is a JSON file that has the cell definition and then the cell output embedded in the JSON file.
And specifically because of the cell output, it can get pretty ugly in Git if you're not careful about clearing out the cell output every time.
Because if it just uses something like call an API and get the current data and that data changes, the output changes, and then you get weird merge conflicts like this graph conflicted with the old graph.
You're like, that's just the output.
What is going on here, right?
Yeah.
So this is a pure Python.
The notebook itself is stored as a pure Python thing that when you put into GitHub or any form of Git, honestly, it diffs like Python, right?
Okay.
So yeah, Python first design, reproducible by default because they're always executed in a deterministic order without hidden state.
The editor comes with GitHub Copilot, autocomplete.
Mm-hmm.
Remember, Git, Jupyter Lab and Jupyter Notebooks.
In order to get the autocomplete to render, you've got to hit like a cord of keys.
It's not just typing.
That'll make it come up.
So pretty cool.
This one's for you, Brian.
Vim key bindings.
Yay.
Yeah, yeah.
And a VS Code extension.
So anyway, I think this is pretty neat.
And it is open source under the Apache 2 license.
It has 5.5,000 stars.
I don't mean to sound super negative on notebooks.
I think they've been transformative for data science.
But I do think some of the drawbacks, like I laid out at the beginning of basically like human selected go-to statements is really tricky.
And I definitely like the idea of a little bit more cohesion between the pieces.
Yeah.
And also just different takes on stuff that people build on each other.
I'm sure that if some of these ideas take off, maybe Jupyter will pick them up.
Sure.
And Christopher out there does have a valid point.
Wonder how it handles computationally heavy stuff.
Sometimes you don't want a cell to rerun quite yet.
Right?
You know, if it takes 10 seconds for something to rerender, re-update, and you're just trying to edit that code.
But I don't believe it rerenders until you render the cell that affects it.
Yeah.
But I mean, it still might be valid.
There might be times for both behaviors.
I can imagine like a time when, though, like if you're doing a demo where having it redo it automatically would be awesome.
Yeah.
Anyway, take it or leave it.
But there it is.
Mario.
Cool.
Reactive notebook for Python.
I want to talk about change a little bit.
Mostly a change log.
So wait, that wasn't really a good transition.
But yeah, whatever.
pytest has a new update.
Yay.
So pytest updates fairly regularly anyway.
But I'm really excited about 8.3 that came out just the other day because there was a flag that I worked on.
So there was in 8.0, there was in the 8.0 release.
I don't even remember when that was.
There was a change that I helped put in place that was to turn on tracebacks for X fails.
So this is sort of inside baseball stuff.
But if you expect a test to fail, it normally didn't produce a traceback.
But I added or I and a few other people worked on a feature to turn on tracebacks.
If you had the dash RX flag on, which means extra reporting for X fails.
I thought that made sense.
But it turned out that broke a whole bunch of people.
Sorry.
But it's fixed now again.
It's back to the normal behavior by default.
However, now there's a new flag called X fail dash TB that will turn those on.
So it turns on independent of the dash RX flag.
Those are separate now.
So I like the way this is here.
The other thing that I want to talk about.
So that's one of the features.
There's a bunch of new stuff also.
There's a change to keywords and markers.
And this is a little hard to quite get your head around, except for if you'd look at an example.
So the idea is that you used to be able to do a marker run, run a marker test or a marked test.
But you couldn't sometimes markers have parameters to them and you couldn't.
But the now basically just the just is now if there's a parameterized marker, you can specify that.
And there's a few, not all types, but a bunch of types are supported.
So I think we've got ints, strings, bulls and none.
So cool.
Yeah, very cool.
That's a cool feature.
And then the no fold skipped.
So apparently this was something that I didn't think I needed.
But now that I see it, I really am happy about it.
The idea was when you used to skip a test, it would tell you the file and line number.
I guess I didn't realize that.
But it wouldn't in the reporting, but short summary, but wouldn't tell you the name of the test.
And now you can turn on a no fold and it'll show you, I guess, more information and a bunch of other features.
I'm thinking a lot of this stuff came out of the, there was a recent pytest sprint that happened in Austria.
And I'm thinking maybe a lot of these features came out of there.
So cool, cool progress on pytest.
Oh, that's a big news.
Very big news.
So love to see it moving along.
Yeah.
Would you say it's the de facto testing framework for Python?
Are you still all about unit tests?
I'm all about pytest.
I don't hear much.
There are some other fun ones coming up that I've looked at a little bit.
But pytest is the big behemoth now.
Yeah, for sure.
It's not a big piece of code.
It's just most people are using it as far as I can tell.
Yes, indeed.
Awesome.
All right.
First of all, a bit of real time follow up.
Chris answering his own questions.
Oh, look in the docs there.
It's a way to mark sales as stale if they're too expensive.
Oh, cool.
Nice.
Yeah.
Excellent.
Now let's move on to Pittsburgh, Austria, where we can talk about the Python Language Summit
2024.
This happened at PyCon 2024 in the US.
And this happens every year.
It occurs just before PyCon US happens because this is the biggest gathering of core devs and other core dev influencers, if you will.
People who have projects that influence Python significantly like Pydantic or FastAPI have, I believe, in the past.
So there were 45 people in attendance, which is a lot.
Yeah.
I think of the core devs.
That's quite a few.
So what was covered?
So this year we had, you previously talked about the calendar version.
So they discussed whether or not they should adopt calendar version name for Python.
And it actually had more pushback than maybe you would imagine, basically around like, hey, there's a lot of systems that read the version and make meaning out of it already.
And they might get freaked out, I think, is one of the takeaways.
But my only pushback would be, come on, use the whole year, the 2024, not just 2024.
Anyway, but it doesn't affect me too much one way or the other.
I'll be happy with whatever it goes.
We're already incrementing by year on 3.13, 3.14, 3.15.
If we just skip a few and then keep incrementing by year, I don't know.
It's a huge difference.
Yeah.
Then we have Python's security model after the XZ-utils backdoor.
That was one of the, wow, we dodged a huge bullet.
That was a multi-year campaign to get into the XZ backdoor, into the XZ utility for Linux.
I don't know if you'll remember hearing us talk about that.
But basically they berated the beleaguered maintainer of this really important tool until they let them become a core contributor.
And that core contributor turned out to be a malicious actor.
So pretty insane.
Yeah.
It's crazy.
Yeah.
So Pablo Gallino Salgado gave a talk about Python security model after that.
Like, what are we going to do about these kinds of things?
There's also a talk on native interface and limited C APIs.
We had free-threaded ecosystems on how to talk about that and how to consider this.
Remember, the free-threaded Python is coming in 3.13 as a custom build output, not by default.
And we'll see how that goes.
Basically, it's got a big asterisk by the accepted on the PEP saying, we reserve the right to unaccept this, basically.
Another one that is super exciting for me is Python Unmobile by Malcolm Smith.
And talked about how Python is basically the foundations of it being built for macOS and Android ARM 64 and x86.
64 almost.
Almost there.
They've got BuildBot coming along and, like, how they're making this work.
But in Python, they've got tier three support accepted for making sure that CPython works on iOS and Android.
And now it's up to, well, what are we going to do about it?
Which I think would be awesome to be able to write mobile apps in Python, right?
So the foundations are coming along.
Yeah, this is all based on the Beware project, right?
So Beware, Toga, those types of things.
And I'll let it begin.
Come on, that would be really, really great to be able to have some kind of cool UI framework that lets us publish native or any form of apps writing in Python that publish as something other than a web page sent to mobile.
Keeping with the awesome but also controversial a little bit is Pyrepple.
Pyrepple is the, when you type Python, the repl that you get from PyPy, P-Y-P-Y.
And it's, we've talked about this before, there's a new repl for Python, regular Python.
And they're borrowing that one, which is a lot nicer, has a better editing of things like blocks of code instead of just want to go back one line at a time for, you know, an embedded if statement or an indented if statement.
Something weird like that.
A lot nicer.
The uncertainty was at the time, at least, it didn't work on Windows.
So a lot of people were like, look, it's going to be really weird to ship this and tell people to use it.
But then if they're on Windows, they can't use it.
So one of the big efforts is to get it working on the new Windows terminal, not the old cmd.exe crummy thing, but the new Windows terminal people should be using anyway.
But it's still going to cause probably some infusion, I guess.
Should we make PDB better?
Honestly, I don't know.
Limiting yield and async generators.
Also an interesting talk.
Annotations as transforms and some lightning talks by some folks, for example, unsupported build warnings.
Rust in Python, formalizing the PEP prototype by Emily Morehouse.
Python on iOS.
Finally.
Now this sounds like what I talked about with the Beware in mobile.
I don't believe it is.
I think this is more of, how do we get basically the Python REPL running on iOS and Android?
If I understand it correctly, there's things like Pythonista and others that let you run basically limited run of Python.
So, but it could be, I might be misunderstanding whether that's about, making a search more meaningful and efficient data sharing between sub interpreters, which is actually what is, I think, most exciting.
Right.
Sub interpreters open up possibility of even without free threaded Python, basically multi-threaded Python computationally.
And, but then if you can't share any data, then it gets a little bit funky.
So this talks about things like, well, what if you had the ability to have immutable data shared across things like that?
Right.
So anyway, very cool.
People can check all of that out.
All of these are written up with, details.
And I believe it was Seth Michael.
Yeah.
Seth Larson, wrote all these articles.
So thank you, Seth as well.
Yeah.
Great.
Um, yeah.
Good, good length.
I mean, enough detail to really understand what's going on, but not so much that it's overwhelming.
You can really, catch up really quickly on some of these topics.
That's pretty cool.
Yeah.
Indeed.
Um, over to you.
It's not like, just getting into a dungeon, which would be bad.
That would be, that would be very bad.
How would you get out of the dungeon?
Yeah.
Well, you, you, you might want to check out bash dungeon if you wanted to get out of, if it was like a Linux dungeon.
Linux dungeon.
Yeah.
So, I can't remember where I saw this, but, came across a project called bash dungeon.
Um, it's on GitHub.
We got a link to it and the, apparently it's built off a couple other ones.
There was a dungeons and directories and a bash crawl.
Um, but I'm, I'm looking at this.
It's a work in progress.
The idea is it's a game that's intended, to teach new year, new users, how to use their shell in a fun and interactive way.
And, there's a, there's some various, like how to play it.
You can get, there's like a get pod account or Docker.
That's weird that the way I recommend is you can just, you can just clone the thing.
So, and it has instructions on that too.
Just clone the repo and see.
You can play it as Docker, or through Docker.
Yeah.
So, the, so I'm, I'm just going to cheat and look at the repo here.
So, you, when you, so the instructions are to, CD into bash dungeon and then do an LS, then CD into enter and then LS and then cat for parchment, cat the parchment.
So you're reading the parchment.
So yeah, let's follow it a little bit.
So I'm going to go in to go into enter and there's a parchment.
And then when you do a cat, you cat is how to like read a text file or just print the whole thing on your screen.
So it has this little parchment with like, Oh, here's what you should do.
You could use LS and, and, it recommends doing LS dash F, to try to teach you about that.
Um, and then when you, you, you look, look around right away and the only thing you've got is a corridor.
So if you CD into the corridor, then there's a couple more parchments that you can read.
Um, there's a spell you can cast that the spell is a spell, a hint that says, Hey, you can use head dash end one to look at a file.
See at the top.
And if it happens to be a script, it might be runnable with a warning that in this, this repository, you can trust it, but you should not just run random scripts that you find.
Um, good warning.
Um, but then if you cast this, if the, there's a chest that has a cast and then it always, it talk teaches a bunch of different things.
Uh, one of the cool things I, I like it.
Oh, what was that?
Is the file, file spell, which, will tell you what kind of, what type of file it is.
Actually, I totally forgot about file.
So, that's why I think this is fun.
It's if you've ever done dungeon crawler type games, this is kind of a neat way to brush up on, on your bash skills and, or, or learn them in a new, if you've, if you're a new to bash.
And it's kind of, it's kind of a fun way to, to present this information.
So it's actually super fun.
And since I've been doing a lot with Docker, I just literally hit copy and paste.
And within about like 15 seconds of seeing it could run in Docker, I was already like corridor.
It's insane.
So fun.
There's some, some cool stuff like the chest, for instance.
So in this first chamber, there's nothing there or the, the corridor, there's nothing until you, open the chest and it tell the LP, it says,
find an amulet of color and that it, to use it, attach it to your torch with --color equals always.
So basically it's telling you to do color with your LS and teaches about it.
This is.
Yeah.
And then hidden.
So that's what's printing out, but hidden.
There's a spoiler alert.
It's going to move a hidden directory to non hidden.
So our first chamber was dot moves it to.
Yeah.
So I love it.
I love it.
Yeah.
Mark out in the audience wonders if at the end, they'll give you tree as a map spell.
I love it.
Oh, I bet.
Mark has played some muds.
It's a multi-user dungeon.
I used to play.
I used to play some, spend a lot of time over there.
And this reminds me of that a little bit and it's making me smile.
Yeah.
Let's go shadow's edge.
I've never done multi-user dungeons, but I totally was doing lots of dungeons back in my,
uh, TRS 80 days.
So.
Yeah.
I remember the dial up.
You'd be like, oh yeah.
You'd hear maybe like a 30, 32 K, 36 K connection.
Oh, that's going to be a good day.
None of that 9,600 business.
I won't be able to read the texts that's coming down.
Yeah.
I love that stuff.
Yeah.
Anyway.
Yeah.
This is actually really, really cool.
Really cute.
Um, all right.
Those are our items.
Um, I want to remind everybody that, that we are sponsored this week by ourselves.
So, please, if you enjoyed the show, check out, start with this pie test
stuff.
No, check out, Michael's, Talk Python Training.
Um, if you, if you go to python test.com, there's, pie test trainings as well.
And you can have links to my pie test book.
Um, a new, new, new shorter pie test training coming up soon, but, all sorts of, there's
always exciting new, courses on Talk Python Training.
So check that out.
So.
Yeah.
Indeed.
Thanks.
Yeah.
Check them all out.
Do you have any links to that stuff?
I do.
And links to all those things you mentioned are at the top of the show notes.
Yeah.
Uh, yes.
So how about some drama that we always love some drama, right?
Yeah.
So David, the data script author, over on Fostadon, Mastodon happens to be on Fostadon.
She sent us, sent us a post.
I mentioned said, Hey, thoughts.
And the thoughts are on a discuss over on python.org that says, py simple GUI now requires
a paid license opinions.
So there's this project called py simple GUI and I actually invited them to be on talk Python,
but they never got back to me.
So I guess I'm feeling better about that.
Anyway, the, the post says, a rather popular GUI package.
It's like a real simple way to specify like a quick way to specify a simple GUI in Python.
Yeah.
Recently changed this policy now requires a paid license to go forward.
You're doing the hobby stuff.
You can use it for free, but if it's commercial, you got to pay for it.
I don't know a whole lot of the details about it, but went so far as to go back and remove
the older commits that had the older codes.
You can't even roll back the repository to the code.
Anyway, it's, it's interesting.
And I think it's just, if you're thinking about an open source project, you're thinking
about maybe charging for it.
I'm certainly not against that.
Like you put in a lot of effort.
It's your project.
If that's what you want to do to try to make a living from it and put more energy into it.
Fine.
I think the, the frustration here is that it, it was open source.
It got a bunch of contributions from other people.
And then it got switched to switched to commercial out of the blue with all those old commits getting
blown away.
And stuff.
So anyway, people have thoughts.
They can check out this conversation.
That's interesting.
Yeah.
Also just two other really quick things here is the, the code in a castle in Tuscany thing
still has some, some spots available.
So people can check that out.
If they want to learn Python, FastAPI, basically build a high performance web app in Python,
using some database stuff and Pydantic and all sorts of fun things and do load testing,
but do that in the first half of the day.
And the second half of the day, go to vineyards and other excursions in Tuscany with me and a bunch of other,
I thought enthusiasts, check that out.
And I just realized as we were talking, as I was talking about that Mario thing is real similar to shiny for Python as well,
which is also one of these reactive web dashboards.
So we have a 100% free, no strings attached reactive web dashboards with shiny course you can check out over at talk Python.
So people can check that out in the show notes.
And yeah, like I said, it's free.
So if it sounds interesting, give it a try.
How about you?
A few extras.
Last week we mentioned Python 3.13 beta 3.
Now Python 3.13 beta 4 is out, came out a couple of days after we talked about 3.
But this is the beta 4 is the final beta, last chance for bug fixes.
So please, if you have a package that should be tested against new Pythons,
which means if you have an open source package, Python package, you should go test it.
Test it against 3.13.
Make sure that it works.
So there's that.
Also, when I was there, there was a pop-up that I closed talking about new guidelines.
So there's, I think these are new,
but there's, if you want to hang out on discuss.python.org,
please check out the community guidelines.
These are some pretty easy to read, pretty standard stuff.
And if you're thinking, why do we need new community guidelines?
Or why are we emphasizing this?
There's a, there was some drama in the Python world a little bit a couple weeks ago.
And there's an article called inclusive communications expectations in Python spaces put out by the,
the steering council.
I think that's who put that.
Yeah.
The steering council does not endorse bad behavior, essentially.
So a decent read.
So if you want to talk about, look about how to be a good citizen in Python, check this out.
Last thing I wanted to bring up is we've talked about security in, in web browsers and stuff before.
And there was some news I noticed on Forbes the other day.
Google confirms bad news for 3 billion Chrome users.
What's the bad news?
They had, they were trying to do, do I like for four years or something like that,
talking about killing, tracking cookies, but they're not going to kill those anymore.
That, that effort has stopped.
A quick summary.
Maybe, maybe there's more details here.
Sure.
But yeah, it's a, it's just, I don't think, I don't think it's going anywhere.
Chrome likes to make, I love it.
So actually I think the title is, is, you know, 180 degrees.
Wrong.
I think this is good news for Chrome users and for people on the internet.
All right.
Because the alternative was our web browsers will have baked in fracking that is part of
the execution of your environment, that it tracks you and has an ad engine that lets it
think about you and then apply these for, and with, with third-party cookies, we have tools
that are not in control of Google or Chrome that will basically neutralize the vast majority
of them.
Right.
Nextiness, I whole ad blockers, Vivaldi or others, you know, other things that are more
private focused browsers.
And yeah, to me, I think we've talked about this before, Brian, we even talked about it
before we hit record.
I think there's a fundamentally wrong assumption or an axiom of what Google believes the internet
should be.
I think Google believes the internet should be, it must be that you can track people on
the internet.
Let's do that in a nice way.
Like, no.
I know neither of us think that the first assumption should be, of course, you have to track people.
How can we do that nicely?
Like, wait, why do we have to, of course, you have to be able to track people?
No, you don't.
You can have ads based on the content of the site, for example, you know, or the content
of the article.
It doesn't have to be Michael viewed this thing, then that thing, then that thing.
And so now, now we're going to sell him shoes while he's trying to find hardware supplies
or who knows whatever, right?
Yeah.
I mean, we already have, like, even without, I've done a little bit of work on, I know you
have too, about how do you do, like, could you do targeted ads without tracking?
And of course you can.
There's, based on, I don't know how it does it, but based on the IP address or whatever,
that's a little creepy, but basically even regions, you can find out.
But essentially, like, based on the content, but also based on, like, you know, what country
is the person in?
I'm okay with people knowing what country I live in or, you know, which part of the country
even, so that, you know, maybe there's a festival in Oregon that I might want to see.
Throw me in there for that.
That's fine.
But, like, you don't need to track my personal stuff.
No.
Anyway.
Yep.
Indeed, indeed.
Real, real quick, real-time follow-up.
Mark also says, Ari, I said, well, GUI, it wasn't exactly open source.
It was more source open before this change.
The project had a warning that it does not accept user-submitted code nor user-submitted
documentation.
So it was more source open anyway.
And with that.
Don't.
Yeah, exactly.
I want to help.
Yeah, no.
All right.
I want to go over to something funny.
I sure do.
Okay.
I got a few things.
Anyway.
So let's go to, there was a, I got this from, who did I get this from?
VMBresser posted this on Mastodon, so I saw it.
So this is a SMBC, Saturday morning breakfast cereal cartoon.
There's a lot of text here.
So, you know, bear with me.
A woman looking at, looks like a, I don't know, desk with a microphone.
Maybe she's being, anyway.
It looks almost like a court situation.
Kind of.
And she says, ladies and gentlemen of Congress.
Oh, she's speaking to Congress.
Ladies and gentlemen of Congress, I have bad economic news.
Historically, it has been very hard to measure whether or not our economy offers many good
investment opportunities.
However, new methods have been discovered.
Economists can now determine how many good opportunities exist by seeing how much money we
can raise for transparently idiotic startups.
This is actually a decent idea.
And one of the congresspersons says, how bad is it?
She says, well, as of this morning, I myself secured $40 million in Series A funding for
this balloon, which I have written AI on it with a Sharpie.
Amazing.
Wow, wow, wow.
Amazing.
When is the Series B?
And may God have mercy on us all.
I think that's a positive indicator, although it could be the sign of an impending crash.
But there's so many businesses that are basically rappers around ChatGPT.
And they're like, we're revolutionizing the world.
If not, you're just...
Until the API changes.
Yeah.
Or the cost changes.
Or it's $19.99 all over again.
Yeah.
Cue the Prince and Will Smith songs.
The last thing I wanted to bring up was PyJokes.
PyJokes has...
We've used jokes from PyJokes before.
Last release was in 2019, but there was just a new release this month.
Woo!
Go back and install PyJokes.
Let's go.
So PyJokes, you can just pip install it and you can run PyJokes.
I pulled out a few that I liked.
If at first you don't succeed, call it version 1.0.
Actually, that'll be 0.5.
Anyway.
Yeah, yeah, yeah.
Okay.
I'll skip one.
Oh, that's pretty good though.
A product manager walks into a bar, asks for a drink.
The bartender says no, but he'll consider adding it later.
Okay.
The last one.
Triumphantly, Beth removed Python 2.7 from her server in the year 2030.
Finally, she said with glee, only to see the announcement for Python 4.4.1.
No.
Although, yeah, so 2030, if we went to Calver, that would just be Python 330.
See, Calver's nice.
Yes, it is nice.
Yeah, you could understand.
Yeah, I do think it's good that it links more clearly back to the year.
Like how long ago?
Oh, that was that.
That's right.
Yeah.
Like what will we be in 2030 now?
We'd have to do six plus whatever it is.
Yeah, it's difficult.
Yeah.
Anyway.
So, well, one more Python bytes in the bag.
Thanks, Michael, for a wonderful time.
Yeah.
Thanks as always.
Lots of fun.
All right.
And thank you to everyone for listening.
See y'all later.