Python Bytes - #422 You need 4 spaces

Episode Date: March 3, 2025

Topics covered in this episode: My 2025 uv-based Python Project Layout for Production Apps aiolimiter A peek into a possible future of Python in the browser Reloadium Extras Joke Watch on YouTube ... About the show Sponsored by us! Support our work through: Our courses at Talk Python Training The Complete pytest Course Patreon Supporters Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Brian #1: My 2025 uv-based Python Project Layout for Production Apps Hynek Schlawack Discusses uv, a simple pyproject.toml, a simple project layout, and uv.lock as the modern way to ditch requirements.txt files This is the starting video in a series, but it’s already very worthwhile Michael #2: aiolimiter An efficient implementation of a rate limiter for asyncio. This project implements the Leaky bucket algorithm, giving you precise control over the rate a code section can be entered. Brian #3: A peek into a possible future of Python in the browser a.k.a “Secret SPy Stuff” Łukasz Langa A peek at SPy, a new language for Python on the web. Michael #4: Reloadium Hot Reloading and Profiling for Python If you are a PyCharm user please check out Reloadium plugin See also: github.com/mikeckennedy/server-hot-reload Extras Brian: Making an alternate version of The Complete pytest Course Michael: Book: Zero Day: A Jeff Aiken Novel Warp terminal on Windows is out. PyCon Ed Summit announced. Joke: py programmer walks into a bar

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bites where we deliver Python news and headlines directly to your earbuds. This is episode 422 recorded March 3rd, 2025. I am Michael Kennedy and I am Brian Ocken. In this episode is brought to you by us. Check out Brian's PyTest courses. Check out the ones over at TalkPython training. We're up to almost 475 hours, 275 hours, not that many, 275 hours of courses over at TalkPythonTour. There are many tattoos from there, and Brian's book, and Patreon supporters, and
Starting point is 00:00:31 all these things. Thank you so much. Also, we're continuing to improve and involve our newsletter, which gives you, I think, insights into the episode that we maybe didn't explicitly call out, and certainly are not in the show, so head over to PythonBytes.fm, click on newsletter, put in your email. We will be kind and gentle to it, but we'll send you cool stuff usually the day of or after the day after the show. Yeah. So with that said, Brian, how do we start our show today? Let's start it with a video kind of. Wait, isn't this already a video if people want to watch it? Yeah. Yeah. Very mad of you. Yeah, so I am trying to add this to the stage. What's going on?
Starting point is 00:01:09 Oh, they're wrong. Anyway, there we go. Technical difficulties that won't make any sense to anybody listening. So we don't normally cover video because it's, I don't know. I don't know why. But I don't watch a lot of Python videos, I guess. But this one is a do not miss. So Henik put out a video called my 2025 UV based project,
Starting point is 00:01:33 Python project layout for production apps. And I am, I was paid attention to this, partly to see what was he, he was up to, and I like UV. But also, when you watch it, his example is a fast API app. In his world, an app is usually really a website app. Later he's going to go on to talk about Docker, I think, because this is part one of a series. But this one's already enough that I think it's really useful.
Starting point is 00:02:07 And especially in a lot of the, some of the stuff I deal with, I think of an app as anything that's packaged kind of, like it's not a package, it's not something you put on PyPI, but it's a bunch of your own code that you normally would have used a requirements.txt file. And I like his model better. So I'm going to jump in. I got a couple tabs because it's kind of hard to like navigate.
Starting point is 00:02:35 Anyway, snapshot videos. So I stopped them where I wanted to. So the video is great. It's about 25 minutes long. It's pretty quick to watch. Here we've got the project layout. So his project layout is using a source layout. And really, there's no requirements file. All of the requirements are in the pyproject.toml. And instead of a custom lock file or one you manually do, he's just recommending that you let UV take care of a lot of the project stuff. And actually even with so and we'll take a look a little
Starting point is 00:03:12 bit more what's in pyproject.toml, but he's recommending that you go ahead and check in the UV lock. So if you're letting UV handle your virtual environment, it's going to create a lock file. And if you commit that, then UV run later will use that and use all of the stuff in the lock file. And you, instead of running Python, you clone the repo, run UV run on your project, and it's gonna grab everything out of the lock file. It's just like pin dependencies.
Starting point is 00:03:42 It's pretty sweet. Yeah, I 100% agree with him. Check in the UV lock file. And then you don't even have to do UV run if you don't want. You can just do UV sync, and it will also use the pin dependencies in the lock file. And then some systems, they require to run kind of with their setup.
Starting point is 00:04:00 For example, Pyramid, you need to use p-serve, and then it's like configuration file or flask. You can do like flask run or Django. Like, so if you still want to stick with that, you can just do UV sync. So UV sync will grab all the everything out of the lock file then. Yes, exactly. And I think it might even create the virtual environment though. I haven't actually tried that yet. Yeah, it does. Yeah. If you don't have one already, it'll create it. And also, if you already had one and it was out of sync, like UV sync, that's kind of what the part of the sync does. If somebody updated some of the requirements,
Starting point is 00:04:35 so the UV lock had changed, then UV sync will rewrite the virtual environment. And so he's showing also that his version of how to specify the Python version is to just specify it within your PyProject.toml. And UV will grab that and install it if necessary. And then also, interesting discussion around version, because PyProject.toml requires a version.
Starting point is 00:05:04 But with a lot of applications, we don't really utilize the version, because it's just code that you're pushing and running. So he said, just set it, if you don't care about the version, just set it to zero, and then people will realize you're not using it. So. The world's most common version.
Starting point is 00:05:22 Yeah, and then also a discussion around the separation of dependency groups that came in recently that UV handles nicely in PyProject.toml files. And that allows you to separate your dependencies based on really what the application needs versus what you need for development. And this will work. Then you can run.
Starting point is 00:05:44 If you're in production, it won't install your, your like, PyTest and stuff, but it'll install everything else. But when you're creating a virtual environment locally to develop, it'll grab those also. So very cool to have all of this together. And then build system, I didn't really realize that you could specify UV as a build backend and
Starting point is 00:06:07 I'm going to have to play with that. That's pretty cool. So, how are you muted? I put Hatchlane in mind and I believe several people pointed out that Hatchlane is the default. And the reason that we, when we played with this the very, very first time it didn't show up with any build backend is because we created in application mode but I think if we created in package mode there's a way to say like well what really kind of project you're creating then it specifies the build back in explicitly I think so yeah anyway a lot of
Starting point is 00:06:35 options there but yeah very cool yeah um actually just an enjoyable video too I like what he's doing there so check it out very Well, let's talk about async and await. So there's this cool project called AIO limiter, an efficient implementation of a rate limiter for async IO. And this comes to us from Martin Peters. Martin Peters, at least at one point was the most prolific Stack Overflow Python person. So that was fun. And this project is something that got created as a result of an answer on Stack Overflow by him. So not a big surprise.
Starting point is 00:07:18 I'll beat on the dead horse a little bit, Brian. I feel like there's a big missing piece for async and await in Python. and that is any sort of mechanism or control or understanding or adjustment or whatever of the underlying running of async code in general, right? If I call an async function and I say await a thing, how does it run? Well, you don't know. It might be running in an event loop that you've created, it might be running in an event loop that you've created It might be running in and one that you a framework created
Starting point is 00:07:48 You don't sometimes often most the time let's say you don't get a choice on how that loop is created For example, if you're using fast API fast API creates a loop and says here you can use this one Hope you like it. You know what I mean? Whereas systems like dotnet. They've got thread pools and async Io pools and Contexts and stuff that you can say hey on this one. I want you to limit to 10 So if you're doing work just do 10 at a time when you're done one allow the other ones to come in otherwise cue them And just make them away right stuff like that is kind of missing so all these projects are trying to Backfill that kind of functionality into Python's async and await.
Starting point is 00:08:26 And this is cool. So it does give you like suppose you're working on a project and you're using an external API. The API says you have a rate limit of five per second. If you go over that, we're going to start failing and telling you status code 429, too many requests, wait however long and try again. But that becomes like really janky, right? So with this thing, what you can do is I can create a rate limiter and say, I'm willing to allow 100 calls within a 30 second window, or the example I gave, five calls within a one second window, or whatever, right?
Starting point is 00:08:57 Something like that. And then you just put that into a async with block, and then stuff that happens in that window will be limited by this rate limit. Okay. Cool, right? So it makes it really easy to handle those kinds of things. But often it's not like I'm gonna make all of the calls here. You know what I mean? It's, I want all the async calls in the system to be limited in this way, not the ones that I'm controlling the particular function of, which is sort of the crux of my complaint that I started with. But this is nice, you create one of these somewhere and then anywhere you use this rate limit as a context manager,
Starting point is 00:09:31 it is subject to that rate limiting. So it doesn't have to be the same function, it doesn't have to be all the codes are happening at the same time within the block. So you know that's a pretty nice thing, right? As long as you just put that in all the places you need it. Like for example one of the problems you can do is you're getting too many requests you can overwhelm your database and because they're you're awaiting and do it asynchronously you could just keep feeding it to the database even if the database is slowing down and slowing down and slowing down. So like in your data access layer you could just wrap
Starting point is 00:10:00 all of your queries in one of these things that say don't let more than I don't know 10 per second or whatever is reasonable for your database. That's kind of low but you know what I mean. Like you can sort of control that. So you might like have one of these rate limiter for your database and then maybe one for an external API or... Yes, theoretically and they could be different, right? Yeah, okay that makes sense. Anyway,, I thought this was kind of cool. And people who are worried about trying to solve that problem, then they can use this as one of the tools there.
Starting point is 00:10:35 Computers are so fast, sometimes we're like, it's too fast. Slow down a little bit. It's like, let's make it a lot of do all the work and not wait on any of it. Like, uh, usually good, sometimes bad. Sometimes bad. The thing on the end doesn't like it. Yep.
Starting point is 00:10:50 Yeah. And out in the audience, we got a, wow, cool says Aziz. I had this limit problem a lot. So awesome. Hope it helps. Yeah. Hope it limits your problems. It does a little bit.
Starting point is 00:10:59 It will limit your problems. What's next? That was weak. So, um, I want to talk about spy stuff. So Lucas Lange wrote an article about spy stuff, actually a peek into a possible future of Python in the browser. So there's a, it's a, it's a kind of a fun article also, but a great picture as well. Some cool picture of the mountains anyway. And you know, he's. Anyway, and you know, I trust his opinion because of his involvement with Python and everything,
Starting point is 00:11:30 but this is interesting about a lot of the core Python people really involved with thinking about the web. So there's a section about looking back on, I haven't read this, or seen this, but apparently there was a Gary Bernhardt talk about the birth and death of JavaScript. I'll have to go back and look at that. And then, but basically talking about the history
Starting point is 00:11:53 of Python and the web. Wait, wait, wait, wait. If you have not seen the birth and death of JavaScript, it needs to go to the top of your list. The birth and death of JavaScript is a seminal video that is both hilarious and very, very insightful. Okay. Well, the Yavascript is part of the joke.
Starting point is 00:12:08 Okay. Yavascript. All right. Well, then he goes on and talk about Piedide and other things and, and, you know, using NumPy and Cython and stuff. stuff, but the real thrust here is a new research project called SPY, S, capital S, capital P, lower Y, I guess. So that's SPY stuff. It says, the article says the SPY is a research project
Starting point is 00:12:39 in its early stages at the moment. Don't attempt to use it yet unless you plan to contribute, but maybe you do plan to contribute. It's both incomplete implementation-wise and design-wise, but so early stages, but it sounds pretty cool. So there's this, I like the idea. So there's this, I'm gonna jump down to the demo and see if we can get it to play.
Starting point is 00:13:02 So, ooh, had video sound too, but I don't think you hear that. But anyway, there's a demo of it working, of some shapes shifting around. And that's actually we're running in the browser already, but you just can't, I guess it's not complete yet. But this, this idea of having, having things that look like Python. So when you're, when you're, there's like blue code and red code is the idea. And the blue code is stuff that just like acts like Python. And, and that's great for debugging and stuff. And because you can,
Starting point is 00:13:36 people are used to writing in Python. And then there's a redshift model of, cause that's what we do a lot is like whether we should compile it or not, but this will, um, uh, like pre compute, uh, a lot of the stuff that's blue into a pre-compiled version. Anyway, all the little compilation parts to make things run faster. But I really like the idea that you've got a level where you're running it just as pure Python and then you can deploy it and it runs as a compiled part. So anyway, I'm probably getting this wrong at early stages, but we've got links to this article and then to the spy project itself,
Starting point is 00:14:12 which a lot of activity just recently. So anyway, I like that. And mostly, I don't know why I brought this up, the story of Python in the web browser better and better. So anyway. I also bookmark this article as something super interesting that should, you know, might be worth talking, and reading up on, so thanks for covering it.
Starting point is 00:14:34 Yeah, and if you get a deeper- We're on the verge. You mentioned we could bring it up later again as well. Yeah, yeah, it's early days, so maybe there'll be more news on it. Yeah, I'm very excited about the possibility of Python in the browser. It'll uncork some amazing stuff if that really gets running seamlessly.
Starting point is 00:14:52 And really, say in the browser, but really what we're also meaning is that if we could not have different front-end and back-end languages, so if we do all the dynamic front-end stuff with Python, it'd be cool. Yep, exactly. Dynamic friend and stuff with Python. Yep, exactly. Exactly. I think that the browser manufacturers could do significantly more to make this better. Yeah. For example, every one of them ships a JavaScript runtime that's optimized, right? Not a single one of them ships the WebAssembly version of Ruby or the WebAssembly version of Ruby, or the WebAssembly version of CPython, you know, Piodide, or the WebAssembly version of.NET for Blazor,
Starting point is 00:15:31 or all these things. And so all of those projects are like, well, it'd be great to use this, but it's really slow to download the whole runtime on each page separately. Every browser could say, we will provide and keep up to date as part of our binaries or just off of the internet or whatever as you download it a
Starting point is 00:15:49 Shared Python runtime a shared Ruby runtime a shared dotnet runtime and so on and they don't yeah, right, but All these complaints about well the web front end is too slow because you got to download all this stuff like yes You do now but it could theoretically be that they say well We're gonna support like an open sort of management of these these binary these web assembly runtimes You might need to download sure the extras you got to download every time like JavaScript But the the core runtime of 10 megs will like update that with our browser or just yeah as it changes on the web I wish they would do that. Yeah Right, know for JavaScript I mean come on now all right it's like it sounds crazy but at the same time they do it for JavaScript and
Starting point is 00:16:32 they write their own all right they wouldn't even have to write their own they just got to allow the run of running of others okay enough of that let's talk about reloading stuff in the browser instead that sounds fun so there's two projects I wanted to tell you about. One is the big heavyweight does so much stuff to help you write web applications, type in the editor and have that stuff magically change. For example, by default, if I run a Flask app
Starting point is 00:16:57 and I go over to the, I run it and I open it up in the browser and I see the page I'm working on. And then I go over and I edit the Jinja template. I hit save and I refresh the browser, nothing happens. I should go back to Flask, restart Flask, go back to the browser, reload the browser, now I can see my changes.
Starting point is 00:17:17 You can level that up one by going to Flask and say you're running into bug mode. So if you see any changes, please rerun Flask and reload the templates if I edit the templates. Then you can just edit your thing, save it, go over to your browser, hit refresh, see the changes. But what would be nicer if I could have
Starting point is 00:17:34 like two thirds of my screen be my editor, one third of my screen be the web browser, and as I type, I see stuff just changing on the page. So if I put a CSS class on a thing, I don't have to go to the other app and do anything. It just literally just the changes that apply like every second or so. Right. So that's what this reloading thing is, but it does a lot. So I want to put this out there for people as a cool option.
Starting point is 00:17:59 I'm not sure I'm going to put it out there as a recommendation yet. So let me tell you. So for example, it will not just do the experience I told you about, but it will actually rerun every function. If you make a change to a function, it will rerun it and you can actually have it doing like live profiling. So as you type there, it'll give you a profiled output of the thing and so on.
Starting point is 00:18:24 So if you kind of want to explore it, it gives you like that idea more broadly. So it works there. It comes with a PyCharm plugin, which is what the little animation is. So you can actually see a visual representation of like the performance time and how it's running and reworking and so on.
Starting point is 00:18:39 Okay, so that's pretty neat. Comes with an AI thing. I'm going to skip that. I don't know what that is or care. It has, yeah, so generally, if you make a change to a function, it will re-execute the current function, providing immediate feedback.
Starting point is 00:18:53 And if there's an error, it doesn't die. It just goes, well, okay, once you fix it, things are gonna be good and it'll start working again. So it's kind of durable to that, you know? And it'll refresh files throughout the entire project, looking at dependencies, so if I make a change to like one bit, then it'll change the others, you know, like with the import or whatever.
Starting point is 00:19:12 For Django, it does exactly what I was telling you, like as you type, not just as you type HTML, but as you type Python. So the example they have here is they're doing a query for all objects and then they slice it to do a limit, paging limiting type of business. And as they change the numbers in the slice in Python, the web browser is automatically updating the results without them touching it. That's pretty cool.
Starting point is 00:19:37 Yeah, it's pretty cool, right? Similarly for Flask, it automatically reloads Flask. But again, it says look, it'll hot reload the Flask, it automatically reloads Flask, but again it says look it'll hot reload the Flask app, but if you just set Flask debug to be true, Flask will already do that, you know what I mean? So the one thing it doesn't do is it doesn't refresh the page as you type on one side, the stuff on the right doesn't change, right? Another thing it does it'll for SQL Alchemy because it's like running functions over and over and over, it might start to insert, insert, insert into the database so it does these auto runs and transactions that roll back so it doesn't tweak the database.
Starting point is 00:20:11 Oh, interesting. Yeah, and it also does hot reload for pandas. So if you're messing with your data frame or things like that, it'll just automatically be updating as you type. All right. Pretty interesting, right, Brian? Yeah. Yeah. I don't know if I talked about before but just since people might want a less
Starting point is 00:20:27 intrusive version of that. So I have this project called Server Hot Reload over on GitHub and it's a single JavaScript file and if you just include the JavaScript file in your page it will give you the same functionality for web apps that will reload the template. So for example, if you just include the JavaScript at the top of the page, and then Flask, if you run it with Flask debug, or Pyramid automatically reloads in debug mode, you can set that in the config file,
Starting point is 00:20:56 and I'm sure you can do similar stuff with Django. And then you just browse it on one side, code on the other, and you just start typing, and off it goes, and it even detects if you set it up right, or even reload the page if you change an image that was being used, and things like that. So, super cool, but this one, it doesn't go all crazy, it doesn't require an IDE plugin,
Starting point is 00:21:17 and all that kind of stuff. Basically what it does is it looks at the response from the server and says, is the hash of the HTML changed? If yes, reload the page. If it's not changed, then don't reload the page, that kind of thing. So, anyway, two ways to basically work in your editor, start typing and having some kind of output web
Starting point is 00:21:37 or in reloading other places. So automatically changing as you type so you don't have to manage that. You're just like, oh, what's this class? Oh, that looks really great. No, we need more padding here. Da da da off it goes. So the server one probably doesn't do the like if you change Python or Technically, no, it doesn't do that. However, if you set flask to do that automatically,
Starting point is 00:21:58 and then it will re request the page, then yes, it does. You know what I mean? Okay, got it. So if you're willing to use the like the framework tools, then it does. Okay. what I mean? Okay got it. So if you're willing to use like the framework tools then it does. Okay okay very good cool. Yeah but it's nowhere near as intense which I think for some people is a drawback and other people is a plus depending on where you are. Okay nice. All right that's it for all of our items isn't it? Yeah it is. Well, what have you got for extras? I got just a pet project of mine that I wanted to talk about. So the complete pie test course has been out for a while.
Starting point is 00:22:33 And there's a couple things about it that I'd really kind of like to change. So I'm working on some changes. First of all, if you go and look at it, it says there's 162 lessons. That seems a little scary. The reason is because I've chopped it all up into... There's 16 chapters in the book. The course covers the entire book.
Starting point is 00:22:54 16 chapters. Each video covers a section of a chapter. That's where... Plus welcome videos and stuff. That's where the 162 comes in but that's a little there's actually 162 videos which is a little intimidating especially if if you're you're looking at one and you kind of like there's a lot here but I mean it's all good if you if you like to go in just like a few minutes at a time that's great but some people want to just chunk through an entire chapter and like a lunch minutes at a time, that's great. But some people wanna just chunk through an entire chapter
Starting point is 00:23:26 and like a lunch break or something. So the alternate version that I'm working on is chopping this up into just chapters. So most chapters will be one video and then you can just chunk through like just watching one video, you can watch it in a weekend or not a weekend in like 20 you know,
Starting point is 00:23:45 20 minutes or something like that. There's a couple chapters, chapter two and chapter three, um, are pretty big writing test functions. And then fixtures, uh, pretty big concepts. So they're a little longer. So I'm chopping those not into one video, but, uh, like three videos. Um, and so, uh, when we, when I get all done, uh, this, the new version will be not 162 lessons, but like 20 lessons or something like that. Um,
Starting point is 00:24:13 and then I'll probably make that the default and I'll just have both of them available because some people might like the, uh, little, uh, more granularity and doesn't, it's not more effort of me to have both of them around. So they'll both be around. Anyway, that's what I'm up to. Cool. Yeah. I like the small little videos. I think it's the way better reference material. You want to have to go like where in that 18 minute video was the thing I wanted? Yeah. Well, yeah, that's the benefit. The other thing is I like to, for videos, I like to
Starting point is 00:24:42 probably set them at like 1.2 speed or 1.3 speed the first time, or 1.25, maybe 1.4, to like get an overview really quickly. And you have to reset that for every video and that's somewhat a little annoying. That's a hassle. Yeah, anyway. That is a hassle.
Starting point is 00:25:00 All right, well, let's see what I got for extras. I got an oldie, something fun here. So there was a Hacker News thread or Reddit extras. I got an oldie something fun here. So there was a Hacker news thread or reddit thread. I'm gonna go with hacker news. Pretty sure was hacker news talking about hey could some people recommend some cool legit programmer fiction books Hmm, right like I want to I want a spy thriller that has to do with programming, but that's not stupid, right? It's not like, whoa, this is VB6, I know that. I'm gonna track their IP. Like, you know what, that's not how it works.
Starting point is 00:25:31 More Mr. Robot, less Jurassic Park or whatever that was. I can't remember. So the book that I thought was really cool, I'll give a shout out to, is by Mark Rostovich, who is the CTO of Azure. And apparently I bought this book in 2012, just to give you a sense. So it's not brand new, but it is a super cool series as long as you keep in mind like its computer world was
Starting point is 00:25:50 2012 so people can check that out if they're interested also Warp on Windows. I'm a big fan of warp the terminal. It's been working out super super well I tried ghost TT or ghosted II or whatever you say that super super well. I tried ghost tt or ghost tt or whatever you say that. Just I cannot do it. I can't do it. Like it doesn't even let you like select text with hotkeys and stuff. It just puts like control H and stuff in there and then until you can work with it as an editor. No. I can't do it. So I mean I know there's some way like you can hold shift and arrow but you can't do like control shift arrow to do like word by word and you some way, like you can hold Shift and Arrow, but you can't do like Ctrl Shift Arrow to do like word by word. And you can't do, like you can do Home, but you can't do
Starting point is 00:26:29 like Shift Home. These are like really weird like editing stuff where like some of it just starts putting escape characters into the thing. I don't remember exactly enough what it was because when I saw it, I was like, okay, we'll come back to this some other time. Anyway, if you were on Windows, you're looking for a better terminal, and I know Windows has fewer options and less good options than the other places for a variety of terminals. Like there's Windows Terminal and then, I don't know, is there anything else? I'm not sure. There's definitely a command prompt. PowerShell runs within Windows Terminal.
Starting point is 00:26:59 You can run GitBash or PowerShell or whatever DOS-like stuff. You can run all that in Windows Terminal. Oh, right. OK. Right? You can do the same in Warp. You can choose, do I want PowerShell, do I want Git Bash or whatever.
Starting point is 00:27:13 But the thing that is the outer bit of it, the app itself, there's not many options. So this is a cool thing that people can check out. I'll link to the video because it's fun. But you can just go to warp.dev or wherever it is. Okay. Our friends over at teaching Python podcast, they are participating and being part of the PyCon 2025
Starting point is 00:27:36 education summit. And they're pointing out that, hey, hey, hey, the applications are going to be, you know, send in a proposal very, very soon. So that was, I think, last Friday and today is Monday. So it just recently opened up and they said the main theme is in the age of AI, how do we maintain the creative, empathetic,
Starting point is 00:27:58 and critical thinking skills we need to make us human and great coders? We wanna know, and so there's a whole bunch of ideas around this. So we've got Kelly and Sean and a bunch of other people participating in this. So if that resonates with you, check it out. No, I was just chuckling because even before AI,
Starting point is 00:28:15 we hadn't figured that out as far as I could tell. But yeah, I don't really know the answer. So I'm going to ask ChatGPT. I'll get back to you. OK. Yeah, one more extra here real quick I just noticed that Grannion which is powering Pythonbytes.fm by the way and many many other things just came out with their 2.0 release right there seven hours ago how's that for French breaking news
Starting point is 00:28:40 doot doot doot doot doot doot doot far as I can tell there's a do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do do the CLI of like how you specify certain constraints and stuff. That's easy enough to fix because it tells you this constraint, such and such, but I think there's something going on where at least all of my Fast API apps stopped working when I switched this, but all the other ones like Court and Flask and Pyramid all work fine. Interesting. We don't know why. And Court is async first just like Fast API. So I don't know what's going on, but they were not having it.
Starting point is 00:29:24 So I just pinned the version to less than two for those until whatever happens, you guys figure it out. So there's just a little PSA. All right, with that. So seven hours ago, you've already tried it? Not on purpose. I tried it three hours after it was released.
Starting point is 00:29:38 I needed to ship something else, but my deployment process is check something in the Git and then have it go rebuild the Docker images and restart them. And that's all. Check all the dependencies. Is there anything we can update? Does Ubuntu have security fixes we need to apply? Can we update the web server in case
Starting point is 00:29:56 there's a security fix for it? And then we'll rerun the dependencies. And we'll restart it. And then it didn't restart. I'm like, wait a minute. What? What's going on here? This is not good So that's how I learned that there's a new release of Grandia. Yeah, okay
Starting point is 00:30:11 You know, I mean, it's not like I was like, oh I got to try it that quick It it tried itself on me and then it didn't go so well. So I scrambled to fix it. Okay. Yeah. Yeah. Okay joke I'd love a joke Tabs or spaces this one has to do with tabs or spaces I'll tell you a joke before the joke a pre joke if you will to get everyone in the mood This is like the bad joke the bad comedian that shows up before the one you actually came to see so we were at PyCon I Don't know. I think this might have even been in Portland
Starting point is 00:30:40 This was a while ago and there was some company that was clearly not very tuned into Python. They were just a coder company, right? And they were like coming to sell their coder tools to the Python people. And so as they wanted to make a spicy t-shirt and the spicy t-shirt said tabs are spaces fight. Like this is the stupidest shirt I've seen at the whole conference. I mean, tabs are basically disallowed. They're not exactly disallowed, but they're pretty much disallowed. Like that's not an argument, it's over. And you're like, you're trying to set up as a divider. Like you could do two spaces, four spaces and fight,
Starting point is 00:31:13 but you can't do tabs versus spaces at a Python conference. Anyway, but people are going around those shirts nonetheless. I think I got one to cut the lawn in. Okay. Well, let's, while on that topic, two spaces or four spaces? Four.
Starting point is 00:31:26 Unless I'm doing JavaScript, then two. Because for some reason, the tools seem to default to two for JavaScript. You? Like, four usually. But I'm noticing that I'm using two frequently as well. OK. Very contrary.
Starting point is 00:31:41 OK. You're an enigma wrapped in a fuzzy cloud. Okay, how about this for this is the real joke? So I don't know if this is better or worse, but this is what people came for code puns. You ready Brian? Yeah, a Python programmer walks into a bar and opens a tab the bartender tells them to sit at the table since they will need four spaces That's that's what I got for y'all. No it's hilarious, see? This is why people listen.
Starting point is 00:32:12 Yeah, yeah, yeah. Oh no, I'm like, I'm advertising it poorly. That was hilarious, man. Good joke. Now there's actually a bunch more here. We've talked about this place before, right? Yeah. Let's see.
Starting point is 00:32:24 They're not all good. Why did the for loops stop running? It took a break. Yeah. How do you comfort a JavaScript bug? You console it, like console log and so on. There we go. No, it's just, it's good. Thanks. Yeah. It was hilarious. I know. Yeah. I hear the flaws. No, not really. But that's what I brought anyway.
Starting point is 00:32:45 No. Good talking with you again. And thanks, everybody, for listening. Yeah, you bet. Bye-bye.

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