#208: Packaging, Making the most of PyCon, and more Transcript
00:00 Michael Kennedy: Are you going to PyCon or a similar conference this year? Join me and Kenneth Reitz as we discuss how to make the most of PyCon, to what makes it special for each of us. We also cover a buffet of other topics: packaging, pipenv, developing Python on Windows, async and await, and more. This is Talk Python to Me, Episode 208, recorded April 3rd, 2019. Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the ecosystem, and the personalities. This is your host, Michael Kennedy. Follow me on Twitter, where I'm @mkennedy, keep up with the show and listen to past episodes at talkpython.fm, and follow the show on Twitter via @talkpython. Hey folks, a quick announcement. The Talk Python training application has been out for a week or so, and the reception has been great. Many people have let us know that the offline access and native mobile device experience has been a big boost for them. It's also rewarding to see so many people joining the free Python courses that we offer right in the app. Just create an account, log in, and tap the free courses you want, or access the ones that you've purchased. Check it out at training.talkpython.fm/apps. It's 100% free, the Android app is out right now, and we're publishing the iOS version to the App Store tomorrow. Now, let's chat with Kenneth. Kenneth, welcome to Talk Python.
01:28 Kenneth Reitz: Hi, Michael.
01:29 Michael Kennedy: It's great to have you back. I know we're going to have such a fun time talking about a whole bunch of things. How have you been?
01:34 Kenneth Reitz: I've been well. I've also been... Things ebb and flow.
01:37 Michael Kennedy: Yeah, that's certainly the way of things, isn't it? Well, I'm glad you're doing well now. It sounds to me like you're coming to us kind of like from some radio past here.
01:46 Kenneth Reitz: Yes, I'm coming to you from the Transatlantic accent of the 1950s. You might not know that the old radio voice that you hear, it is the responsibility of two different factors. One of them is this microphone. I'm using an Astatic microphone. This is the model number D-104. I found it in an antique shop. It doesn't use XLR, but I've made my own XLR connection for it, and it is a crystal microphone, and it sounds absolutely wonderful. That is responsible for the 50s sound. The other component is they actually trained people to speak in something called the Transatlantic accent. It was supposed to be something, that old style of speaking you would hear in movies. It wasn't the way people talked. It was actually, you would go to school and you would learn how to speak this accent if you wanted to be an actor or an actress or work in media, so just a useful piece of information there.
02:34 Michael Kennedy: That's so interesting, I had no idea. It's fun to have a bit of a blast from the past and I'm pretty impressed you made your own XLR cable. That's cool. People know you from many of the popular projects, probably the biggest being Requests, but a bunch of others, Pipenv and Responder and some other things. So maybe we won't, there's too much...
02:53 Kenneth Reitz: Some other things.
02:54 Michael Kennedy: Like a whole bunch of other stuff. Don't want to make it a catalog, but maybe we won't go in so much to how you got into programming, 'cause you've been doing it for a whole long while.
03:04 Kenneth Reitz: I think we mentioned it on the other show how I got into it, right?
03:07 Michael Kennedy: Yeah, exactly. The story, it's in a previous episode that we already talked about. That's right. So maybe let's just catch up with you on what you're up to today. I believe when I spoke to you previously, you were at Heroku, and now you're hanging out over in the DigitalOcean space. What are you doing?
03:23 Kenneth Reitz: Yeah, I'm deep in the sea at DigitalOcean. I'm a developer evangelist, advocate, actually, that's my title. I'm a senior developer relations advocate over at DigitalOcean, and I spend my day-to-day interacting with developers and helping understand them and their needs and helping communicate that to the brand, and helping communicate the brand to the developers. So it's a good thing.
03:43 Michael Kennedy: Yeah, that sounds super fun. How much of that is Python and how much of that is Linux? How much of that is like DevOps? What's that look like?
03:51 Kenneth Reitz: It's really to be determined. I'm still figuring that out. At first, it seemed like this was going to be more Python than I thought, just because my audience is Python and it's what I'm really good at, and Python is part of the Linux Standard Base, and that's really important. Python, as part of the Linux Standard Base, and what that means is you don't have Linux without Python. If you remove Linux from Python or Python from Linux, you don't have Linux anymore. It's not Linux. Linux is not Linux without Python installed in it. So that is an important distinction that a lot of people don't realize. That's why a lot of these key distinctions about what decisions we're making in the Python community versus 2 and 3, and like what are we going to call the binary and these different distributions is really important because Linux depends on Python to function. It's like Bash except for way more powerful, and more and more expressive, and I love Bash. Bash is one of my favorite languages because if you're operating with subprocesses inherently, then you use Bash, but if you're doing anything else, then you use Python basically. That's my policy.
04:57 Michael Kennedy: All right, that's a cool idea.
04:58 Kenneth Reitz: Yeah, and so I'm in the, as far as my job is concerned, I want to work with developers and I have this coworker named Eddie Zaneski who's a great guy, who goes to a lot of conferences and he's managing the developer relations team, and I don't report to him, but he kind of oversees some of the strategies of what we're doing and kind of lower level strategies, and he is focused on Kubernetes, and so he's really in depth in Kubernetes, so I tried to get into that world and I focused a lot. I tried to write an operator, and I kind of got beat up. I got really far actually. I learned a lot, and I got really advanced in some advanced Kubernetes stuff, but I learned where my place is, and my place is I want to focus on the deployment experience of a Droplet, and its like accessibility of the people using Droplets, and just enabling the developers of people who are using Linux to have a great experience, and that's people who are using Python too. So I think that it all kind of fits together into the big picture, so I'm supporting Python people as much as I always have. I also want to support general Linux usage and their education, 'cause that's another big thing my community team does is write those great tutorials that everyone knows and loves.
06:12 Michael Kennedy: Yeah, the tutorials there really are fantastic. Often I'll be just randomly searching the internet for like, how do I do this with Ubuntu, and I end up like right there with you guys.
06:21 Kenneth Reitz: Well, thank you very much. My team is responsible for that.
06:23 Michael Kennedy: Right on.
06:24 Kenneth Reitz: I'm not claiming anything, it's a different part of my team, but it takes a significant effort to maintain that. Some of them will be at PyCon, some of the editorial team, so feel free to reach out to me and I'll point you in the right direction to talk to some of the people that help maintain those articles, because writing them is one thing, but keeping them up-to-date is another thing.
06:42 Michael Kennedy: Yeah, yeah, yeah, for sure.
06:42 Kenneth Reitz: So it's an interesting problem to solve.
06:45 Michael Kennedy: Yeah, some of them even have dropdowns, right? Like this version of Linux, like 18.04, 16.04, 16.10 or whatever, and like that's a whole 'nother level. That's pretty impressive.
06:56 Kenneth Reitz: I've never seen that on any other knowledge base.
06:59 Michael Kennedy: No, I haven't either. Maybe under documentation, right? Versions for dot, but not for just random tutorials. It's really cool.
07:06 Kenneth Reitz: Yeah, a knowledge base is never old, maybe it for a project, right?
07:11 Michael Kennedy: Yeah, exactly. Exactly.
07:11 Kenneth Reitz: Yeah. I can do other things. You want me to talk about that?
07:15 Michael Kennedy: Yeah, absolutely. Let's talk about some of your open-source stuff that you've been up to lately.
07:19 Kenneth Reitz: Not much. I want to focus on the things that are unrelated to that, so I'll talk about the open-source project that I'm excited about, which is called PyTheory. I basically wrote a system that is capable of representing any music system, musical system.
07:35 Michael Kennedy: Nice.
07:36 Kenneth Reitz: It has one built-in called Western, which is a diatonic system, which means it uses 12 notes per octave. It does make an assumption that you're using octaves, but that's kind of a base assumption. I'm not aware of any musical systems that have like double octaves or anything like that. I'm sure they exist, or could exist, but one thing at a time. So you could have another system that has, say, eight per octave or seven or two, and so those can be put in very easily at fifth strings, you define a system. And then you have notes, and the notes represent tones, and the tones represent frequencies, and the frequencies represent symbols. Actually, the tones represent some math formulas, actually, and the math formulas can be represented by pitches, and the pitches can be represented by decimals or symbolic. It's this very accurate math and music theory stuff. IPython Notebook is linked to in the readme where I use it to find correlative musical keys, so if you have A minor, it's the same, it contains all the same notes as C major, right?
08:48 Michael Kennedy: Right.
08:48 Kenneth Reitz: That's all the white keys on the keyboard. So like how do you find that out? I don't know how to find that out, so I told my computer to find out for me. So I can put in like F#, F minor, and it'll tell me what other keys use the same notes. Which is really useful if you're sampling, for example, if you have like a sample that's in G minor and you're like, can I use this in my song? Does it fit? Then you can plug it into my little IPython Notebook and it'll tell you.
09:13 Michael Kennedy: Interesting. It's kind of like the design color wheel of music, where you pick like one spot and it'll say, these are like the complementary colors, this is like the complementary sounds and notes and so on.
09:23 Kenneth Reitz: This is one application of it. It has infinite applications, and no one's really using it because no one understands it. But it's a really cool library.
09:31 Michael Kennedy: Yeah, it's cool. There's a bunch of people doing like theoretical musical analysis with Python these days, actually.
09:38 Kenneth Reitz: I think they would find the library useful if they knew it existed. So basically, I wanted to talk about it.
09:44 Michael Kennedy: Yeah, that's awesome. So PyTheory, that's cool. I'll put a link in the show notes as well. Have you seen the FoxDot live coding musical performance stuff?
09:50 Kenneth Reitz: Yes. Yeah, I played a lot with a few of those. There's the one that uses like Erlang. No, what's the Java, Scala? No, there's the JVM language that is based, that looks like Scheme. What's that called?
10:05 Michael Kennedy: Yeah, I don't know. I've done Scheme, but I haven't...
10:07 Kenneth Reitz: I'm sorry.
10:07 Michael Kennedy: Yeah, yeah, it's all right.
10:09 Kenneth Reitz: There's a live performance thing that's like that, but Fox, I think the Fox one might be that.
10:13 Michael Kennedy: Nice.
10:14 Kenneth Reitz: I'm trying to be too accurate. I'll be more casual.
10:17 Michael Kennedy: No, those are really fun, watching those, but this sounds more like formal analysis, not just like, let's make some noise. And then also you've been probably doing a lot of photography. I know you're big into photography.
10:28 Kenneth Reitz: Yeah, I'm doing a lot of photography and I'm doing a lot of videography lately. I have a GoPro, and it's my new favorite device. The GoPro Hero 7 is fantastic, and that company does not get enough credit. I have not done any research at all, I just use the damn thing and I love it, and it is so seamless and they have put so much thought into the hardware as well as the software that I am making a claim that they must, the only company who put that much thought into things is Apple and potentially Olympus and Leica, and a few other, Fuji, potentially. Those are the companies I'm aware of who puts that much thought into things. So I think they have engineers that used to work at Apple or Nest or stuff like that.
11:09 Michael Kennedy: Sure, yeah, that's cool. Those are incredible devices, I mean, just the quality and stuff.
11:14 Kenneth Reitz: It doesn't need a gimbal. It's amazing. That's how they sell it, is that it doesn't need a gimbal. You can like violently shake it in your hand and it doesn't need a gimbal. But on top of that, that's not the cool part. The cool part is like the workflow is so seamless. I don't have to plug it in, it just syncs over Wi-Fi and I can just share the videos. I don't have to edit them. You can change the thing that it makes, but it just makes this amazing montage video that's like exactly what I wish I could do out of the box, so I can upload a blog every day and it takes me like, takes about a half an hour to wait for it to sync and to make sure that there's nothing that I don't want uploaded uploaded, but it's just a great workflow experience. They know what they're doing, and they don't get enough credit for that.
11:52 Michael Kennedy: Yeah, cool, well, I've definitely considered using them, not in the technical space, but definitely considered using them for some things and it seems great.
12:00 Kenneth Reitz: So if you see me at PyCon, I will have a GoPro and I will be filming you.
12:03 Michael Kennedy: Oh, right on. Are you going to do like a live walk around vblog-type thing?
12:08 Kenneth Reitz: I'm going to be vlogging and I'm going to be heavily documenting PyCon, yes.
12:11 Michael Kennedy: Right on. That'll be cool, definitely.
12:12 Kenneth Reitz: I mainly wear bright colors, so it'll be very evident that I'm making an appearance, and I want to not disturb anyone who doesn't want to be filmed, obviously, so it'll be an interesting balance between those two things.
12:24 Michael Kennedy: So you'll have to put some big bright lights on you so it's obvious you're a camera person.
12:27 Kenneth Reitz: Yeah, well, I'm practicing wearing bright colors and bright shoes and I painted it orange so it'll be pretty bright, so we'll see.
12:35 Michael Kennedy: No, it sounds super cool, and I'm looking forward to checking out the video. That's going to be great.
12:38 Kenneth Reitz: Thank you.
12:38 Michael Kennedy: Yeah, another thing that we were talking about right before we hit record that you've been up to that is maybe a little bit different for folks is you've been doing a lot of c:\, not so much $ these days, right?
12:50 Kenneth Reitz: I have. I'm using PowerShell because I'm running Windows 10 as my main and only operating system. Well, no, I use all operating systems everyday, but, including Android.
12:59 Michael Kennedy: Your primary.
13:00 Kenneth Reitz: My primary operating system is Windows.
13:03 Michael Kennedy: That's super interesting. I used Windows as my primary operating system for a long time. These days, I'm on my Mac for development and Linux for production, but what's the story there, like how'd you get onto Windows?
13:14 Kenneth Reitz: I'm not sure why I did it. I did it because I was bored, mostly, and it was a challenge, and supportive reasons I could give, like playing games is one, but I don't really do that.
13:26 Michael Kennedy: It's just an excuse.
13:28 Kenneth Reitz: It is an excuse, yeah. I really enjoy it and I'm really hyper-efficient in Windows, and Windows is not what it used to be. It's actually a better operating system than macOS, I'll say. It's not as well designed when it comes to some of the polish, but it's so much more powerful, and I'm going to make some assertions in that way and very simple and I want to explain them.
13:47 Michael Kennedy: All right.
13:48 Kenneth Reitz: But WSL is a very powerful system that is better than having the system built on Unix. It's better to have an operating system built on itself, and that you can dip into Unix at any time.
14:02 Michael Kennedy: Right, so just for folks listening, just to set the context, WSL is Windows...
14:06 Kenneth Reitz: Subsystem for Linux.
14:06 Michael Kennedy: Subsystem for Linux. Yeah, so this is like, basically you go to the Windows 10 store and you say I want Linux. Here's a couple distributions. You say yes, Ubuntu or whatever. You're good to go.
14:17 Kenneth Reitz: Basically if you're saying you click, or you want Ubuntu, you click install, after you change a few settings, and then you have Ubuntu available, and then on the command line, whenever you're in the command line, which you've set up to look pretty, I have a pretty shell just like all of you do, and it has git status, just like all of you do, it's very easy to set up, and I type wsl space, and any command I run runs in Linux, and it just runs in line.
14:40 Michael Kennedy: That's cool.
14:41 Kenneth Reitz: So if I want to type wsl space ls, it runs it in Linux and just returns, and I just ran it in Linux. If I want to run a regular ls that's in my Windows system, I run ls. And if I want all the Linux command utilities, I get them from installing git bash and I just tell it to install it. There's like the third option when you're installing it is run it from the command line prompt instead of from msys or whatever, and it gives you all the Linux command line tools in Windows, so it just like gives you the perfect setup really easily, and you type wsl space and then I could type, if you don't have wget installed, like for example, on Windows, you just do wsl space wget, or you just type wsl enter and it drops you into your shell, so it's just perfect.
15:25 Michael Kennedy: Right, that's super cool.
15:26 Kenneth Reitz: Current directory gets passed along and all that stuff.
15:29 Michael Kennedy: I think that's great. I've heard about it, I haven't done a ton with WSL, but it sounds pretty neat. This portion of Talk Python to Me is brought to you by Linode. Are you looking for hosting that's fast, simple, and incredibly affordable? Well, look past that bookstore and check out Linode at talkpython.fm/linode. That's L-I-N-O-D-E. Plans start at just $5 a month for a dedicated server with a gig of RAM. They have 10 data centers across the globe, so no matter where you are or where your users are, there's a data center for you. Whether you want to run a Python web app, host a private Git server or just a file server, you'll get native SSDs on all the machines, a newly upgraded 200-gigabit network, 24/7 friendly support, even on holidays, and a seven-day money-back guarantee. Need a little help with your infrastructure? They even offer professional services to help you with architecture, migrations, and more. Do you want a dedicated server for free for the next four months? Just visit talkpython.fm/linode. I think it is great that you're working in Windows. So many people use Python on Windows, right? We need developers working there as well.
16:38 Kenneth Reitz: The problem that this really solves for me is I never have to add Python Windows compatibility to any Python software I'm building now.
16:46 Michael Kennedy: Exactly, yes.
16:47 Kenneth Reitz: 'Cause it's built in from day one.
16:48 Michael Kennedy: You do that as you develop it, right?
16:50 Kenneth Reitz: Exactly, Responder was built completely in Windows, so I don't have to add Windows compatibility.
16:54 Michael Kennedy: Yeah, and that's exactly why I was excited to hear you doing this, right? Because so many folks only work in Linux or they only work in some variation of macOS and Linux, and then poor sucker that comes along and wants to use this project on Windows, and then they hit some corner case that doesn't work and it's frustrating, right?
17:12 Kenneth Reitz: I will add a quick asterisk. It is very, very painful if you want to do low-level programming, because I want to build a, there's the Love2D library that is for building games, and I want to port that to Python. I can't do it myself. I think I might approach the PSF to see if they will fund this happening and I can organize it, and I cannot figure out an easy way to do this on Windows. I think I need a Linux or a macOS system in order to easily just build the binary.
17:40 Michael Kennedy: 'Cause the binaries are too tightly tied to that OS, that kernel?
17:44 Kenneth Reitz: Unless I drop completely into WSL, which I want to avoid.
17:49 Michael Kennedy: Right, right. That's not really building it for Windows, right? That's like making it run on Windows.
17:53 Kenneth Reitz: Yeah, unless I use Visual Studio, which I don't want to do, because I use Visual Studio Code, not Visual Studio, and I don't want to install a 14-gig IDE to run my little game. So I don't know, well, I'm figuring it out. Anyway, we can move on.
18:10 Michael Kennedy: Yeah, yeah, that sounds good. No, but I think it's pretty cool and I'm sure there's a lot of benefits that are coming out into the various projects that you're working on and giving feedback to running over there, so, super. Speaking of projects, I did talk about your most well-known one, Requests, so pretty interesting stuff you got going on there. One thing that I've been super excited about lately is async and await. It's not perfect.
18:35 Kenneth Reitz: I think it's a bit of a letdown.
18:36 Michael Kennedy: You think so? All right. I think it's pretty nice when you're doing stuff with other systems, I mean, computationally. Let's hear the counter-argument.
18:45 Kenneth Reitz: Async and await is a fantastic primitive that allows you, it gives you, it gives Python the inherent ability to give you asynchronous programming just like JavaScript has, right? Because they have async and await, and it works, and it gives you, but the community hasn't caught up yet to that. Requests, for example, doesn't support async and await, so if you want to do HTTP, you have to use some crappy HTTP library.
19:10 Michael Kennedy: AIOHTTP, ClientSession, et cetera, et cetera, yeah.
19:12 Kenneth Reitz: I'm not saying those are bad, but they're not the thing you want.
19:16 Michael Kennedy: Yeah, you're probably converting your HTTP layer to use a different thing, right? Probably it was built in Requests and now it's not.
19:24 Kenneth Reitz: And that's not a problem with async and await. Async and await are perfect primitive. It's just a community thing. It's a trade-off of effort and reward, and the effort and reward ratio is the reward of putting async into Requests is very low. The effort is very high. I'm doing it anyway. Because I like you guys, or I like you all.
19:50 Michael Kennedy: I'm very excited about this, actually.
19:52 Kenneth Reitz: I'm doing it with the help of Tom Christie, thankfully.
19:54 Michael Kennedy: Yeah, cool.
19:55 Kenneth Reitz: He's helping me out, and what we're doing is we're going to introduce Requests 3, which will be a new package called Requests 3. You'll pip install requests3, and it will have a dependency called Requests Core, and Requests Core will be a low-level library that has two functions. It'll have request and it'll have blocking request, and both will optionally accept a pool manager, which can accept the, in the pool manager you provide an event loop if you have one, and in your arguments for how many pools you want and stuff like that. You also always must provide a timeout. That's the new thing. Historically in Requests, you don't provide a timeout, it could block forever, and I'm making the assertion that, no, you must always provide a timeout because that is proper, and so that's the new thing in Requests 3. And so Tom Christie's working on Requests async, and that's coming together, and it looks like in the next probably a year and a half, we'll have it out.
20:50 Michael Kennedy: That's cool. I'm looking forward to it. I think it'll be great to have that out there, right? Like it's just one more advantage, one more feature people can take advantage of by moving to modern Python, right? And if all their stuff's built in Requests, they're like, oh, great, there's this async stuff, but I can't really use it 'cause I don't want to rewrite that layer, but now you more or less can. I mean, minor changes to slightly alter the imports and stuff but...
21:13 Kenneth Reitz: I have to make great changes. Ideally, you have to make very little changes. That's the goal.
21:17 Michael Kennedy: Yes, exactly. That's good for us, right?
21:20 Kenneth Reitz: And you can try this method out now 'cause I wrote something called Request Threads. It just spawns a bunch of threads, but it gives you the API feel of using async and await today. It uses Twisted to do that, and it works on Python 2 as well, so you can do that if you'd like.
21:38 Michael Kennedy: Cool.
21:38 Kenneth Reitz: But I did all that work and no one cared, so that's the thing. No one cares, except for the people that do care, and the people that do care are like, "It's threads, why do I care? I want real async." And so the people that want real async are a very quiet audience that care a lot, and they don't mind doing the work of doing it by hand, but I want to make their lives better anyway, so that's what I'm trying to do.
21:59 Michael Kennedy: Yeah, I think that's great. Certainly, those sorts of changes can dramatically improve the concurrency parallelism stuff.
22:07 Kenneth Reitz: The problem I'm trying to figure out is, the async stuff, all it's really going to do is help people who are doing evil things.
22:14 Michael Kennedy: Yeah, hitting a bunch of servers.
22:17 Kenneth Reitz: That concurrently, and probably up to no good. I'm just kidding. It's a joke.
22:21 Michael Kennedy: Yeah, yeah. I'm sure there will be some fraction of that which is true, but there's also all the microservices and other API stuff, right?
22:29 Kenneth Reitz: Oh, absolutely. I just guarantee Requests is used for evil. There's no doubt in my mind.
22:34 Michael Kennedy: Well, that's an interesting point, right? Like you make a ton of these libraries, right? I sometimes have these thoughts with my courses, right? Am I teaching somebody who is going to take this knowledge that I'm putting out there and turn around and go do something I would rather not help them do?
22:50 Kenneth Reitz: You are. You're equipping people with knowledge.
22:51 Michael Kennedy: I know I am.
22:52 Kenneth Reitz: That's why you have to teach them ethics too. You should add an ethics section to your courses.
22:56 Michael Kennedy: I should.
22:57 Kenneth Reitz: It's not a joke, I'm serious. That was the first thing they taught me in this computer science when I, I dropped out, but it was ethics in computer science, and it was so helpful.
23:05 Michael Kennedy: I think there's something to that. I mean, certainly, in like a screen scraping section I had, it talked about terms of services and how you work with that, and so a little bit, but it's like saying, if you're going to rob a bank, don't use my gun, I don't know. It feels like the people who really just don't, are not going to do great stuff are not really going to care. If you're going to try to write some virus or hack some system.
23:29 Kenneth Reitz: Well, it's like locks. Locks are to prevent innocent people from stealing. That's all they are, right? Cryptography is different, 'cause it can actually keep things safe, but regular locks are to keep innocent people from stealing. So that's what ethics are, when you're teaching ethics and introducing them to people in your courses, you can just introduce them as you're teaching, like remind people of ethics. As you equip them with information and power, you have to guide them, because they are being given tools that they weren't aware of before, and they're like, oh, now I could do this bad thing. They are innocent people, and you have to kind of guide them towards the light. You know what I mean?
24:07 Michael Kennedy: Yeah, I suspect that you're right, that there's a lot of folks who, with a little guidance, wouldn't do anything, but yeah, I guess it is true that...
24:14 Kenneth Reitz: I've experienced that a lot as mentoring people. As they gain power, they start talking about all the things they could do, and then I have to correct them immediately, you know?
24:25 Michael Kennedy: Yeah, yeah, yeah, yeah, check.
24:26 Kenneth Reitz: I've seen that multiple times.
24:28 Michael Kennedy: The light comes on, you're like, wait a minute. I could what?
24:30 Kenneth Reitz: And I did that myself when I was young, and so I think it happens with every developer.
24:34 Michael Kennedy: That's an interesting point. On this async and await thing, it sounds to me like what you're saying is the constructs are sound, the programming API is super sound, but what we really need for it to not be a letdown and be really amazing is for more of the libraries to take advantage of it and have it sort of more pervasive if we want to use it.
24:55 Kenneth Reitz: I know Requests needs to use it more. I'm not aware of any other shortcomings. I don't know of any other application where it's really required. Do you?
25:02 Michael Kennedy: SQLAlchemy.
25:03 Kenneth Reitz: Okay, yes.
25:05 Michael Kennedy: It would be very, I mean, if you're running a website, and it can take, synchronously, it could take...
25:11 Kenneth Reitz: Yeah, SQLAlchemy is exactly the same as Requests, basically. It's just making outbound calls.
25:16 Michael Kennedy: Yeah, I mean, it's the network call. Exactly, it's a network call.
25:19 Kenneth Reitz: Anywhere where you're making a network call.
25:20 Michael Kennedy: Right? Redis, all those network. That's exactly the thing. Anytime you're talking to something else, right? Typically that's HTTP through Requests, or it's some other thing, MongoEngine talking to MongoDB, SQLAlchemy talking to Postgres, the Redis API talking to the Redis endpoints, right? These types of things. You could massively scale out.
25:44 Kenneth Reitz: Someone's going to go ahead and build those things. They're going to listen to this podcast or they're going to notice on their own, and they're going to go out and build their own library and it's going to be called like Redis Async, and that's the problem.
25:53 Michael Kennedy: Exactly, there is a Redis Async. There's like a...
25:56 Kenneth Reitz: And that's good.
25:56 Michael Kennedy: Maybe it's called Async Redis. I'm not entirely sure, but yeah, like there certainly are.
26:00 Kenneth Reitz: No, that's not inherently bad. I think that's good that people are doing that. Some people shame people for doing that, and it's not bad. It's good that they're doing that, but that effort does need to be concentrated on the original library, and if the original library is hesitant to accept those changes, then a fork should take place, or a new library should be built that is intended to supplant it.
26:21 Michael Kennedy: Yeah, for sure. Another one is open, like the built-in open. All the file IO stuff.
26:26 Kenneth Reitz: Codex.open?
26:27 Michael Kennedy: No, just like...
26:27 Kenneth Reitz: open.
26:28 Michael Kennedy: I want to open a text file and read it, with open a text file as stream, right? Because file IO is perfect for this kind of stuff.
26:37 Kenneth Reitz: You use an iterator when you're, I iterate over open, don't I?
26:40 Michael Kennedy: Yes.
26:41 Kenneth Reitz: It doesn't block. Open is immediate, isn't it?
26:44 Michael Kennedy: I mean, it's waiting on an external, it's like waiting on disk, right? Especially if the disk is network.
26:48 Kenneth Reitz: Well, it's waiting on a system, it's waiting on a system call. I don't think you can await a system call.
26:55 Michael Kennedy: So there's a, oh, gosh, what is it called? I forgot the name. So there's an async andawait-enabled version. I think it's AIO Files. I'm pretty sure what it is.
27:06 Kenneth Reitz: Okay, okay.
27:07 Michael Kennedy: So I mean, there's just like, there's all these layers. Yeah, AIO Files is what it's called.
27:12 Kenneth Reitz: Gotcha, gotcha.
27:13 Michael Kennedy: Right. There's just like all these little parts where if that was with open, if there was like some mechanism, I don't know, like I'm not really sure how it would distinguish.
27:23 Kenneth Reitz: It's okay to block. You don't need to async all the things.
27:26 Michael Kennedy: I know.
27:27 Kenneth Reitz: It's okay to block in your async loop too. You have to decide, and that's why I think it's okay for that files thing to be there. I almost propose that someone outside of the community, outside of the standard library community, make their own async standard library and just make it a PyPI package and just curate all the little ones. It just has Redis, it has Postgres, it has files, and it's just all namespaced properly, and you just install it as one package and you're good to go. I think that'd be really a good effort for someone to make that.
28:02 Michael Kennedy: That sounds like a great, great effort. I love it. So one thing that somebody did build that I am a huge fan of is called Unsync, U-N-sync. Familiar with this?
28:13 Kenneth Reitz: No, what does it do?
28:13 Michael Kennedy: So Unsync is great. So what it does is like, you already talked about requests threads and all these things, like using threads. So you can do threads, you can do multiprocessing, and you can do IO-bound async and await programming, right? And all three of those have different APIs. So what Unsync does is it's a decorator you can put onto your functions, and if you put it onto a async function, it'll run it in an async event loop, an asyncio event loop. If you put it on a function that's not async, it'll run it on a thread, and you can also put it on a function and say it's CPU-bound, and it'll run it in a separate process, but the way you program it is all with async and await, and all those become like a unified API. I love it.
28:55 Kenneth Reitz: I might be able to use that for Requests 3.
28:56 Michael Kennedy: Yeah, you could. It's implemented in 126 lines in one file, Python.
29:01 Kenneth Reitz: Thank you. That sounds inherently useful.
29:05 Michael Kennedy: It's super cool. I really like the way it works.
29:08 Kenneth Reitz: It's on PyPI?
29:09 Michael Kennedy: Yeah, it's Unsync on PyPI.
29:10 Kenneth Reitz: Cool, I'm going to highlight that.
29:12 Michael Kennedy: I think efforts like that are good bridges, right? If some part doesn't accept it, like maybe it just automatically goes to threads, but that doesn't mean you start programming in threads.
29:21 Kenneth Reitz: Man, that's great. So it's an abstraction upon all the abstractions.
29:24 Michael Kennedy: Yes, but you still program it with async and await, and it like manages its own asyncio event loop on a background thread and things like that.
29:31 Kenneth Reitz: I love it, I love it, I love it.
29:32 Michael Kennedy: Yeah, it's pretty slick.
29:33 Kenneth Reitz: It might not be appropriate for what I'm doing, but I'll check it out for sure.
29:35 Michael Kennedy: It could be inspirational to what you're doing.
29:37 Kenneth Reitz: Absolutely, without question.
29:38 Michael Kennedy: Yeah, yeah, yeah.
29:39 Kenneth Reitz: All right, moving on. The next thing on our notes is Pipenv versus Poetry. I want to reframe that to not Pipenv versus Poetry, 'cause I don't want it to be adversarial.
29:48 Michael Kennedy: How about pip and Pipenv and Poetry as a thing?
29:53 Kenneth Reitz: No, I'll just talk.
29:56 Michael Kennedy: Shed some light on this whole world. Like Pipenv is...
29:57 Kenneth Reitz: A tool.
29:59 Michael Kennedy: It's got a lot of attention lately. It's a tool for installing dependencies and managing them using the piplock file and so on. Poetry is also in that space. Pip, we all know Pip. That just installs stuff straight up. All right, so what's the story with all these?
30:13 Kenneth Reitz: pip installs and uninstalls things. That's all it does. Pipenv installs, uninstalls things, and it manages a TOML file for you that other people can reproduce your build with a log file, and gives you deterministic builds. It also gives you the ability to write that file as you're going, so it enables an efficient workflow for building applications. It's intended for, it's called Python Development Workflow for Humans, so it's a workflow tool.
30:43 Michael Kennedy: Right, because the alternative is maybe I decide I'm going to use SQLAlchemy, so then I drop to the command prompt and I go with my activated virtual environment and I pip install sqlalchemy and I go back and I start using it, and maybe I forget to put that into a request, sorry, a requirements.txt file, or something like this, and then it doesn't work. But Pipenv, along with Poetry, when I Pipenv install a thing, it actually updates the requirements' piplock, right?
31:10 Kenneth Reitz: It will update the TOML for you, and the nicest thing about it, I want to mention that it's just managing a virtual environment for you, so you can still pip install stuff one-off if you don't want it to go into the TOML file. People don't realize that. So if you just want to one-off install SQLAlchemy for a few minutes and see if it works before you have it go into the TOML file, you can just Pip...
31:29 Michael Kennedy: Right, before I commit to it for sure.
31:30 Kenneth Reitz: Yeah, just pip install and it works. It's just a layer. But what Poetry is, and Pipenv adheres to the standards that we have set. Poetry is a different tool that solves different problems. It intends to solve the packaging problem, and it considers Pipenv to not be a packaging tool. I consider Pipenv to be a packaging tool 'cause it deals with packages. That's what it does. Poetry does not consider Pipenv to be a packaging tool because what Poetry does is it packages tools. So it takes the, I can't remember the exact name of the file, the pyproject.toml file, which is another standard for replacing setup.py, which is not the goal of Pipenv. The goal of Pipenv is to replace requirements.txt, which has its uses case. Requirements.txt is for applications, and pyproject.toml/setup.py is for applications, sorry, is for...
32:24 Michael Kennedy: Libraries?
32:24 Kenneth Reitz: Libraries, yes. A library can be an application. I have a workflow for this. If you're using Pipenv and you're building a library, you do pipenv install -e ., and that's all you need to do. It'll automatically go in and it'll grab all of your setup.py defined requirements and stick them in to your lock file for you. This is a null issue. But anyway, Poetry, what it does that it adds, is it adds a ^ operator to the definitions of the different version specifiers, 'cause they found that to be necessary from the Node.js community. That is out of spec.
33:03 Michael Kennedy: It's like this version or higher, something to this effect, right?
33:07 Kenneth Reitz: Yeah, and that's not to spec with what we have documented in the Python packaging community. So they haven't done the due diligence to add that to that, which is fine. I think it's fine for people to do stuff on their own and then catch up later, so they might have that later. Maybe we can get a caret operator into Pip, but we don't have it in Pip, so it's not valid for us. So that's why I don't like the approach Poetry has taken, mostly because of the ^ operator. But the thing that Poetry does that Pipenv doesn't, and that makes it really nice, is it lets you upload your packages.
33:36 Michael Kennedy: Right, I can say Poetry build and Poetry, was it publish? Yeah, publish. Exactly.
33:42 Kenneth Reitz: It has a beautiful website, and it's a good effort, it really is, but it's not comparable to Pipenv. It does some of the same things, but it's a different tool that does different things, and trying to shoehorn it into saying that they're the same and this versus that is not a healthy discussion, and that's why I got really upset originally when it started happening and it escalated quite quickly.
34:02 Michael Kennedy: Yeah, I remember that. It was kind of like a blow-up on Reddit or something like this, right?
34:07 Kenneth Reitz: Yeah, I didn't realize that the people on Reddit in the Python room are not the Python community, but Redditors that use Python. It's a big distinction.
34:15 Michael Kennedy: And these are not exactly necessarily the same openness or considerate-ness or whatever, right?
34:21 Kenneth Reitz: General Python rules do not apply. I got pretty thrown under the bus and attacked, and people said a lot of things about me that weren't true. It was like a hyperbolic thing where they would take a little thing and blow it up, and they said things that were slightly true, but they escalated it so to a point where it was no longer true. Does that make sense?
34:41 Michael Kennedy: Yeah, yeah, for sure.
34:41 Kenneth Reitz: Like claiming I was an artist.
34:42 Michael Kennedy: I've definitely been...
34:43 Kenneth Reitz: I definitely have an ego of some sort, but they would say I was a narcissist and a flagrant liar and all this other stuff that is not true.
34:51 Michael Kennedy: That's pretty outrageous.
34:52 Kenneth Reitz: It was right after PyCon last year, so I've recovered from that thing.
34:56 Michael Kennedy: It was like a whiplash of the good and the bad, right?
34:59 Kenneth Reitz: It was horrible.
35:00 Michael Kennedy: Because PyCon is so great. I mean, you come home from that, and you're just like, ah, I wish I was still there.
35:04 Kenneth Reitz: I don't think that'll ever happen again, and I learned a lot about PR from that too, so it was a good experience. I don't blame Poetry. The Poetry person, I can't remember, is it Sebastian? He was kind of involved with the thing that happened, but he was just defending himself, 'cause they were involving him and I was involving him, and we have a good relationship, I think, and the projects don't hate each other. It's just the people that love Poetry hate Pipenv, and that's the problem, because Pipenv is more popular and it's recommended, and it's recommended for a reason. It's because we did the due diligence to get recommended to become part of the PyPA to work with those people, and it is a political sphere and politics are involved, so you can't just be mad and yell at the man when there is no man. This is a community. They were making it an us-versus-them when it's just an us, and that's the issue at hand.
36:03 Michael Kennedy: That's not great. This portion of Talk Python to Me is sponsored by Backlog, from Nulab. Developers know the importance of organization and efficiency when it comes to collaborating on a team, and Backlog is the perfect collaborative task management software for your team. With Backlog, you can create tasks, track bugs, make changes, give feedback, and have team conversations right next to your code. You track progress with features like Gantt and burn down charts. You document your processes right alongside your wikis. You can integrate with the tools you use everyday like Slack, JIRA and Google Sheets. You can automatically register issues from email or web form submissions. Take your work on the go using their top-rated mobile apps, available on Android and iOS. Try Backlog for your team for free for 30 days using our special URL at talkpython.fm/backlog. That's talkpython.fm/backlog. So one of the interesting distinctions, I think, around Pipenv, like let's just focus on Pipenv for the moment, maybe Pipenv versus Pip, or versus requirements.txt or whatever it is, when I go and I create a piplock file and I install stuff, it like hashes it to specific versions and dependencies.
37:14 Kenneth Reitz: The Pipenv lock file.
37:15 Michael Kennedy: Yeah, yeah. Just the piplock file, right?
37:18 Kenneth Reitz: pipfile.lock.
37:19 Michael Kennedy: Yes, exactly.
37:20 Kenneth Reitz: Yes.
37:21 Michael Kennedy: So it feels like that ties everything down to a certain version and basically freezes the requirements, which is good for applications, right? I want to be able to ship my website and have it like behave exactly...
37:31 Kenneth Reitz: It's good for builds.
37:33 Michael Kennedy: Yeah, and for builds and whatnot, but not necessarily for libraries, right? Like if I want to ship Flask.
37:38 Kenneth Reitz: When you're shipping a library, you're not shipping a build. You're shipping...
37:43 Michael Kennedy: Yeah, exactly.
37:44 Kenneth Reitz: Well, you are shipping a build when you're shipping wheels, actually.
37:46 Michael Kennedy: You're shipping a wheel, yeah?
37:47 Kenneth Reitz: You're not shipping your dependencies when you're shipping library.
37:48 Michael Kennedy: Exactly, yes. You're shipping only your built version, and the dependencies are...
37:54 Kenneth Reitz: Only your single component of your build.
37:56 Michael Kennedy: Right, so it seems to me like a lot of the guidance, and you'd maybe put the right light on this, that Pipenv is more focused on helping you build applications reliably than it is for building libraries. Is that the right frame of mind or have I got it a little bit off?
38:12 Kenneth Reitz: I think that's overplayed, because you can -e ., install -e . and the workflow is perfect and it works fine. You can use Twine to upload, and then it gives your developers a synchronous, everyone's using the same exact version. All the developers are using the same version of all the libraries and that gives you a reproducible build of your development environment. So for your development environment, for your developers, that's really important, so I think it is good for building. I use it for all my libraries.
38:43 Michael Kennedy: For libraries as well.
38:44 Kenneth Reitz: I think it's good for libraries. The community is kind of, it's easier for them to understand that little phrase, but I think it's false. Nick Coghlan says it 'cause it's easier to understand, and we do focus on applications, yes. That's our target market, if that makes sense. I think that's our target market, but we work fine for either workflow. It's just our market. We're more marketable to applications than to libraries.
39:10 Michael Kennedy: Interesting. So have you thought of just taking a dependency on Twine and just passing through the arguments so that you have a Pipenv publish?
39:18 Kenneth Reitz: I want to reduce the number of commands, and that would require you to have a setup.py, which would complicate your... That would be a new file that we'd have to track, so we could do that. Let me write that down, actually.
39:34 Michael Kennedy: It seems like if the recommendation is to use Twine, I know that, obviously, you could just tell people that, right? But if you had a Pipenv publish, and all it really did was just delegate, maybe it would be a cool new aspect without a lot of work.
39:49 Kenneth Reitz: That's all Pipenv does is a lot of delegation. It has like five dependencies, but if you look, we vendor quite a lot just to reduce the installation ease, and we patch quite a lot of things too 'cause there's a lot of broken things out there and we don't have time to upstream it all, unfortunately. We have about, I'd guess, 65 dependencies.
40:10 Michael Kennedy: Wow, but a lot of them are vendored? Maybe just define that term real quick for folks who are maybe like somewhat new. What do you mean you vendor it?
40:17 Kenneth Reitz: Oh yeah, so to vendor something means to take its source and to copy it into your source.
40:21 Michael Kennedy: As opposed to, this is in my requirements file and you got to pip install their thing. You just like, we're just going to take a copy of yours and if we got to tweak it, we got to tweak it.
40:28 Kenneth Reitz: That is one use case. That's a good use case, but sometimes you do it just to, if you're building a command line tool especially, it's really good to reduce some of your dependencies because someone else might have a conflicting dependency on their machine, a different version. Or if you have a really big tool like Requests, you need to make sure that your versions are within a very small set of constraints. We're very picky about what version of Urllib3 you have installed in Requests, like very picky, because we need to be very picky about it. It used to be vendored. I removed that, and I removed certified from Requests 2 because of security concerns, because if anyone was to get access to the Requests codebase, which someone tried to do once by hacking my DNS for five minutes to intercept...
41:14 Michael Kennedy: Wow.
41:14 Kenneth Reitz: The GitHub reset email. This is a crazy story. I've blogged about it if you want to see it. They could insert something into your trusted CAs, and then every major corporation in the world who uses Requests would have a trusted CA that is trusted, and then they would get, their SSL chain would be vulnerable, and the problem, the only reason that's happening is 'cause we can't trust system certs in Python properly, which is a problem that someone's working on. All volunteer time though, so you got to be patient.
41:45 Michael Kennedy: For sure. Man, does that just like scare you to death? Do you lose sleep that maybe somebody gets into like the code...
41:53 Kenneth Reitz: I don't have access to Requests. I removed myself from Requests on PyPI for that reason, 'cause if anyone's going to try to get it, I'm the target.
42:01 Michael Kennedy: Yeah, yeah, yeah, that's true. You're going to get the spear phishing email or whatever.
42:06 Kenneth Reitz: I shouldn't say that I removed myself, because that reduces the thing but it's just a fun game I'm playing, if that makes sense. There's no actual enemy, it's just a theoretical enemy, but someone did try to compromise me, and they did it targeted.
42:20 Michael Kennedy: Yeah, but it's so, so incredibly target-rich, right? This is a open-source problem in general, this whole supply-chain sort of security, right? If you can get into, maybe not the main thing, maybe the build tools that build the main thing, right? Like if they knew they, I don't know, let's say you built yourself with Travis CI then published that, right? Maybe they try to hack Travis and only do something if they see, like it could be a long indirect chain.
42:49 Kenneth Reitz: Absolutely.
42:50 Michael Kennedy: It's super scary.
42:51 Kenneth Reitz: Any link in the chain has, any weak link is, the whole chain is as strong as the weakest link.
42:55 Michael Kennedy: Yes.
42:55 Kenneth Reitz: Right?
42:56 Michael Kennedy: It's almost too much to think about, to be honest, right? The thing is Requests is at the center of so much of data exchange that it's more scary than, say, I don't know, os.path getting like rewritten or something.
43:11 Kenneth Reitz: Call it the keeper of the crystals, and the crystals are the sacred trust of, 'cause we know how important Requests really is for the world. It really does power everything around you secretly. Like AWS uses Requests to run AWS, 'cause they use Boto to actually run AWS.
43:32 Michael Kennedy: Yeah, do you know Netflix does as well? I mean, like all these different, like so many places.
43:37 Kenneth Reitz: I think it's beautiful. I'm not doing it to tout myself at all. It's a community. We built this thing together, and I just was the person who orchestrated it and came up with the design. I'm the designer.
43:47 Michael Kennedy: Cool.
43:48 Kenneth Reitz: It's humbling, is all I have to say.
43:50 Michael Kennedy: Yeah, I'm sure that it is. It's awesome. Well, speaking of community and all that stuff, like maybe let's talk a little bit about PyCon. It was pretty interesting that you said you're going to bring your GoPro and...
44:01 Kenneth Reitz: Oh yeah.
44:02 Michael Kennedy: To me, PyCon is kind of like my geek holiday, right? It's my chance to get away, be with my people, and I have good friends who I only see at these conferences a lot of times.
44:12 Kenneth Reitz: I feel the opposite way about PyCon.
44:14 Michael Kennedy: Tell me about how you feel about it.
44:15 Kenneth Reitz: I mean, it's definitely that, but it's not a holiday. It's my geek workweek, where like my whole year revolves around prepping for PyCon and making sure that I am on my game for PyCon, and that everyone else measures their years by like New Year's and Christmas, like that time of year is where they like reset and they reflect on the past year, but for me, I do that at PyCon, 'cause that's where I learn the most about myself...
44:39 Michael Kennedy: How interesting.
44:40 Kenneth Reitz: And everybody else, and I, yeah.
44:43 Michael Kennedy: Yeah, how interesting. Yeah, it's like the Python New Year.
44:46 Kenneth Reitz: It's the week where I get to really, my online self is a real thing in real life.
44:50 Michael Kennedy: Somewhat for me as well, right? Like I sit here in this like padded foamy room that's, not that you could see, and I talk to a handful of people, but then I realize actually there's all these people who finally get to talk back to me, which I really appreciate.
45:06 Kenneth Reitz: All these like imaginary relationships that you have are actually real and they manifest in front of you at PyCon, and it's amazing. It's amazing for me 'cause like I can't get a drink of water without five people stopping me, and I love that. You're always at the podcaster's booth, and so like you're always accessible. It's great. Are you going to do that this year?
45:27 Michael Kennedy: We're going to have a booth. I haven't talked too much about the details though. We're definitely having another booth, but we've teamed up with...
45:34 Kenneth Reitz: Can I like swing by at that booth, 'cause I have a podcast too, even though it's small?
45:38 Michael Kennedy: Yes, absolutely. Well, you can definitely come hang out at the booth, but this time...
45:42 Kenneth Reitz: 'Cause I don't have a booth this year at all, so that's why I'm asking.
45:46 Michael Kennedy: No, I know, I would totally have you if we were still doing exactly the same thing, but what we're doing is, JetBrains is doing like a Python creator's type of partnership thing, so they've got like a mega-booth, like a 20-foot-by-20-foot booth with a theater and like a little table area and other stuff.
46:03 Kenneth Reitz: I should talk to them about that.
46:05 Michael Kennedy: Yeah, you should. They're having like us drop in part of the time, so instead of being at the booth like eight to nine hours a day, which is awesome, 'cause I get to meet people, it means I miss out on stuff like Open Spaces and other types of events that I want to participate in, so now we're going to be like at this booth for two or three hours each day with little presentations and whatnot, but then after that, I'm going to be out in the community more, so that's what I'm doing this year.
46:29 Kenneth Reitz: Awesome, if there's anything I can do to support you...
46:32 Michael Kennedy: Yeah, thanks, I mean, I would definitely invite you, but I can certainly put you in touch with the JetBrains people. It'd be cool.
46:37 Kenneth Reitz: Yeah, I'm going to invite myself.
46:38 Michael Kennedy: Yeah, you should.
46:39 Kenneth Reitz: 'Cause I don't have a booth and I'm definitely a Python creator.
46:41 Michael Kennedy: Yes, I agree, for sure.
46:43 Kenneth Reitz: I'll just try to play my guitar or something there and see what they say.
46:46 Michael Kennedy: That's right. Cool, yeah, so remind me to connect you after, after the show. Yeah, but I'm super excited. One of my favorite things really happens to be, besides being on the floor and these experiences, I guess like what you might call the hallway track. It's like some sort of the hallway track, right? Even though if I'm stuck at a booth.
47:03 Kenneth Reitz: I more like the expo hall track. I really like the expo hall.
47:07 Michael Kennedy: I do too. I spend a lot of time in there. I really love all the the meetings, and soon as I think, all right, this hour I'm going to go see a presentation, I'll bump into somebody, I'm like, now let's just sit down over here while it's quiet and talk, you know?
47:17 Kenneth Reitz: Exactly. I go to usually one talk per PyCon. I pick one out, and it's like, I have to see this just, usually to support the speaker, or it's like my good friend of mine, it's their first talk or something like that.
47:28 Michael Kennedy: Right, something like, that's awesome. Yeah, I do enjoy the talks, but I enjoy the connections more, also the Open Spaces. I'm definitely planning on doing a couple of Open Spaces. How about you?
47:37 Kenneth Reitz: Yeah, I'll be hosting one for DigitalOcean, which will be really wonderful. I'll use this as a opportunity to say if anyone wants to sign up for DigitalOcean, my employer, you can go to do.co/42, the holy number that is the answer to life...
47:48 Michael Kennedy: The holy number.
47:49 Kenneth Reitz: The answer to life, the universe, and everything, and it will give you a $100 credit, so you can use that to spin up some servers and prep for PyCon. Reach out to me if you are a speaker and you need some credit for your talk. We can give you some of that too. You hit me up on Twitter, I'm @kennethreitz. I'm doing an Open Space for that. I also want to do something with my guitar at PyCon, so I might do an Open Space for it, or I might do, probably do an Open Space where I just play the guitar a little bit, or I have a new mobile setup for my electronic music setup that I can play out of my backpack, so I'm probably going to do an electronic music by Kenneth Reitz Open Space, probably.
48:29 Michael Kennedy: Yeah, that sounds fun. Definitely looking forward to attending.
48:32 Kenneth Reitz: It's more than fun. I'm like super excited about that one, yeah.
48:36 Michael Kennedy: Super cool, that's awesome. What else? Do you go to the like official dinners, like the dinner, there's going to be one at the Space and Science Center, there's going to be one at the Rock & Roll Museum Hall of Fame, I guess.
48:46 Kenneth Reitz: They're wonderful and I highly recommend them, but I don't have time to go to those, unfortunately. I'm usually pretty busy.
48:51 Michael Kennedy: Yeah, it's pretty easy to get booked out, isn't it?
48:53 Kenneth Reitz: And I also, they cost money, and I don't have money to go to those. I spend all my money on stupid things like this microphone.
49:01 Michael Kennedy: Yeah. What I ended up doing is I ended up signing up for these things, and then I want to go, but often like one out of two, it'll be like, oh, but there's this other opportunity I didn't know 'cause it wasn't announced, and it's important for me to go to it, right? So like, I'll pay for it and still not go.
49:17 Kenneth Reitz: I don't want any commitments set beforehand, right? I don't know what's going to be happening that night.
49:21 Michael Kennedy: I know, but they sell out.
49:22 Kenneth Reitz: And I don't want to miss anything. Oh, I know, but I don't want to sign up for anything ahead of time because I don't know what else is going to be happening, right?
49:30 Michael Kennedy: Yeah, I know. I feel exactly the same.
49:31 Kenneth Reitz: What if Glyph is actually hosting like a brain dump hour that night? I can't miss that for the world.
49:36 Michael Kennedy: I know.
49:36 Kenneth Reitz: So would be a waste the money. I keep my schedule open as much as I can.
49:41 Michael Kennedy: That's cool. What do you think about Cleveland and the venue there? Did you enjoy it last year?
49:45 Kenneth Reitz: I did. It's not as good as the other places I've been. Cleveland is great. The reason I say that, though, is 'cause I was in an Airbnb and I had to drive in every day last year, so this year I'm in the Hilton, which is right next door, so I think I'll enjoy it a lot more.
49:55 Michael Kennedy: Yeah, I'm in the same hotel. It's literally attached with a tunnel, so it's nice.
50:00 Kenneth Reitz: Oh, really?
50:00 Michael Kennedy: Yeah, and there's a cool like rooftop bar up there that overlooks the Great Lakes. It's pretty nice there.
50:05 Kenneth Reitz: One of the hotels, like five times last year, I think it was, it's the other hotel that's attached.
50:10 Michael Kennedy: I'm not sure, I don't remember.
50:11 Kenneth Reitz: I must've eaten at the Hilton. It was not cheap, but it was delicious.
50:15 Michael Kennedy: I really enjoyed the venue. I'd never been to Cleveland before, and I thought the city was friendly and I thought the place...
50:23 Kenneth Reitz: Oh yeah, the convention center was great.
50:24 Michael Kennedy: Convention center was great, the extra outings were good, so I'm looking forward to going back there.
50:29 Kenneth Reitz: I liked Montreal a little better. The convention center in Montreal was worse, but the city of Montreal was great, but I liked that the centralism of Cleveland, I feel like you bump into people more when you're out, so that's good.
50:40 Michael Kennedy: Yeah, for sure.
50:42 Kenneth Reitz: Portland is my favorite.
50:43 Michael Kennedy: Not mind it being in Portland, man. It was like a 12-minute drive from my house to go there. That was the right amount of travel.
50:50 Kenneth Reitz: Well, that's ideal. I remember that, we did a podcast, I think.
50:54 Michael Kennedy: Yeah, we sure did. Yeah, we definitely did. I got to do things like I set up like a PyCon hike through the like little mountains next to the city and stuff.
51:02 Kenneth Reitz: Oh, you got to host stuff 'cause it's your place.
51:05 Michael Kennedy: Yeah, and like, I mean, I don't know anything about Cleveland. What am I going to do there, right?
51:09 Kenneth Reitz: I think when I was there, was there like a Zen garden in Portland?
51:13 Michael Kennedy: There's two things you might call that. There's one called the Chinese Garden and one called the Japanese Garden and they're quite different, but they're both sort of in that...
51:19 Kenneth Reitz: I went to the Japanese one one morning.
51:22 Michael Kennedy: It's amazing, isn't it?
51:23 Kenneth Reitz: With some people. I don't know what the group is called, but we went over there and it was so, so peaceful.
51:29 Michael Kennedy: I definitely enjoy going there. I was there about a month ago and just, I'm like, I could really spend a few hours by myself here. This is great.
51:36 Kenneth Reitz: Yeah, I was there with Jack Diederich and I had a great time. He's a great man.
51:39 Michael Kennedy: Yeah, awesome. What else you do that maybe people don't know about at PyCon that maybe would make their experience better?
51:46 Kenneth Reitz: The hallway track is great. Do the BOFs. If you hear someone say BOF, it means Open Space. It means Birds of a Feather, so that's a keyword that you might, a key phrase that you need to know. Let's see, other things that are hidden at PyCon.
51:59 Michael Kennedy: Sprints?
52:00 Kenneth Reitz: There's this scotch BOF, which is a hidden event that no one knows about.
52:03 Michael Kennedy: Ooh, nice.
52:05 Kenneth Reitz: There's actually two of them last year, so there's a even more hidden. There's the original scotch BOF.
52:10 Michael Kennedy: There was the fake one to like block the, and then there was the legit one that was even behind the fake facade, hidden facade? I see.
52:17 Kenneth Reitz: Yeah, and it's a storytelling event that involves lots of very high-end scotch. I actually went one year and I didn't drink at all, I just drank water 'cause I wasn't drinking. I don't drink anymore. I don't like alcohol at all. But I was very welcome. It's an Open Space, and it's kind of outside the PyCon sanctions, so the stories are a little, no, they're not, it's still inside of PyCon sanctions, but it's drinking, so you expect what you expect. Yeah.
52:44 Michael Kennedy: Yeah. What are you going to get if you go drink a bunch of whiskey?
52:47 Kenneth Reitz: Yeah, exactly, it's one of those kinds of things.
52:48 Michael Kennedy: Come prepared for that experience.
52:48 Kenneth Reitz: Come prepared for that, exactly. Everyone's very kind and respectful, though.
52:53 Michael Kennedy: Yeah, yeah. And sprints, are you doing a sprint, or are you participating in any sprints?
52:56 Kenneth Reitz: DigitalOcean is actually sponsoring the sprints, and I'll be there. I'll have my media laptop with me or my iPad, and I'm going to be probably working on video stuff, but usually at the sprints to support everyone else, and just be an interruptive force. Or non-interruptive force, ideally, but people, I usually kind of sit near Flask if I can in those groups, and I'm going to be potentially doing a photo booth during the sprints where I have my camera and I have a little two-by-three printer that I can print things on the spot from, so I want to do headshots of people in a side room or something like that.
53:31 Michael Kennedy: Oh, cool. Yeah, nice.
53:32 Kenneth Reitz: Yeah, I thought that'd be kind of cool.
53:34 Michael Kennedy: Yeah, it sounds super cool. I was planning on spending a couple days at the sprints, but I think I'm only going to be able to spend one now. It turns out I'm going straight from PyCon to Microsoft Build, and doing like a podcast.
53:42 Kenneth Reitz: Oh, cool.
53:45 Michael Kennedy: There's like a podcast row there, and they invited me to go out there, so just so happens to be it's all at the same time, but...
53:51 Kenneth Reitz: That sounds like a great event.
53:52 Michael Kennedy: Yeah, it'll be, it's super different than PyCon.
53:54 Kenneth Reitz: I'm a big Microsoft fan. That's a breakfast event, not a dinner event.
53:59 Michael Kennedy: Yes.
54:00 Kenneth Reitz: .NET developers are very breakfast-type people.
54:03 Michael Kennedy: Yeah, exactly.
54:04 Kenneth Reitz: They get up early instead of stay up late.
54:05 Michael Kennedy: Yeah, I can imagine. So it's going to be fun. Basically, I'm going to go there to talk Python with all those folks, see what they're up to. They've great stuff happening with Python over there. You got Steve Dower, Brett Cannon, Zakharenko. Lot of cool stuff.
54:17 Kenneth Reitz: I'm good friends with Nina. I've known her for years. I think she's a doing good, that's a cool team she's on, the Cloud Developer Advocates.
54:26 Michael Kennedy: Yeah, it definitely is cool.
54:27 Kenneth Reitz: They sponsored Requests, actually.
54:29 Michael Kennedy: Oh, really?
54:30 Kenneth Reitz: They're one of the biggest sponsors for the Requests 3 development.
54:33 Michael Kennedy: Wow, that's cool. Have to say thank you to them for that. That's great.
54:37 Kenneth Reitz: Yeah, pass my message along.
54:38 Michael Kennedy: Yeah, absolutely. So yeah, I'm definitely looking forward to PyCon and looking forward to seeing you there as well. Another thing I did want to ask you about while we have a little time together is since we spoke, there was the whole Guido stepping down, the steering council being formed and all of that. Maybe just give us your thoughts on what happened there. Did you see that as just like a natural evolution, or did you see that as like a, oh crap, what's up with our community, is this going to be really bad, or what were you thinking?
55:05 Kenneth Reitz: Well, I thought it could have gone really badly. It didn't. It was really beautiful what occurred, and I think it was a really interesting sociology thing if you actually look at it objectively, because what occurred was there was a community that had a leader that it trusted who stepped down and gave the community an opportunity to evolve into a self-organized community, into a democracy, effectively, but he did not give it any direction on how to do so. He did not say, this is how you determine the vote, this is how, that type of thing. That's the best practice that should have occurred, but he was dealing with his own stuff. I'm not accusing Guido of anything for not doing that. It would have been very helpful if he did. Because he didn't, though, we had to self-organize and determine, without direction, a voting process, a decision process, how to decide how to decide.
55:55 Michael Kennedy: Yeah, it was a very meta-type of thing. First we have to decide how we're going to even decide stuff, then we got to elect people to make the decisions, and there was a lot of layers to unpack there.
56:04 Kenneth Reitz: And we had to scope it. Who's qualified to make the decisions on who's qualified to make the decisions?
56:09 Michael Kennedy: Yes, exactly, exactly.
56:12 Kenneth Reitz: So that was really beautiful, and I think it went really, really smoothly, and I think it went great, and I think we're in really good hands.
56:17 Michael Kennedy: I do too. I'm really happy to see who's on the steering council. I think it's going to go well. And I'm also happy that Guido is still core developer and part of it and stuff, that he's participating.
56:28 Kenneth Reitz: He's on the steering council, isn't he?
56:29 Michael Kennedy: Yeah, yeah, he is, yeah.
56:30 Kenneth Reitz: That's perfect, that's perfect. I wasn't expecting that, and that was a surprise to me.
56:34 Michael Kennedy: That was a surprise to me as well, but I felt like...
56:36 Kenneth Reitz: It's appropriate.
56:37 Michael Kennedy: He's certainly appropriate, right? You talked about this Reddit.
56:40 Kenneth Reitz: I did the same thing for Pipenv. I did a relinquishment of BDFL power recently, where I don't have BDFL power anymore, and it's just a logical next step, I think, when you have a BDFL, is to let go of it eventually.
56:54 Michael Kennedy: Right, once the community is strong enough and whatnot.
56:57 Kenneth Reitz: There's too much political weight on the BDFL, and so all of the good things that happen in Python can be assigned to you, which is good, or in the project, like Pipenv or Prython, but all the bad things that can happen also can be assigned to you, and all the negative connotations. So like a new thing like a walrus operator being added can cause a flame war and everyone's like, you or you suck, you suck, you suck, and so that is why he wanted to step down probably, but it's just my opinion, because that's why I wanted to step down. This Pipenv stuff is like, it's not just me. I'm not the one who's maintaining it anymore day to day. I just want the ability to say, I want the thing you suggested, like Twine upload, to be built in, but I can do that without being the BDFL. I'm just like a senior project manager of the project, right?
57:43 Michael Kennedy: Exactly.
57:45 Kenneth Reitz: So I just stepped down as the BDFL, and now it's no longer a Kenneth Reitz project, it's just a PyPA project.
57:48 Michael Kennedy: That's cool.
57:51 Kenneth Reitz: And so that's what Guido did too. Now it's a Python problem, not a Guido problem.
57:54 Michael Kennedy: I don't know how you feel about it, but to me, it is tough to take some of that criticism and that negativity.
58:01 Kenneth Reitz: I'm an INFP.
58:03 Michael Kennedy: Every time that somebody tells you, good job, Michael, your podcast is great, or a good job, your course helped me so much, like you need, I don't know, 10 or 20 of those for every person who's like, you suck, I hate.
58:13 Kenneth Reitz: Absolutely.
58:14 Michael Kennedy: And as the BDFL, you are the, are at the tip of the spear of that. You receive all of that, right? It's got to be tough, right?
58:22 Kenneth Reitz: When the negative people... I've learned in open source that most of your users are silent. I've learned that the people that are upset are much, much more vocal than the people that are happy, and then when people are upset, they pile on to each other and it's a feedback loop, and same thing when people are happy. Sometimes they pile on each other and they pile on happiness, but that's pretty rare.
58:41 Michael Kennedy: Yeah, well, and even when it is, like human psychology, we receive negativity stronger than we receive positivity.
58:48 Kenneth Reitz: Absolutely. It's a bad dynamic between those two things. So I think there's no takeaway.
58:56 Michael Kennedy: Yeah, no takeaway, but yeah, I guess it's... I guess the takeaway really for Guido stepping down is like, we went through that, we're in a pretty solid place, and I think things are going well going forward.
59:11 Kenneth Reitz: Yeah, I think we're equipped to move to Python 4 successfully. Not that we need to, I don't know what that would even look like.
59:17 Michael Kennedy: Yeah, I don't know what it would look like either. Do we need a name like that? This is interesting to think about. Like on one hand, it would be cool to move to Python 4 because we've had this two versus three debate for so long, and it's just like, oh, it's over. We're even past 2 or past 3, like we're onto 4. That would be an interesting psychology.
59:35 Kenneth Reitz: I'd much rather see a 3.12.
59:37 Michael Kennedy: Yeah, but at the same time, what would happen that would be such a major version change that it needs to, right?
59:44 Kenneth Reitz: Well, there should be no pressing need for that.
59:47 Michael Kennedy: Yeah, but Java goes through these major version changes, .NET goes through them. It's not...
59:53 Kenneth Reitz: But that doesn't mean that we should.
59:54 Michael Kennedy: No, I agree, I agree.
59:55 Kenneth Reitz: That just 'cause they do it doesn't mean we should. We should be better than them.
59:58 Michael Kennedy: Our stuff should last longer. Our versions should last longer.
01:00:01 Kenneth Reitz: We are more resilient than they are. That's what makes us better than them. Not that we're better than them, I'm just, that's what sets us apart. That's why we're distinct from them, is that Python is a slow, steady-moving rock of a language. If when we hit 3.9, we move to 4, and we make another breaking change, that will erode that trust that people have in Python.
01:00:20 Michael Kennedy: Yeah, yeah, yeah, I certainly would not support like more breaking changes, not really.
01:00:25 Kenneth Reitz: Not now, it's too fast, it's too fast.
01:00:28 Michael Kennedy: Yeah, we're just kind of getting over the scars, right?
01:00:31 Kenneth Reitz: I mean, we could do it, but it would change the inherent property of the language that people like the most, I think, and it would destroy all of our careers eventually. It really would.
01:00:41 Michael Kennedy: I think additive stuff is fine, right?
01:00:42 Kenneth Reitz: Yes.
01:00:43 Michael Kennedy: Like it needs to be.
01:00:44 Kenneth Reitz: And subtractive is okay too, but not replacive, if that makes sense.
01:00:47 Michael Kennedy: Yeah, exactly.
01:00:49 Kenneth Reitz: Yeah. 'Cause that's what the string thing was. The string thing was replacive. It was like you have to rip out and replace code. It's okay if you need to remove code or if you have to add code, but not if you have to replace code, then that's different.
01:01:03 Michael Kennedy: Yeah, that's probably the biggest one. That's quite tricky.
01:01:04 Kenneth Reitz: Oof.
01:01:06 Michael Kennedy: So I guess while we're talking about this, we don't have a whole lot of time left, but I do have just two questions.
01:01:10 Kenneth Reitz: Yes.
01:01:11 Michael Kennedy: Two main questions left for you. One is like, what's your prediction of the end of life of Python 2? Do you feel like we're kind of there?
01:01:19 Kenneth Reitz: Yes, I do. It is not an issue. People that need to use 2 for business reasons will continue to be able to do so because Red Hat will continue to maintain it for many years.
01:01:28 Michael Kennedy: I feel like a dramatic number of people recently have switched, at least their new projects, to Python 3.
01:01:34 Kenneth Reitz: I'm just letting people know if they don't, if you're on 2.7 for a business reason and you, that means you have money, you can pay Red Hat money, and they'll give you 2.7, up-to-date, after 2020. So do that.
01:01:45 Michael Kennedy: Yeah, cool.
01:01:46 Kenneth Reitz: That's the solution to your problem.
01:01:49 Michael Kennedy: One of my predictions that is around this time, like Q1 2020, there's going to be a lot of opportunity for people who are consultants and specialize in converting from 2 to 3. 'Cause a lot of people are going to realize like, hey, we wanted to do this.
01:02:05 Kenneth Reitz: Yeah, consultants maybe, not professionals, 'cause those people ideally should have been doing this a long time ago.
01:02:09 Michael Kennedy: Yeah, I know.
01:02:10 Kenneth Reitz: When I said professionals, I mean people working in organizations.
01:02:13 Michael Kennedy: Yeah, but I do think there's going to be folks.
01:02:15 Kenneth Reitz: The time is passed for you to be on 3 is what I'm saying.
01:02:17 Michael Kennedy: Yeah, I agree.
01:02:19 Kenneth Reitz: I think that conversation is long over. I can see oversight having occurred and you need to migrate immediately.
01:02:28 Michael Kennedy: Right, exactly.
01:02:28 Kenneth Reitz: And needing to hire a specialist to come in and do it, so that makes sense. So yeah, maybe there might be room for that.
01:02:33 Michael Kennedy: That's going to be a sweet six months. Another thing that is good news and is going strong is...
01:02:41 Kenneth Reitz: It's ending not in January, but it's actually ending at PyCon 2020 is what I've heard.
01:02:45 Michael Kennedy: Guido put out something that said January 1st.
01:02:47 Kenneth Reitz: Okay, nevermind. I retract.
01:02:49 Michael Kennedy: There was some debate that it should be there, but it was a little while ago, Guido said something to the effect of...
01:02:54 Kenneth Reitz: He advanced it.
01:02:55 Michael Kennedy: Let's not mince words, it's January 1st, 2020. We're getting it over with.
01:02:59 Kenneth Reitz: All right, thank you for correcting me.
01:03:00 Michael Kennedy: Yeah, I mean maybe it's been changed since he said that.
01:03:04 Kenneth Reitz: No, that was newer information than I had.
01:03:06 Michael Kennedy: Yeah, yeah, cool. So I think it's, let me check it out. Let's just say Python Death Clock. Let's see where we are as we record.
01:03:14 Kenneth Reitz: Yeah, that's my trusted source as well.
01:03:16 Michael Kennedy: Are you familiar with Python Death Clock?
01:03:18 Kenneth Reitz: I thought Python Death Clock always said January, and then my trusted source told me PyCon is when it was supposed to be, surprisingly. January.
01:03:27 Michael Kennedy: Recently, the date has been updated to January 1st, 2020.
01:03:30 Kenneth Reitz: Gotcha.
01:03:31 Michael Kennedy: The death clock has been updated accordingly.
01:03:33 Kenneth Reitz: So we lost six months, that's great.
01:03:34 Michael Kennedy: Yeah, it's like...
01:03:34 Kenneth Reitz: Four months.
01:03:35 Michael Kennedy: Daylight savings, but extremely big. Nice, all right, so the other thing I wanted talk about though is just give you a chance to talk a bit about your podcast, let people know it's out there. I think it's good that you're doing it, and it sounds like you're doing interesting stuff there.
01:03:50 Kenneth Reitz: Thanks.
01:03:50 Michael Kennedy: How's it going?
01:03:51 Kenneth Reitz: I have a non-traditional podcast called Import This. It is for humans, by humans, and it is not specific to Python, but it's mostly oriented around Python. I interviewed my stylist the other day, who works at the high-end fashion store downtown. I don't really shop there too often, but I like to talk to him a lot, so he's a nice guy. But I interview a lot of Python developers and a lot of people who use DigitalOcean, and they're short episodes and they're bursty, so sometimes I do three in a week, sometimes I do none. It's called Import This. If you look on iTunes or anywhere else where you can find a podcast, you will see it. Check it out.
01:04:26 Michael Kennedy: Nice, yeah, I'll put a link in the show notes.
01:04:27 Kenneth Reitz: Yeah, thanks.
01:04:28 Michael Kennedy: Yeah, yeah, it's definitely, it's a good one, so definitely worth checking out. You were talking about interviewing people outside the Python space. When I was at PyCon, I was having this weird deja vu type of experience, like our Uber driver, we started to talk, he's like, "Oh, you're here for a conference." Yeah, yeah, we're here for this Python conference. He's like, "Oh, Python, yeah, I'm learning this. I'm learning Python, it's so amazing." And then like another Uber driver and then a waitress was also learning, it was just like all these people from outside the community were like learning Python. It was very interesting.
01:04:58 Kenneth Reitz: I've had a San Francisco Uber driver recognize me once from watching my talks on YouTube.
01:05:04 Michael Kennedy: Oh, now that's... That's so awesome. How cool, great. Oh man. All right, well I guess we're probably over time a little bit, but that was to be expected, so maybe I'll just ask you the two questions, one of which I'm pretty sure I know the answer now given our conversation. But first of all, if you're going to write some Python code, work on one of your projects, what editor do you use?
01:05:27 Kenneth Reitz: VS Code.
01:05:27 Michael Kennedy: VSCode, right on. That's got to be the editor with the highest rate of adoption in the last year. It's really going strong. So the other question is, what notable PyPI package would you like to recommend? And I just want to throw out there really quick, like when I ask this of other guests, very often they say Requests.
01:05:46 Kenneth Reitz: Oh, that's so kind of them. Thank you.
01:05:47 Michael Kennedy: Yeah, absolutely.
01:05:48 Kenneth Reitz: I can't say Requests. No, I'm kidding. Requests Core will...
01:05:52 Michael Kennedy: It's still Requests.
01:05:53 Kenneth Reitz: I'll say in the future, Requests Core should be the answer 'cause I think that'll be a really cool package that will really impact some lives of a lot of developers, but that's not built yet, so now I usually say Docopt, but I've given you the answer before, so I need to think for a moment. Let me think. I like PyTheory a lot, but that's not useful for people at the moment. A cool one that I found recently is SymPy.
01:06:18 Michael Kennedy: Okay, SymPy is cool.
01:06:19 Kenneth Reitz: That's really interesting to me, and if you're not from the scientific community, you might not know about it. It gives you a solving algebraic system in Python, which is really useful. It lets you do algebra in Python, which is like something that you need to do sometimes.
01:06:34 Michael Kennedy: So if you're in, say, high school or early college.
01:06:38 Kenneth Reitz: Or you just need to solve problems with math in your code.
01:06:41 Michael Kennedy: Exactly.
01:06:41 Kenneth Reitz: Which is, honestly, pretty rare, but like sometimes you should do it if you're doing business logic, right?
01:06:48 Michael Kennedy: Right, or yeah, you're doing some kind of research or something and you just want to bust it out in a Jupyter Notebook or doing simulations, yeah absolutely, it's very cool.
01:06:55 Kenneth Reitz: If you're building even a web application and you just need to have some business logic in there, I think it's appropriate.
01:07:00 Michael Kennedy: Yeah, right on.
01:07:00 Kenneth Reitz: Do like a threshold of a log function or something. I don't know, for like determining if someone's a biz high a biz low. I don't know. I think you could do some pretty advanced stuff with it if you wanted to.
01:07:12 Michael Kennedy: Yeah, sounds pretty cool. Thanks. Now, I guess, final call to action here. People, maybe they're excited about PyCon or they are interested in the async stuff, I don't know, what what do you want to leave people with?
01:07:25 Kenneth Reitz: I like to leave listeners with this recording that I have made. It's Creative Commons and it is beautiful. Thank you. Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity, errors should never pass silently, unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one, and preferably only one, obvious way to do it, although that way may not be obvious at first, unless you're Dutch. Now is better than never, although never is often better than right now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honkin' great idea. Let's do more of those.
01:08:41 Michael Kennedy: This has been another episode of Talk Python to Me. Our guest on this episode was Kenneth Reitz, and it's been brought to you by Linode and Backlog. Linode is your go-to hosting for whatever you're building with Python. Get four months free at talkpython.fm/linode. That's L-I-N-O-D-E. With Backlog, you can create tasks, track bugs, make changes, give feedback, and have team conversations right next to your code. Try Backlog for your team for free for 30 days using the special URL, talkpython.fm/backlog. Want to level up your Python? If you're just getting started, try my Python Jumpstart by Building 10 Apps course, or if you're looking for something more advanced, check out our new Async course that digs into all the different types of async programming you can do in Python. And of course, if you're interested in more than one of these, be sure to check out our Everything Bundle. It's like a subscription that never expires. Be sure to subscribe to the show. Open your favorite podcatcher and search for Python. We should be right at the top. You can also find the iTunes feed at /itunes, the Google Play feed at /play, and the direct RSS feed at /rss on talkpython.fm. This is your host, Michael Kennedy. Thanks so much for listening. I really appreciate it. Now get out there and write some Python code.