Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #153: Auto format my Python please!

Return to episode page view on github
Recorded on Wednesday, Oct 16, 2019.

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:05 This is episode 153, recorded October 16, 2019. I'm Brian Okken.

00:11 And I'm Michael Kennedy.

00:12 This week's episode is sponsored by DigitalOcean. We'll talk more about them later.

00:16 But first, Michael, could you extend my knowledge a bit?

00:19 Yeah, by extending the entire Python ecosystem, maybe?

00:23 Yeah.

00:24 Yeah, so there's actually a cool real Python article called "Building a C, Python C Extension Module." So, Brian, you know how to write C code, right?

00:33 Yes, or at least that's the theory. I used to know how.

00:36 Yeah, I have this really awesome former self of mine that was super good at C++.

00:40 I kind of remember that person that I was.

00:43 I used to be able to write a lot of C.

00:44 That was my main job is to write C and 3D stuff and OpenGL and things like that, right?

00:50 So it's definitely the main way to extend Python these days.

00:55 And there's other options, like there's some cool Rust options and whatnot.

00:58 But primarily people know C, it runs everywhere, has light runtime requirements.

01:03 You're already running CPython probably, so you already have those requirements met, right?

01:08 So extending your code with some kind of C extension gives you a couple of options.

01:14 One is clearly performance.

01:16 I love to talk about Python performance because one, it always surprises me.

01:19 And two, like people are usually wrong about it.

01:21 They say Python is slow.

01:23 Like I was just reading something on Quora about why, like compare C# to Python.

01:29 And somebody's like, "Well, you can't even compare them.

01:31 C# is 50 times faster." Well, it's true for certain operations, unless maybe part of that it's done in C, and then probably Python is faster, because like now it's down in like NumPy and doing it in C, which is actually faster, right?

01:42 There's just, it gets really interesting.

01:44 And so one reason you might care about writing a C module is just for performance.

01:47 And I think that's what most people think of.

01:49 But there's also like low-level operating system APIs or other C APIs, like some library you can get, you might want to use, that happens to be written in C and doesn't have a Python way to talk to it, right?

02:04 Yeah, there's lots of stuff with DLLs that are available with C header files, but you don't have a Python binding.

02:10 Exactly.

02:11 You have a lot of experience with that with all of your devices and stuff like that.

02:15 Yep.

02:16 Yeah.

02:17 Okay.

02:18 So those are the two main reasons I can think of writing C extensions.

02:20 I mean, obviously throw some Cython at it if it's a performance thing to give it a try, but there's a cool tutorial on real Python and it talks about how you can, you know, like things you'll be able to do is like import C functions within Python, pass arguments from Python to C, raise correct exceptions in your C code so they surface bubble back into your Python code as a proper like value error type exception or something like that, all sorts of cool things and even how to test and distribute it.

02:46 So let me just sort of talk through the process and then people really care.

02:50 They can go read the big long article, right?

02:52 So if you want to basically get access to some C functionality, or if you want to just like write your implementation and see for some degree, first thing you got to do is go and figure out, let's suppose you want to call like a some C function.

03:06 So the article uses FPUTS, which puts a string into a file pointer, right?

03:11 Like basically writes a string to a file in C.

03:15 So you have to write a function, which is pretty interesting because it returns, you have to start talking in the CPython language, not Python, right?

03:24 So everything that gets passed around is a Python object pointer, or the return value is like a Py object pointer, right?

03:33 So you pass these things around and first of all you declare whatever inbound arguments you're really expecting and you get basically passed a single pointer that is the arguments to your function but it's really a tuple.

03:45 So there's a pyarg parse tuple, give you the arguments, a format thing, and you give it the address of the pointers, you pass them by reference basically.

03:54 And then you just do your CPython code.

03:55 In this case the function that they're wrapping FPUTs returns the number of bytes copied when it does that.

04:02 And so this function wants to return the bytes copied, but you can't just return an integer or a long, no, no, no, because everything in Python is a py object at the C level, py object star, even numbers, so you have to convert from a long to a py long from long, which is a function that you get from the python.h C header file.

04:22 It's actually pretty simple.

04:24 There's some weird non-obvious structure at the beginning of the function so that it can be called by Python, and the return value is weird, But everything else in the middle is like straight C.

04:34 So you don't really have to think about what's going on.

04:37 The GIL will protect you from race conditions, all that kind of stuff.

04:40 Yeah.

04:40 And actually, one of the things I love about this article is that it's using a fairly simple example so that you're not distracted by the example.

04:48 It's just the boilerplate junk that you've got to learn about.

04:50 Yeah, absolutely.

04:51 Which is probably the thing you don't know, even if you know C, right?

04:54 Yeah.

04:55 It says also there's a few other things that are necessary if you actually want to use this code and not just write it and compile it in C, is you have to write a definition for your module in C and the methods that it contains. So there's a few C functions that you call there and then you have to build it for Python which you basically create a setup.py file and use just utils and it will compile and create the right base library and install it for you.

05:20 Okay. Pretty cool, huh? Pretty cool, yeah. One of the issues with this is that the people that have to, a lot of times when you need to do this, it isn't a hardcore C compiler person or a hardcore Python, CPython person that needs to do this, it's just your casual user that happens to have a use case that they need to connect Python to C.

05:41 And so this is great.

05:43 - Yeah, and it's super approachable, and like you said, the examples are pretty straightforward.

05:47 Obviously you're writing C, which puts you in a different category of hard, right?

05:51 I mean, free malloc pointers, pointers by reference, like all that kind of stuff that you learn when you learn C, but that's the world you gotta live in when you go down and you take the blue pill or whatever it is.

06:03 (laughing)

06:05 - Is the blue one the good one?

06:06 I think--

06:07 - You know, I always forget.

06:08 I know that there's a pill that's good and there's a pill that's bad and it keeps the facade, but yeah.

06:14 Probably the red, I don't know.

06:16 - Do you know what else is good?

06:17 - Documentation.

06:18 - Documentation.

06:18 - No, Python 3.8.

06:20 - Python 3.8 is good.

06:22 - But also Python 3.8.

06:23 - Read the URL, sorry.

06:24 - Python 3.8 dropped just this week.

06:29 So it is no longer beta, it is final, and you can download it from the front page.

06:34 The default is Python 3.8.0 now when you download it.

06:38 So yay. - Yes, that's awesome.

06:39 - We have talked about a lot of stuff.

06:41 On this podcast, we've talked about things going into 3.8.

06:44 Like the walrus operator, of course, that's come up a lot of times.

06:48 Those are assignment expressions.

06:50 positional only parameters and f strings.

06:53 f-strings have the little equal sign so you can debug with them easier.

06:56 - Right, f strings have been here since 3.6 but now they have this like self-documenting short print statement thing, right?

07:02 - Yeah, and it takes longer to describe than to show and it's cool.

07:06 What I wanted to highlight is the what's new in Python 3.8 document that came out from, that's at docs.python.org.

07:13 And it's a really great summary of all the stuff that's in 3.8.

07:17 It does have all of those new things that all those big hitters, but it also has some stuff that I was surprised by that I hadn't heard of before.

07:26 One of them is we've talked about a lot of async stuff, and now you can type Python -m asyncio, and it launches a async native REPL.

07:37 - That is so cool, and I had no idea that that was there.

07:41 I guess it would have been a pain in the butt before to like work with async stuff over there in the REPL, right?

07:47 So-- - Yeah, I guess.

07:48 Now you can just, 'cause I often drop into the REPL to try something out, now you can try out async stuff in there, so that's cool.

07:54 - Yeah, that's super cool.

07:55 - A couple other things that'll just help you while writing Python, couple new warnings and messages for things that you might do wrong.

08:02 So when you're not supposed to compare, use is or is not to compare non-objects, like strings or integers or something.

08:10 It's just like, if x is three, don't do that.

08:14 But apparently the warning wasn't very good, and so now the warning is better.

08:17 it tells you to use double equal or not equal.

08:20 So that's cool.

08:21 And then one of the things that I often get because I do a lot of parameterized testing is if you've got a list with tuples inside or basically a list of lists or a tuple of tuples and you forget the commas between some of the things because maybe they're on a new line or something.

08:39 The warning was weird before but now it is a more helpful message.

08:43 So I love things like that.

08:45 - Yeah, it drives me crazy if those are strings.

08:47 Like if you're creating a JSON document or something like that, or a multi-line, like a list of strings, and you forget a comma, it just concatenates them, even though they're on separate lines.

08:55 I'm like, oh, really?

08:57 That's the default behavior?

08:58 But I understand where it comes from, but it drives me crazy.

09:00 - That probably is still there.

09:02 - Yeah, yeah.

09:02 I don't see how you would fix that without changing what that means.

09:05 - Yeah.

09:06 This one, it took me a while to get my head around, but I didn't know that this was an issue before.

09:11 Iterable unpacking-- so if you packed a bunch of stuff into a variable, you can unpack it with star variable name.

09:19 You can't return that in a return statement or you couldn't before out of a tuple.

09:26 So you had to put parentheses around it before you return it.

09:29 But now that's gone away, you can just return it.

09:32 - Yeah, there's a lot of good stuff in here actually.

09:33 And you just did an episode on it, didn't you?

09:35 - Yep, episode 91 of Testing Code.

09:37 I just read through the entire article and it's still just 20 minutes.

09:42 I didn't read through everything, but I highlighted all the stuff that I thought was cool.

09:45 - Super.

09:46 - You know, something else that's cool is DigitalOcean.

09:48 - I love DigitalOcean.

09:49 - This episode is sponsored by DigitalOcean and Python Bytes infrastructure runs on DigitalOcean, thanks to Michael putting that all together.

09:57 And it's quite solid and we're super happy with it.

10:00 But did you know that not all web applications and services have the same memory and CPU demands?

10:05 - It's shocking, isn't it?

10:06 - Shocking.

10:07 Anyway, so DigitalOcean has embraced this diversity in their droplet structure, which is cool.

10:12 with the ratio of memory to CPU powers in droplets.

10:16 The general purpose droplets have a ratio of four gigabytes of memory per CPU, and you can scale those up.

10:23 They added, not too long, a couple years ago, I think, CPU optimized ones, so they doubled the number of CPUs per the amount of memory, and that's great for CPU bound tasks.

10:33 But there's some applications like high performance databases or in-memory caches or data processing of large sets that a lot of memory might be a really great thing.

10:43 So there's now a memory optimized droplet that reverses that structure and makes it like eight gigabytes of memory per CPU.

10:51 It's pretty cool.

10:52 - Yeah, very cool.

10:53 - Yeah, use the right kind of droplet for the right service that you're using and try it out at pythonbytes.fm/digitalocean and they'll give you a $50 credit for new users.

11:02 - You and I have mentioned that folks should put legacy Python where it belongs in the past.

11:08 Last time we spoke about 35 million lines of Python code at JPMorgan Chase and their journey to work on that.

11:16 And that's all interesting, but we just recently got this announcement from the UK's NCSC, the National Cyber Security Center.

11:25 Wow.

11:26 Yeah.

11:26 And they're warning developers of the risk of sticking with Python too, particularly library writers.

11:32 Okay.

11:32 That's interesting, right?

11:33 That they actually go so far as to call that out as a thing.

11:38 So they say, look, this could be like basically the companies that continue to use Python two past its end of life could be like tempting or setting the environment for another WannaCry or even an Equifax incident.

11:52 So Equifax was a horrible data breach.

11:55 Basically it's one of these companies that gathers up so much private data.

12:00 Like they know stuff about my financial past that I have forgotten and don't even know.

12:03 Right.

12:04 They go, did you know you had this account in California?

12:06 Like I did.

12:07 Oh, okay.

12:07 well, I guess I do. Right. They know all of that. And it was broken into why because there was a vulnerability in Apache struts, which is an open source framework, people stress are like, guys, this is super bad. You just have to send like a special a super p request to the server and it's owned, right?

12:24 Well, the folks at Equifax got that message, but they didn't really want to get around to like upgrading it to the new version, because hey, it's kind of hard to upgrade this thing. It's like a new version, which probably was old and was slightly incompatible or something.

12:37 Anyway, that's where Equifax came from, is running an old version of one of these frameworks, not Java itself, but like the web framework on top of it.

12:44 Anyway, there's some cool quotes in here.

12:47 They say, "If you're still using Python 2.x, "it's time to port your code to Python 3.

12:53 "If you continue to use unsupported modules, "you are risking the security of your organization "and data as vulnerabilities will sooner or later appear, "which nobody's fixing." Okay, that's one.

13:03 One interesting quote, another one is, if you maintain a library that other developers depend upon, you may be preventing them from updating to three, and by holding back other developers, you're indirectly and likely unintentionally increasing the security risk of basically all the computers in the world.

13:19 - Yeah. - Yeah.

13:20 So, I mean, we've said this before, right?

13:21 You and I have said this, but if the NSA or the NCSC, they come out and publicly call out Python 2 like this, well, that maybe carries more weight than Python bytes.

13:35 Not that we don't carry some weight, I'm sure.

13:37 - Yeah, it actually makes me think, though.

13:38 Like, let's say you have a library that now works on both Python 2 and 3, and somebody else is depending on it, and they're also depending on another library that is 2 only.

13:50 They're gonna stick with 2, but if, like, for instance, you could push them if you stopped supporting Python 3 or Python 2.

13:58 - That's a good question.

13:59 In six months, do we have a obligation to actually cut Python 2 out of our libraries?

14:06 I mean, I don't have any libraries people care about, but--

14:08 - Maybe to force people to upgrade.

14:10 Maybe you could do some help.

14:12 - Yeah, most of these changes have been more self-serving or self-centered, right?

14:16 Like NumPy and Django, all those folks dropped Python 2, not because they're like, "We're gonna fix the world," but like, "We don't wanna maintain this stuff.

14:23 "We wanna just move forward and use the cool features, "and we can't right now." - Yeah. - Yeah, pretty cool.

14:28 I guess one other kind of interesting thing to call out from this report, article, whatever you call it, is that they said that Python's popularity makes updating the code imperative, which I thought was pretty interesting.

14:40 It's like Python is so successful.

14:42 It's so broadly deployed.

14:43 We can't just ignore this.

14:45 It's not like Adobe Flash.

14:47 It's now running an old version.

14:48 We should deal with it.

14:49 It's like this is one of the really important parts of the computer infrastructure that they called out.

14:55 Yeah, I mean, there's got to be other places where we get this kind of news, right?

14:59 So I got a notification from a guy called Sebastian Steins, and he put up a, it's basically a Hacker News lookalike site called news.python.sc. I don't know what sc stands for.

15:13 Yeah, it looks a lot like Hacker News, but it's just got Python stuff on it.

15:17 And it's pretty neat. So I thought, oh, that's cool. We should talk about it.

15:22 But one of the neat things about it is you put it all together relatively quickly in like a week or so And it's built on django And all of its open source so you can take it and look at how it's done And everything plus it's up and it's live and you can post stuff. It's neat And I thought yeah, maybe we'll cover this and then while I was thinking about covering it We got like two or three other people say tell us about this new news site So I think people are using it.

15:50 It's kind of fun.

15:51 What do you think?

15:52 I like it.

15:52 It definitely looks like Hacker News, but more Python at colors.

15:56 And, you know, looking through this, this is these are all legitimately interesting things.

16:01 I'm like, yeah, oh, yeah, I read about that.

16:03 That was cool.

16:03 And, oh, I didn't know about that.

16:05 But interesting.

16:05 Yeah, I feel like this is great.

16:07 And even if it doesn't take off, I think it's cool to have an example of a working model of simple with, like, people being able to vote things up and down and that's kind of a neat model to say there's a working website, a working user model, how can I emulate that in Python? Yeah, it's super cool. I'm definitely gonna start checking it out as one of my new sources in addition to Redis and Twitter and other places. Yeah, like we don't have enough to do. I know, now you just gave me work man, come on, it's homework. So you've heard that most people are moving to the cloud and data science is moving to the cloud, there's all sorts of interesting stuff happening up there. But you know a lot of times this type of work, especially training like machine learning models and stuff, is super super intensive. So if you've got like a laptop, some of the GPU processing and other really interesting things are inaccessible to you. Like for example my MacBook is super killer but it's got you know like 12 cores if you count the hyper threads and it's got 32 gigs of RAM, but it has a ATI, not a NVIDIA graphics card.

17:11 So you can't use CUDA on it, for example, right?

17:13 So what do I do?

17:15 I go to the cloud.

17:16 Well, if you're really into deep learning and you really want to do like data science with GPUs, there's this place called Lambda, this company called Lambda that is creating these deep learning workstation servers and laptops.

17:31 Have you heard about this?

17:32 - No.

17:33 - Just to be clear, this is like a super commercial product.

17:35 These are like servers that you buy and we have no this is not like a product placement I just ran across this and thought dang. This is interesting. So I thought I would just talk about it. So they're selling gpu accelerated tensorflow pytorch keras and other types of Pre-configured machines just they say just plug in and start training. You're good to go And they talk about how you can save a bunch of money, right? You don't run on the cloud The cloud can save you money for short work but if you got to do it over a long time it can get expensive.

18:05 So they offer a TensorBook, which is a GPU training available laptop, capable laptop, for $2,900. That's a pricey laptop, right?

18:15 Yeah.

18:16 Actually, it's less expensive than my MacBook, but still.

18:20 But if you were going to do GPU stuff, this is a really cool option to be able to do it on the go or be mobile.

18:26 Then they also have a workstation, which is called LambdaQuad, quad which has four GPUs in it.

18:33 And this one is $21,000.

18:35 - Okay.

18:36 - Okay, that's a lot.

18:37 But if you go and like grab like a second tier GPU enabled EC2 instance, specifically a P3 8X large, that's over $12 an hour, which comes out to close to $9,000 a month in cloud bills.

18:52 If you were to like run it all the time, obviously probably not all the time.

18:55 But so you know, like $21,000 is a lot, but a $9,000 monthly bill for AWS is also a lot.

19:01 - Yeah, it's something to pay attention to.

19:03 As your bill starts getting bigger, maybe a dedicated hardware makes sense.

19:08 - Anytime I run across something like this, if it were Alienware for gaming laptops or like the Apple MacBook Pro or whatever, it's like, all right, well, what if you're all in?

19:16 What if you turn all the knobs to 11?

19:17 What could you get?

19:19 So they have this thing called the Lambda Hyperplane, which has eight Tesla V100 GPUs, and it starts at, it's not the final price, It starts at $114,000.

19:30 - Nice.

19:31 That's without the pinstriping.

19:32 - Yeah, exactly.

19:33 That's not even the leather-bound keyboard or whatever, I don't know.

19:38 Anyway, if you're into deep learning and you need GPUs for computational stuff, data science and whatnot, this is actually pretty cool.

19:46 - Yeah, also, I'm sure there's applications where you really don't wanna use the cloud.

19:49 You wanna use in-house computers and not go out, or the connection's bad.

19:53 You're sticking some data in the middle of nowhere or something and you can't get to the end of it.

19:58 - Right, right, if you got terabytes of data, like that takes days to upload.

20:02 So maybe it's better to just run it locally, who knows.

20:05 Black has been a big hit.

20:06 - Yeah, I like black.

20:08 - Yeah, for sure.

20:09 - A lot of people do.

20:10 - Oh yeah.

20:11 - One of the things, so I ran across an article, it's not a new article, but it's all still relevant.

20:16 It's auto formatters in Python.

20:18 And big shock, black's in there.

20:20 But one of the things I liked about it is they talked, they spent a little bit of time talking about why you want to use black or something else.

20:28 And I'm finding this more and more as a team lead that just it's not great to have, like if you're doing code reviews, you don't want to have like style be part of the code review.

20:40 It's way better to have a tool just dictate the style.

20:44 And so people can argue with the tool instead of arguing with each other.

20:47 - Yeah, it's like if the code review, the people there, I'm sure they feel like, well, I have to make a constructive or critical comment about something.

20:55 shouldn't be "why are you indenting like that?" or "why is there not a space by those commas?" Like that's the stuff machines can agree upon and just do for us, right? Like have architectural or algorithmic conversations, right? Yeah, you should be using three double quotes there instead of one. So get off the style police and use an auto formatter instead. I love black, a lot of people do, but there's reasons for some people like an established code base or other predefined style guide that maybe it's too much.

21:24 It does do things that sometimes I don't like it to do.

21:27 So there's a couple other options, and this article talks about AutoPep8 and YAPF.

21:35 Now AutoPep8 is essentially just, it just does Pep8, or uses PyCode style, the utility, to detect Pep8 violations and just change the code.

21:45 You can do both with it.

21:47 It does less than black, but it doesn't do much more.

21:50 So if really you're just trying to stick to PEP8, maybe that'd be better to use.

21:56 And the other end of it is YAPF, which is a tool out of, I don't know how to say that.

22:01 Yap-oof? - Yap-oof.

22:02 - It's probably yet another Python formatter.

22:05 - Yeah, it probably is.

22:06 - It's a Google tool.

22:07 I think it's Google.

22:08 I think it's good if you want, it's got a lot of knobs and dials, a lot of customization.

22:12 So if black doesn't have enough controls for you and you really want to tweak it to be your personal company's code style, this might be great for you.

22:21 In the documentation it says it takes away some of the drudgery in maintaining your code and what just ultimate goal is to code is that it produces as good a code as that a programmer would write if they were following the style guide.

22:36 That sounds pretty good, honestly.

22:37 One of the interesting things, I was researching this story is I didn't know this about Black.

22:43 after it's changed your code, it does a check to see if the reformatted code still produces a valid abstract syntax tree that is equivalent to the original.

22:55 That's pretty cool. I didn't know it did that.

22:57 Yeah, that is cool. So run it through the Python parser and turn it into bytecode and then just see if the essence is the same, which yeah, I mean, because you don't actually want to change the meaning of the way the code actually gets interpreted, it's just formatting, right?

23:10 So the meaning changes like, well, that might be a problem.

23:13 - Yeah.

23:14 The other thing I wanted to highlight this article for is it took a few code examples and just did the, what does black change it into?

23:20 And what does YAPF change it into?

23:22 And what does AutoPIP change it into?

23:24 - Oh, that's sweet.

23:25 I like that.

23:26 - Yeah. - Very, very cool.

23:27 All right, well, that's all of our main items.

23:28 You got anything else you want to throw out there while we're here?

23:31 - No, you?

23:32 - Yes, a couple of things.

23:33 I'm getting excited for PyCon US.

23:35 It's earlier this year in April at some point, I'm guessing.

23:39 But the announcement I want to make is that the applications for financial aid are open and they'll be accepting them through January 31st, 2020.

23:48 So 30 days into a world with only Python 3.

23:52 The Python Software Foundation and PyLadies are making this financial aid possible and check it out.

23:57 Yeah, so like PSF is contributing $130,000 towards that.

24:00 And yeah, it's pretty good.

24:02 So if you're thinking, hey, I would really love to go to PyCon and make some connections, head into this world, use some networking and learn more about it, but I just can't justify the expense or afford it, maybe do that.

24:13 - Yeah, nice.

24:14 - Indeed, indeed.

24:15 And I'm working on some new courses.

24:16 I got one that's all done and recorded, just getting edited.

24:19 Another one, I spent like six contiguous hours recording videos yesterday.

24:24 That doesn't sound like a lot of time if you haven't done it, but six straight hours recording, that's a lot, so I'm really, really excited about what's coming out.

24:29 We'll share more with it when I can.

24:31 - Very exciting.

24:32 - Oh yeah.

24:33 Now, sometimes we have really short jokes.

24:36 I see that you have one.

24:37 - We got a short joke that was contributed by Eric Nelson.

24:40 Thanks, Eric.

24:41 It is a math joke.

24:42 The joke is, "I is as complex as it gets." - I love it, I love it.

24:50 Studied a bunch of complex analysis and things like that when I was doing math and yeah, I like it.

24:55 - Yeah, we have another one too that it's long.

24:57 - It's long and I'm not gonna be able to do justice to it, so you have to check this out.

25:02 So you know the song "American Pie," right?

25:04 - Yes.

25:05 "Heavy to the levy, but the levy was dry." That sort of song.

25:08 - Yeah, you can sing it.

25:09 - No, no, I can't sing it.

25:10 I could recite it.

25:12 If I sing it, it's not gonna be singing.

25:13 It's gonna be something else.

25:14 There's another one.

25:15 One of our listeners, I only know his username on Reddit, I'm afraid, I can't even find the tweet in time.

25:22 Wait, said, "Hey, you inspired me to write this song "called 'American Pie, American P-Y'." And it's basically the story of Legacy Python done to American Pie the song.

25:35 - Yeah, it's pretty awesome.

25:37 - It's really, really well done.

25:38 I'll just like recite a little bit here, one of the verses.

25:41 So, "Bye bye to your legacy pies.

25:44 "Made decisions about division, so you'll have to revise.

25:47 "And UDecode's official, it's not a bunch of bite lies.

25:50 "Singing that'll be the day it dies.

25:52 "That'll be the day it dies." It's really good, yeah.

25:54 People should check it out.

25:55 If somebody can perform this and give it to us, he's given us permission to take that and put it on the air.

26:00 If it's good enough, man, we'd love it.

26:01 That'd be awesome.

26:02 - I cannot do this.

26:03 - I want somebody to sing it.

26:04 'Cause it includes the phrase, "I was a crusty old fart coding guy." (laughing)

26:11 - You could be a YouTube sensation if you just take this chance here.

26:16 Jump on it.

26:17 - Yes, and if you do, let us know.

26:18 - Yeah, for sure, let us know.

26:19 That'd be awesome.

26:20 All right, well, yeah, this really nice song and a nice job there.

26:26 Well done on that.

26:27 And Brian, thanks for everything.

26:29 Thanks for being here. - Thank you.

26:30 - And sharing this.

26:31 Yep, you bet.

26:32 Thank you for listening to Python Bytes. Follow the show on Twitter @pythonbytes.

26:36 That's Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news item you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout for sharing something cool. This is Brian Okken, and on behalf of myself and Michael Kennedy, thank you for listening and sharing this podcast with your friends and colleagues.

Back to show page