Python Bytes - #305 Decorators need love too
Episode Date: October 13, 2022Topics covered in this episode: Pyscript 2022.09.1 is out Decorator shortcuts Panel (of Holoviz) on Pyscript auto-walrus Extras Joke See the full show notes for this episode on the website at py...thonbytes.fm/305
Transcript
Discussion (0)
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 305, recorded October 10, 2022, and I am Brian Ocken.
I'm Michael Kennedy.
We got a whole bunch of stuff that's great.
We also want to thank Microsoft for Startups, Founders Hub, for sponsoring this episode.
We'll hear more about them later.
But do you want to start us off with something exciting?
Let's kick it off. I have a theme this week, Brian.
Okay.
Before we get to it, if my voice sounds a little bit scratchy, I just want to apologize.
It's not that I'm sick.
It's that I was rocking out to the Scorpions last night.
They were here in Portland.
And even if they're 70, they still rock.
It was amazing.
I don't know how old they are, but they probably are up there.
I don't know.
Maybe being sick may have been a better excuse.
Yeah, maybe. All right. I do have a theme, being sick may have been a better excuse. Yeah, maybe.
All right.
I do have a theme, though, for the week, and let's kick it off with that theme.
This first one, both of these are recommendations.
The first one came to us from Matt Kramer.
Thank you for that.
And Jeff Glass, remember last time I said they announced PyScript?
That is Python compiled to WebAssembly running on top of PyIodide and Wasm in the browser, which is amazing.
So many cool things and so much potential there.
I pointed out that that was released and there were some breaking changes.
And it was like last minute that I got that.
So I just threw it in as an extra.
But now I had a chance to look at it.
So there's a bunch of changes.
And I just want to
highlight some of the things for people. So they're using semantic versioning and I don't
fully understand this. I guess it's just like month based, right? So it's 2022.09.1. That doesn't
mean September 1st, that was released on September 30th. So about 11 days ago, 10 days ago. And they just reiterate,
this project is undergoing lots of changes.
It's in its super early stages.
The calendar versioning doesn't really indicate
that it's like 0.1 or whatever type of level,
but there's a lot of breaking changes.
So if you've worked with it before,
just you want to read through this
and figure out where things
are going. It doesn't look like anything's majorly broken in like you've got to rewrite a ton of
stuff, but it also, there are parts that will stop working, but they seem pretty easy fix.
So first of all, like many Python programs, you need to express your dependencies. You would do
that through a pyproject.toml or requirements.txt unless you're on the web running the browser, then nope, you don't do that. Instead, what you would
do is you'd use this py-env section to express, I depend on these packages, either just a URL to a
wheel, a Python wheel, or something that could be pip installed using micro pip. That's gone.
It's now deprecated and will be taken away. So now that's folded into the
pyconfig section. And there's a way to say packages are a list of packages and files that we're
using is a list of paths. And it's in these kind of places where you indicate what Python files
you might write and import. Because while you can write Python in HTML, just like JavaScript, you should
do that very sparingly and you shouldn't just write your, you know, a thousand lines of Python
like inline. That's not a great idea. So you would link over to a set of Python files that you can
run one of them and import others from that. All right. So PyENV going away, fold it into PyConfig.
This is one of the things that's easy to fix, but like I said, will stop working. They've also changed the syntax of some events. So you might have seen people on
HTML elements like a paragraph or a div or a button, say mouse over equals in some JavaScript
function name, like a function call, either inline function or a function you've written. In PyScript, there's a py dash event. So there's a
py dash mouse over and a py dash click type of thing. And in here, you can just write arbitrary
Python. And unlike JavaScript, you can actually write arbitrary Python, separate multi-line
Python separated by semicolons. Look at that. Semicolons, they made it to Python.
You can write arbitrary Python.
It doesn't have to be a single function call.
Pretty cool, right?
It is pretty cool.
Python's starting to turn into JavaScript
that is changing all the time.
Exactly.
Well, that's why the breaking changes.
No, just kidding.
That's the new project,
but don't let it become JavaScript.
I'm very excited that maybe it could
supplant JavaScript to some degree.
There's some stuff about HTML escaping.
So you could do like print a string and that will show up in the browser sometimes, or
you can get it to go to the console.
But if you put like one is less than two and that shows up in the browser, you know, that
might get interpreted as an opening bracket
instead of just a less than symbol.
All right, so there's some fixes there,
some stuff for logging.
The ability to run multiple runtimes.
So when people usually do PyScript,
they point at just a CDN version of PyScript,
which points at a CDN version of Pyodide.
But you can, and easily can do,
you can like download that,
customize it and put it in your static files
and run it out of there.
You could possibly not even use Pyodide itself.
You could use say like MicroPython potentially,
or you could actually have maybe different versions
of Pyodide running in different sections of your site,
if you want it. So different PyScript blocks, presumably even on the same page.
So a lot of flexibility about managing multiple runtimes. Let's see a few other things. There's
also some major releases of Pyodide that's coming along. And because it's built on top of Pyodide,
it runs on top of Pyodide, PyScript does, obviously the changes there are super important.
So some of the changes are that they broke,
it used to be kind of like one huge namespace
and they broke that up into a bunch of pieces.
So you got to know about that.
But probably the most relevant for people is
you used to have to do this thing
where you would import from JavaScript some event
and do like a proxy type thing to like hook an event,
which wasn't terrible, but it was kind of like, well, are you still doing Python? I don't know.
Right. So they've written a bunch of event handlers or event sources in Pyodide FFI.wrappers.
So like add event listener, remove event listener, set timeout, set interval, clear interval.
And so now you can just import, say like add event listener, haveout set interval clear interval and so now you can just
import say like add event listener have a function python function and then you just say add event
listener on a tag on an event and here's your python function that's awesome right that is
awesome yeah yeah so they've they've added these event handler sources that are straight python and
not uh interoperating with uh javascript directly. There's a bunch of things behind
the scenes that will make it better, like that we don't necessarily as users care about, but like
in Scriptin is getting better. They've got a whole testing scheme. You might be interested in this,
Brian, for your show. They do integration tests with PyWrite. They do TypeScript tests because a
lot of the interaction bits are in TypeScript and They do that with Jest. And then Python, the Python code gets tested
with PyTest. That's an interesting mix, huh? I guess just to point out
we said PyWrite, it's PlayWrite.
I'm sorry, I'm too much on the Py right now. Yes, PlayWrite. Thank you for keeping me honest.
Yeah, but I'll do a famous pull request on them to try
to get that PyTest case all lowercase.
That'd be good.
Yeah, I'm not even going to use this project until that gets fixed.
So some stuff on infrastructure.
There's new CI things that they're working on to make it better.
They're using type annotations, and they're trying to synchronize TypeScript and PyScript type annotations and they're trying to synchronize type script and py scripts type
annotations to kind of keep the end to end across javascript across python accurate and a bunch of
stuff that's coming uh in particular a lot of rethinking how async works because javascript is
already like super asynchronous but it just has one loop and if you hook your async python into
that and like is it really async?
I don't know.
It's a little bit complicated.
You can check out what they said there.
But otherwise, very exciting stuff.
And if you're doing PyScript,
definitely check this out
because it's going to affect you.
Yeah, that's cool.
Well, let's give your voice a little bit of a break.
Yeah, I mean, too much Rocky like a hurricane
stuff going on.
Yeah.
Well, I want to talk about decorators a little bit.
So I was actually on a, I sat in on a Boston,
the Python Boston meetup group.
They're still, it's kind of neat.
They're still doing online.
So it's not really Boston.
It's anybody can jump in and have fun there.
But we're talking about Py test and the um and ned
bachelder was there and talking about coverage also and he was showing us some of the test code
it was kind of it was really fun because he was showing us some of the test code within the
coverage uh the test code that tests coverage by that coverage And, um, and he was showing some things that,
that, and then, uh, about using a decorator shortcuts. And then, um, I was like, that's
really cool. I, I, I always forget to do that. And so he wrote up this, um, I don't know if it's
just for me, but he wrote up a blog post called decorator shortcuts and, especially i mean i guess for a lot of stuff we use decorators
a lot in python now and uh in pi test also um uses a lot of uh decorators things like um uh
pi test mark parameterizer pi test mark skip or x fail those are all um decorators built in
part of pi test and so that the um the thing he wanted to show us is like, as an example,
he's got some tests that have to,
that are either skipped or X-failed on certain Python versions.
So he's got a way to test a piece of code that only works on,
say, like it doesn't work on PyPy,
or it doesn't work on like Python 3.8 or before or
something like that. And, um, and so he, he has these, uh, fairly complex, like a version, like a
X fail, uh, decorator sequences, um, that he, uh, he can take. And instead of saying, um, and let's
say he's actually filed, maybe there's an issue.
He's actually filed an issue against PyPi, for instance.
But his tests are still failing.
He had an example where instead of just this whole big X fail blob with checking the environment version and having a reason and a link to the defect. He just shortcutted that to just like a single variable name
or single name that says XFail PyPy 3749 as an example,
just a single thing.
And then when you're using it, instead of this whole big blob,
you can just write at XFail.
Instead of saying PyTest mark XFail, you can just write at X fail instead of like X fail.
Instead of saying like by test mark X fail,
you can have this specific X fail and then you get the,
the reason printout and everything. Now this is clever. Yeah.
Especially I like it for this as there's we were talking about how we don't
like to leave X fails in for a long time,
but sometimes you're dependent on a different,
different piece of software that you're not
one of the maintainers, in which case, what do you do with the failing test? One of the things you
can do is you can X fail it and link it to a defect report so you can keep watch of it. But
yeah, having a way to just mark different tests with the same thing, It's pretty cool. And then this really kind of relates
to really a lot of things.
There's a lot of places where we use long,
long complex decorators that you can just assign
to a variable and then use it later.
Yeah, to put this decorator on a test function,
you have to have, you specify a whole bunch
of conditionals around the version,
and then the reason is a big, long string.
And if that's affecting 10 tests, you put that on 10 tests, it's all over the place. You know, one of the things that you hear from people sometimes is like, well, I don't like unit testing because it's hard to maintain. into like this sort of this mode where when they're writing test code they forget about things
like trying to isolate change to one place and you would never write the same code 10 times in a real
part of your app why should you write it 10 times duplicate in a test right well it's hard to
maintain well be hard to maintain if you did that in your regular code too just you don't do it
there so don't do it here this is a cool technique to accomplish that yeah yeah definitely and this and this is this part of it isn't um it's also great because it's
consistent it keeps it'd be terrible if you were you know referencing this issue in three different
places but only sometimes including the link and uh you know yeah having some consistency is good. So, and there was some concerns,
Larry Hastings put up a concern about possibly not doing this for code that
can, that is,
that generates a single use object like a iterator or something like that.
But just don't do that.
But Larry has a workaround if you you can do it
a different way if you have something that um acts like that so i see interesting yeah there's a lot
of um turtles all the way down like decorators of functions that return functions and so what we do
is wrap that in a function to to alleviate the capture the closure closure. Yeah, it's fun. But anyway.
Cool.
Excellent stuff.
Yeah, next up, our sponsor. Yeah, we have a sponsor.
Our sponsor this week is Microsoft for Startups,
a founder's hub.
So Microsoft for Startups founder's hub
provides all founders at any stage
with free resources to help solve startup challenges.
The platform provides technology benefits, access to expert guidance and skilled resources,
mentorship, networking connections, and a whole bunch more.
And unlike others in the industry, Microsoft for Startup Founders Hubs does not require
the startup to be investor backed or third party validated or able to relocate to San
Francisco for a short time.
So Founders Hub is truly open to all.
So what do you get?
You get free access to GitHub and Microsoft Cloud with the ability to unlock credits over time.
They've also partnered with other companies like OpenAI to provide services and discounts.
And Microsoft, through the Microsoft for Startup startup founders hub, becoming a founder is
no longer about who, you know, you'll have access to their mentorship network, giving you access to
a pool of hundreds of mentors across a range of disciplines across areas like idea validation,
fundraising, management, coaching, sales, marketing, maybe even testing. Who knows?
You'll be able to book a one-on-one meeting with the mentors,
many of whom are former founders themselves. So make your ideas a reality today with the
critical support you'll get from Microsoft for Startups Founders Hub. And to join or just check
it out, visit pythonbytes.fm slash Founders Hub 2022. The link is in the show notes. And I know you can find this stuff on your own with
Google or something, but if you go through our link, it helps them know that you heard about
them here. So thanks. Yeah. Thanks Microsoft for supporting the show. Brian, before we move on,
audience feedback from Henry Schreiner. For that exact example, talking about PyTest and decorators,
I'm not fond of making the test directory importable unless
I have to a mark might
be better what do you think a mark
might be better I mean they are marks
so the marks are decorators
yeah okay cool
what is next
another
continuation of my theme here
so Mark Madsen sent
over a recommendation to talk about this
unrelated to the previous announcement, only in timing or origin. So Panel, people probably have
heard of HoloVis, and Panel is related to that project. It's an open source Python library.
It's all as you create custom interactive web apps and dashboards by connecting
widgets, plots, images. So people have heard of Streamlit, they've heard of H2O Wave, they've
heard of Plotly Dash. It's like in that category, right? So you can put together a lot of interactive
fun pieces. So for example, here, if you go to the main website for panel, you can see that there's
like this graph as you hover over it, it's very interactive, but you if you go to the main website for panel, you can see that there's like this graph.
As you hover over it, it's very interactive,
but you also have widgets to let you re-evaluate
how you compare all these things
and just play with it live, right?
Kind of like it's a notebook, but it's not.
That's neat, right?
Yeah.
So traditionally, this has run in Jupyter notebooks,
or you can run it on like with the Flask backend type of thing.
You can host it on your own server.
The news is not that.
This has been around for a while.
The news is that HANL now comes to Wasm via Pyodide and has PyScript integration.
That's pretty awesome.
That is pretty cool.
So in order to host it before, you have to either have a running notebook server,
or you had to set up your own separate web server and maintain that thing.
And all that goes with,
and now you can just put a little py-config in there
and boom, when they interact with your data
and they run it, it just happens client side.
No servers needed.
So let's talk about some of the things here.
You can automatically convert panel applications
to a Pyodide version, a couple of flavors,
reasons I'll explain in a minute,
or you can convert to a PyScript-based app,
which is pretty epic.
So like you could embed a panel
inside your Sphinx documentation,
just as some HTML, which is pretty nuts.
So there's this convert command,
panel space convert on the CLI,
and you can tell it the to format
from your regular panel code
to convert it to a Pyodide.
This one is good if you want to have a single HTML file
that you say, here's my HTML file, off it goes.
It's just no dependencies, and then it runs there.
That's not as good as creating a Pyodide worker, which creates a JavaScript and HTML file that you got
to serve over more of a server. Or you can even output a PyScript version where you can write
additional PyScript code. It's pretty epic. And here you can see a little example. This looks
like standard XGBoost SKLearn code right here.
It does all its things.
Except for the end, you just say pn.column.
And here's your output right there.
And you put your little pipeline you created
and maybe a head of a data frame to show up.
And there it goes.
So in order to run this,
you would say panel convert the script to a Pyodide worker, output Pyodide. Then you just run a server locally so that you
can get to it. You can pull in the JavaScript, open it up and you get something that looks like
this. That's super interactive. There you have machine learning in the browser. That simple.
That's pretty cool.
The browsers, JavaScript will take over the world. It'll like get smart and then take off.
So a couple of cool tips and tricks they recommend
is you can do dash dash auto reload.
So if you make changes to the file,
it'll auto reload the browser.
So just as you edit,
you can also add a panel dot convert dash dash watch.
So if the source files change,
it'll regenerate the script
and then the script will get reloaded.
So like you can chain those together, I believe.
But then there's a section on formats
that actually describes
what is the point of the different outputs,
like PyDive versus PyDive Worker.
So the Worker one,
it says it generates an HTML file
and JavaScript that runs better.
This is the most, in a separate thread,
this is the most performant option,
but it has to be running out of a server
instead of just a file.
Worth noting here,
PyScript generates an HTML file
leveraging PyScript,
produces standalone HTML files
containing PyENV and PyScript tags
with the dependencies.
It's basically a PyScript
variant of the Pyodide one.
Well, guess what?
This might need a little update
coming soon. PyDashDNV is not there anymore, so they can check that out. I'm sure they're on top
of it. Yeah. Final thing to note here that's pretty dope is progressive web apps. So this comes with
a dash dash PWA option, which turns your, I'm pretty sure this is going to require the PowerDyed
worker variant because you need these worker things for progressive web apps.
But this means that you can install your app into, say, an iPad or install it like a desktop
app and run it with cached offline data.
So for example, let's see if i go to youtube here i signed in
no good so like in vivaldi i can right click on this and it'll say install youtube there so if
you did that option for your panel app you could right click and say install panel and you might
think oh well that's silly like who cares about that let's see if this this let me do it though
here oh this is live if you
go to a lot of these just need some video i don't really care where it is a lot of these you can come
in and actually click download i guess you got to be signed in but if if you're like a premium
account or whatever you can click download and that's only possible for youtube installed as a
pwa because i think a lot of people feel like oh it just gives me an icon on my home page but like
there's actually different behaviors.
So you can get offline videos on the PWA YouTube, whereas the web one, you can't and so on.
So anyway, that's the kind of benefits you would get if you would do your panels at PWA,
which is just a command line option.
Interesting.
Cool.
Anyway, people check it out if they're interested in building dashboards, they're interested
in PyScript and running in the browser using WebAssembly,
here's a pretty awesome option.
Thanks, Mark, for sending this in.
Yeah, thanks a lot.
Did you know that Python 3.11 is coming right up?
It's got to be soon.
It's October.
There's not that much October left.
Yeah, but it was 3.8 when we got the Walrus operator.
Do you realize it's been that long?
It seems like the Walrus operator is still new, but that's a long time, yeah.
Yeah, so...
It's like an adolescent Walrus now, not even a baby Walrus.
Yeah, exactly.
So I think it's time for people to embrace the Walrus.
And so one of the things you can do is you can install Marco Gorelli's auto
walrus and it'll convert your code for you in places where you really should have used the
walrus operator. So, and this is good for your support if you're supporting three, eight and
above. And golly, I hope you're already up to three, nine or three 10 by now. So there's a,
this auto walrus.
I checked it out.
It's pretty, it's pretty simple.
It, it can run as a pre-commit hook too.
So that, which is nice, but you can, you can run it on the command line, which that's what
I did when I tried it.
You pip install auto dash walrus.
So it's one word, but with a dash in the middle. And, uh, and then you have this application,
you can run it on a file. And, um, and like you said, you can run it as a pre-commit hook as well,
and it'll run on everything, but you can, um, and it just converts stuff. So if you have things like,
uh, here's a simple example of N equals 10. And then if N is greater than three, uh, do something.
Um, and that converts, uh, the auto walrus will convert that to the walrus operator of if, you know,
in colon equal 10 is greater than three.
So and I kind of like this being separate from other tools because some people just
honestly haven't been haven't came on board with this already uh you know embrace the walrus sort of thing
but it's a fun way to just try it out on your code and do a diff uh get diff and see what it
changed and maybe you like it maybe it's a thing to do as a as a like a group code review thing to
just talk to your team and find out if you want to change it this way or not um yeah and then this
reminded me of something.
I'm like, we had something like this before, right?
And back in episode 82, wow, that was in 2018,
we talked about Anthony Sotili's Pi upgrade.
So, and that's, it's been a while.
So that's like four years ago so i went and took
a look again and i would like people to try to check out pyupgrade too because there's a whole
it's it's moved on so it's not just we we recommended pyupgrade for things like upgrading
to from two to three sort of thing was that back in the controversial legacy Python days? Yeah. So there's, and there's always times to go and revisit old scripts and old applications
that you're still maintaining and going, well, we don't really want to support the old Python,
but our code sort of looks like the old Python.
So let's take a look at some of this stuff.
And it'll do things like, you know, the set literal, some of the old things and doing comprehensions for you and better comprehensions are cleaner looking.
But there's also like different print styles.
But one of the things I wanted to point out is if you go to the readme, you got to scroll all the way down or at least halfway down and you get things like the 3.6 plus.
So there's these plus options. Um, so you can say if,
if you're running three, six or above, uh, run that,
but you also want to do like,
let's just go all the way down to like three, seven plus. Um,
and there was a kind of a new way to run sub process for instance,
but you're, I mean,
and it just finds some of these things and just changes it for you.
So it's kind of cool. And some of the things you may, I mean, and it just finds some of these things and just changes it for you. So it's kind of cool.
And some of the things you may not have remembered, um, uh, the three in three, eight plus, uh, the LRU cache, you used to have to do the, uh, LRU cache and call it as a function for
your, uh, for your decorator, but now you don't have to do the prins.
So, um, just some, some cleanup like that.
It's just nice.
Um, I, I, I try to run this every once in a while.
And yeah, I guess public service announcement
for this cool little project.
That is a cool project.
And going through this huge long readme
and looking at like as it gets later and later
Python versions, it's kind of like,
here's just a bunch of examples
of how Python has changed over the last few years.
Yeah.
Ooh, neat. It has like 604 type rewrites. here's just a bunch of examples of how Python has changed over the last few years. Yeah.
Ooh, neat.
It has like 604 type rewrites.
It'll rewrite the union operator to the bar operator.
That's in 3.10 plus.
That's nice.
Yeah.
Well, we got 3.11 plus coming soon.
Yeah.
Yeah, that'll be fun.
Awesome.
Well, that's our items, right?
Got any extras?
You know, I was going to have an extra,
but I'm going to save that for later.
So no, I don't.
Do you have any extras?
No extras, but I have a joke.
I do a quick follow-up to this though.
This is a hint of what's coming next week.
I'm going to talk, I think it's next week.
I'm going to cover this.
Refurb.
Have you seen Refurb? I don't think so. Refurb is is a similar one that like we'll go through and give you recommendations of here's
the most modern way to do your thing so like if you said you know if value is in bracket xyz it's
like you know it's a little less efficient than like why make a mutable list when you could make
it a tuple it's a little more efficient just to create the tuple. So if value is in parenthesis, it'll suggest you change the parenthesis or
suggest using some path lib operations instead of with open operations. Like instead of a context
manager with open, do a bunch of stuff. You can just do path of thing dot retext. You don't need
to do the context manager, just bam, there it is. A bunch of cool
stuff like that. So anyway, that one more. And then also Flint, I've talked about Flint. I love
Flint. Super straightforward. It brings one of the most beloved things you can do for upgrading
your Python is convert all your variations of string formatting to F strings, just across the
whole directory of Python files. Cool. A lot of different things to be running together, but are you ready for our joke?
I am.
You had the, uh, the comment about bring back the walrus or something.
I feel like that could be a cool t-shirt, right?
Yeah.
Yeah, absolutely.
So I came across this place a little while ago.
I don't have any particular one to recommend here, but this place that has like funny, geeky t-shirts.
So I thought I'd just pull a couple of these up and see what you think about them.
So some of them are good.
I like the first one, the Mordor.
The Mordor fun run.
One does not simply walk into Middle Earth.
You have some for our data science friends out there.
It has a graph of two
things that are very similar one is uh shark attacks the other is ice cream cone sales and
it says correlation does not imply causation apparently ice cream sales and shark attacks
are of course they're closely correlated because it's warm you go in the water. It probably doesn't cause shark attacks. It might. It might. If you are more into
math, you have the distance Raptor divided by time Raptors, the Velociraptor. But there's some
really good programming ones in here as well. Like this one, for example, check this out.
Go outside. The graphics are amazing. And the picture of the shirt is like a super low bit rate, like graphics. Here's a good one. Some, some lab person pouring like
beakers of clearly poisonous green stuff. It says, forget lab safety. I want superpowers.
Oh boy. What about the, what do you think of this one, Brian here, the forecast for Alderaan.
So remember Alderaan is the,
the home of princess Leia that was blown up by the death star and star Wars.
And it says five day forecast Alderaan Monday,
72 and cloudy Tuesday,
74 Wednesday,
15,000 degrees.
No Thursday or Friday.
Kind of mean,
but it's also kind of awesome yeah
yeah this is me but you see if I can find one more um one more programming one oh yeah let's see
oh here's some here's some good ones um one it has a floppy disk. It says, kids today have no idea what this is.
And then this one here, Brian, this is the last one.
It's somebody holding a CD going into a drive, and it just says, never forget.
Never forget the CDs.
Yeah, CD drive.
I still love that old joke of a person calls into IT help desk and says, I need some help because my cup holder is broken.
Yeah, just went in and spilled
this drink all over me? Come on, man.
You guys got to get this thing fixed.
Yeah, so you could spend a lot of time
on this page. I'm not necessarily suggesting
you get a shirt here or anything, but
it's pretty awesome.
Well, it makes me miss ThinkGeek. ThinkGeek should have never
folded, but we have other people coming up with good
humorous shirts, so that's good. Yeah. Houston, we have dibs.
Putting a flag on the moon.
Dibs on the moon. Got it.
So a more serious um a couple quick to follow up here marco garelli
from the the project that you talked about the autoaurus it says yeah i love pi upgrade and
will mcgougan hey guys uh we could use the was it pi upgrade on because rich is dropping support
for three six so just clean it up yeah and then i want to follow
up with the with the the the uh the first thing i was talking about um about the decorators so
henry schreiner said um uh i think i got the wrong one but for that exact example i'm not
fond of making the test directory importable unless i have, a mark might be better. And, um, and I guess I brushed that off
too quickly. I think I, I still not sure how, how I would use this. If I were to, if I were to put a
bunch of these, like if I had a project wide, um, decorators that I wanted to use, uh, I don't know
what the best way to do that would be. It might be a non-test file that I would import. Um, I'll
have to play with it. So, uh So thanks for Henry for bringing that up.
I'm not quite sure how to deal with that problem.
Indeed.
All right.
Well, should we call it a week?
Let's call it.
All right.
Thanks everybody for showing up.
We'll talk to you next week.
Bye everyone.