Python Bytes - #305 Decorators need love too

Episode Date: October 13, 2022

Topics 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)
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 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.
Starting point is 00:00:26 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.
Starting point is 00:00:41 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.
Starting point is 00:00:57 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.
Starting point is 00:01:24 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,
Starting point is 00:01:57 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
Starting point is 00:02:29 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
Starting point is 00:03:15 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.
Starting point is 00:04:07 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.
Starting point is 00:04:18 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
Starting point is 00:04:42 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.
Starting point is 00:05:03 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,
Starting point is 00:05:27 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.
Starting point is 00:05:54 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
Starting point is 00:06:25 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
Starting point is 00:07:08 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.
Starting point is 00:07:36 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.
Starting point is 00:08:07 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
Starting point is 00:08:21 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.
Starting point is 00:08:39 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
Starting point is 00:09:25 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
Starting point is 00:10:07 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.
Starting point is 00:10:57 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,
Starting point is 00:11:20 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
Starting point is 00:11:54 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
Starting point is 00:12:37 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.
Starting point is 00:13:24 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,
Starting point is 00:13:56 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
Starting point is 00:14:24 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,
Starting point is 00:14:57 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,
Starting point is 00:15:43 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
Starting point is 00:15:59 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
Starting point is 00:16:38 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?
Starting point is 00:16:56 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.
Starting point is 00:17:20 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.
Starting point is 00:17:39 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,
Starting point is 00:17:59 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.
Starting point is 00:18:22 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.
Starting point is 00:18:55 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.
Starting point is 00:19:22 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,
Starting point is 00:19:43 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,
Starting point is 00:19:58 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
Starting point is 00:20:12 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
Starting point is 00:20:25 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
Starting point is 00:21:13 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.
Starting point is 00:21:45 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.
Starting point is 00:22:08 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?
Starting point is 00:22:25 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
Starting point is 00:22:56 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.
Starting point is 00:23:19 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
Starting point is 00:24:06 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.
Starting point is 00:24:43 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.
Starting point is 00:25:33 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,
Starting point is 00:26:01 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
Starting point is 00:26:29 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.
Starting point is 00:26:44 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.
Starting point is 00:27:00 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.
Starting point is 00:27:12 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
Starting point is 00:27:29 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
Starting point is 00:28:15 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.
Starting point is 00:28:39 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
Starting point is 00:29:06 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.
Starting point is 00:30:09 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,
Starting point is 00:30:24 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.
Starting point is 00:31:09 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
Starting point is 00:31:27 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
Starting point is 00:32:05 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.
Starting point is 00:32:48 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.

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