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


Transcript #92: Will your Python be compiled?

Return to episode page view on github
Recorded on Thursday, Aug 23, 2018.

00:00 Hello and welcome to Python Bytes where we deliver Python news and headlines directly to your earbuds. This is episode 92 recorded August 23rd, 2018. I'm Michael Kennedy. And I'm Brian Eichen. Hey Brian, how you doing? I'm doing great.

00:13 Yeah, same here. I'm excited to be back together and I can't wait to talk about some of these things. We have some like amazing drop the mic sort of stuff coming up. So pretty excited to get into that and also pretty excited that DigitalOcean is sponsoring this episode.

00:27 So thank you, DigitalOcean.

00:29 Check them out at pythonbytes.fm/digitalocean.

00:32 Get $100 credit for new users.

00:35 Right now, have we covered the fact that Python is popular?

00:38 - Yeah, but I wanted to cover it again.

00:40 - Why not?

00:41 - So Python is pretty popular.

00:42 And for the second year in a row, it came out as the number one popular programming language in the IEEE survey.

00:52 So there's a, every year, IEEE puts out a popular programming survey and that it's at the top isn't really news.

01:01 What's really kind of cool about it, though, and we'll have a link to the results.

01:06 It's an interactive results thing.

01:07 I think we covered it last year.

01:10 But this time, Python is number one, even in embedded.

01:14 And that's the thing that stands out this year.

01:16 Yeah, and it's worth pointing out that this survey is for electrical engineers.

01:20 It's not like the same as say, the Stack Overflow survey, which is maybe more developer focused.

01:25 So it's like you saw another area where Python is sort of taken over, which is awesome.

01:30 Embedded, like you say.

01:31 The article that we're going to link to actually talks about whether or not this is real.

01:37 And some people are doubting that Python really is that popular in embedded.

01:43 Because I mean, there's a lot of day to day job are embedded.

01:46 The embedded work I do is in C++.

01:49 There's a big range of what it means to be embedded.

01:52 So there's not, they don't really define that.

01:53 You have to kind of define that yourself.

01:55 I define it mostly as you're developing software on a platform that's not the target platform.

02:01 And the target platform doesn't really look like a computer.

02:04 - Like a Raspberry Pi or maybe like something embedded in your car or something like that?

02:09 - Yeah, definitely.

02:10 But even, it's a broad definition.

02:12 So the embedded software I do actually runs on a Windows machine, but it doesn't look like a Windows machine.

02:18 It looks like a, it's a testing equipment.

02:21 It looks like a stereo component with dials and stuff.

02:24 We don't run Python, we run C++.

02:26 However, like you said, like Raspberry Pi, I think there's been a big push lately.

02:32 I think that's where this is coming from.

02:33 There's been a big push lately of trying to get people involved in more circuits and more real interactive programming with electronics through the use of MicroPython and CircuitPython on like Raspberry Pis and Arduinos and MicroBits and all that sort of stuff.

02:50 And including the Mew editor that really tries to teach people right out of the get go.

02:55 So there is some doubt of whether or not really Python's the top for embedded, but I don't doubt it at all.

03:00 I think it's gonna stay.

03:02 - Yeah, I think it's cool.

03:03 I mean, you could have the debate of, well, it's on professional shipping embedded devices that are for sale versus embedded in general, which like you say, could include $5 Adafruit type things that people play with or they're using in school, but it's not for sale per se.

03:18 - Right, there's a lot of people taking those Adafruit things and turning them into kits for people for products for people to like wear.

03:26 And then the people that are learning on that are gonna go into, it might go into other embedded jobs.

03:33 And I think since Python is faster to develop in, there's a big incentive, I think, for people to use a higher level language and embedded if they can, even in a production level.

03:43 - Yeah, and if they are, it's gotta be Python, right?

03:45 Like what else would it be?

03:46 - Right.

03:47 - Yeah, maybe JavaScript, but that's a little shaky.

03:50 Very interesting.

03:51 So you ready for something incredible?

03:53 - Yeah, is this drop the mic thing you're talking about?

03:56 - Yeah, unfortunately it's the second one, so I have to pick it back up.

03:59 But let me work my way into this the way that it developed.

04:03 So we have the mailing list, Python dev, okay?

04:06 And that's where a lot of the core developers talk.

04:08 - Okay.

04:09 - Okay, on this list, someone was talking about finding a better way to test the C APIs instead of writing some C tests, some Python tests, and those kinds of things, right?

04:19 You can be sympathetic with this, I'm sure.

04:21 They were saying, "Look, we need to test the C code inside CPython.

04:26 One way to do this would, maybe we could use something like Cython." We talked previously about how Cython lets you pretty easily integrate with C and Python at the same time.

04:37 There was some debate saying, "It might be a good idea.

04:40 It might not be a good idea." On one hand, Cython is changing a lot.

04:44 a pretty big dependency to take as part of the core development component of Python itself, things like that.

04:52 But then something pretty incredible came along here.

04:57 And I don't know how far along this is or whatever.

05:00 But this guy named Yuri steps in and drops a bit of a bombshell.

05:03 And he says, Hey, you guys, this Cython thing is kind of cool.

05:06 And I don't know if you want to do it.

05:07 But over at Dropbox, we're working on a new, new compiler for Python called mypyc.

05:13 And it just says, well, this mypyc will compile type annotated Python to optimized C code, which ultimately compiles to machine instructions.

05:23 That's pretty cool.

05:24 How about that?

05:25 So it's like Cython, right?

05:27 We've seen that where Cython can make things like 20 or 50 times faster in certain circumstances, because it's compiled really interesting stuff there.

05:35 But the problem with Cython is it's a superset of Python, you have like the C def, and like You basically write in a separate language that if you squint, you're like, "Wait a minute, is that Python?

05:46 No, no, no, there's a lot of weird other stuff going on around here.

05:49 This is not Python, but it's Python-like." It doesn't even use the same type annotations because it sort of predated that.

05:56 Cython is good, but it has this, "You got to write in Cython, not Python." This mypyc thing they're talking about, this is straight Python 3.6 code.

06:06 It runs on CPython, but you can compile it to machine instructions like Cython.

06:10 It's not all of Python, it's a subset, right?

06:13 It's a subset, exactly.

06:15 I think the main thing is you have to type annotate everything so it can actually compile.

06:20 That's more or less the difference with Cython, is you type annotate everything.

06:24 But it's a different type. It's using Cython types.

06:27 Right, but this is using just normal type annotations.

06:32 It's pretty incredible. It says, "Look, this is standard Python. It's a subset of Python." And you can easily integrate with C libraries because of CFFI.

06:40 You can even run it on PyPy because it's a subset of Python.

06:45 So it's pretty cool.

06:47 And if Dropbox releases a full-on compiler for Python, that would shock the world, I think.

06:53 Yeah, definitely.

06:55 Like even with this, with a subset, to be able to develop it in Python and then do some little extra work to go to the, to make sure you're able to compile it within this, this This would be great.

07:06 And the extra work is not much.

07:08 It's like put type annotations on it.

07:10 So maybe you have like three or four functions that you call that are like really called frequently or really a minor portion of your time is spent there.

07:17 And if you wrote it in like C, it would be way faster.

07:19 Well, if you just put type annotations on it, you know, you could probably hit it with this thing.

07:24 So pretty interesting little thread that got picked up there.

07:28 We'll have to watch this and make update people if we see any more progress.

07:33 Yeah, what I did not see is here's a link to the Git repo or here's the announcement or anything like that.

07:38 So we'll have to see if anything comes from it.

07:41 But I think it's really interesting, you know, that, that we've sort of gotten to this place.

07:47 Because from my understanding is Guido is not a huge fan of compiling Python code and didn't see a need for this, but he must be involved in this because it's from Dropbox.

07:57 And the main work he's doing that Dropbox is on my pi.

08:00 And it's all about this.

08:01 So I suspect he's involved somehow, but I have no confirmation that.

08:05 Yeah.

08:06 Okay, cool.

08:07 Boom, mic drop.

08:08 Okay, I'll pick it up.

08:09 Well, let's, let's talk about Netflix.

08:11 They are doing such cool stuff with Python.

08:13 Yeah, so it's Python and more.

08:14 So there's a really cool article called beyond interactive notebook innovation at Netflix.

08:22 And as we've all known, Jupyter notebooks have and using the Jupyter system is kind of revolutionized a lot of data analysis and machine learning and quite a bit of that interacting with data environment.

08:39 And that's true at Netflix as well, and that's what this article is talking about, is a lot of the cool things that they've done.

08:46 And over the last few years, they've seen a larger and larger growth, and they've also said basically this is our supplied data chain.

08:56 I never really thought about all the different types of people that interact with data, but They listed, they have a little diagram, they listed like nine or 10 different job roles that interact with data a little bit differently, but they're all interacting with it.

09:12 Like data experts or data analysts or algorithm engineers or data scientists.

09:18 There's all these different things and I'm not quite sure what they all do different, but they're all interacting with these huge data sets.

09:24 And in their effort to use notebooks and Jupyter to streamline and make things easier for people.

09:32 In the process, they've came up with some really cool extra projects that they've open-sourced or developing in the open.

09:40 I'm going to run through a few of them.

09:42 One of them is called Interact, and it's an alternative user interface that has some cool things like inline cell toolbars and drag and drop cells.

09:51 I didn't know that you couldn't do that in Jupyter, but that's neat, and and a built-in data explorer.

09:58 And then, if you've got a Jupyter Notebook all set up with some data, well, wouldn't it be cool if you could have some of your states parameterized so you can run the whole notebook with different parameters?

10:11 This is almost like making a notebook like a function you can call and pass it inputs and get outputs.

10:16 Exactly, and that's what Paper Mill is partly.

10:19 So there's a project called Paper Mill that parameterizes notebooks.

10:22 And then it also does things like, If you parameterize the bunch, you can analyze the different set of parameterized runs and do some analysis on the set.

10:32 Then there's, yeah, it's making a notebook, like you said, a function that you can call.

10:37 Then if you're using that and you want to share it with other people with the data and with the results, they've put together a thing called commuter that lets people share them with each other, and then also scheduling.

10:50 There's a separate article that's attached at the end about how if you got this function with different parameters and stuff maybe you wanna it's your you wanna test different live data so you wanna schedule it regularly or different times they've got a notebook schedule scheduling system in place so all of this is it's not like a super easy thing to jump into but the train to make it easier for people and this is actually some pretty neat things that they shared with everybody this is incredible if you look at this big infrastructure diagram they have it's like It's just this entire architecture and cloud platform for running their style of executable notebooks using this new UI on containers you can configure and schedule.

11:35 It's really crazy and you can even come down and say I'd like to run on some container with four CPUs and 30 gigs of ram.

11:44 go right it's crazy it's kind of amazing i'm trying to start exploring a little bit more of what people are doing with jupiter netbooks and other parts of the jupiter system because it's a it is sort of opening up a lot of different data analysis into the open just need yeah that is really cool Something else I just see in here, and I don't know quite where this shows up, but in that same organization that released all of these projects on GitHub, you know, they're grouped into a bunch of projects under an org in the GitHub org style. There's a thing called VDOM for Python, what does it say? It says a virtual HTML DOM for Python, which is pretty interesting for creating basically HTML and whatnot like divs and paragraphs and stuff.

12:31 So that's also in here somewhere for whatever people want to do with that.

12:35 Interesting.

12:36 Yeah.

12:37 So I feel like this one is massive too.

12:38 Like this is a really major thing and you know organizations that depend on this notebook style like this could really be a big deal.

12:45 And I like that they split it out into different projects like the parameterization idea is powerful and maybe you can use that by itself.

12:54 And if you don't quite like the user interface, so they've got the interact there that you can use that instead.

13:01 These are cool that they've split them out a bit.

13:03 I don't know how much they're tied together.

13:06 I expect things like Titus and Commuter might depend on other pieces more than others, but it's neat.

13:13 It's really neat.

13:14 So another thing that is pretty cool that I want to talk about is DigitalOcean.

13:19 And I've told you a bunch of things about it last time we talked about projects, and that's pretty awesome.

13:23 - So, Darren, you've heard of Heroku, right?

13:25 - Yeah.

13:26 - Do you know what Doku is?

13:27 Doku?

13:28 I think it's Doku, actually.

13:28 - No, I don't.

13:29 - So, Doku is apparently a miniature Heroku powered by Docker.

13:35 So, if you want to have your own Heroku, you can spin up a Linux machine or machines and install this thing called Doku and then treat it like Heroku for deploying and managing your code.

13:45 - Oh, that's neat.

13:45 - That's neat.

13:46 So, over at DigitalOcean, they have a one-click deploy for creating Doku servers.

13:52 So you just go over there, create a new droplet, and you just choose, I want a Doku thing all set up.

13:56 Click, boom, you're ready to make your own little version of Heroku.

14:00 - Wow, that's really cool.

14:01 - Yeah, it's really cool.

14:02 So they have all these cool one-click things to create different types of environments.

14:06 And I just thought I'd highlight this Doku one 'cause I know people use Heroku a lot, and if you want some flexibility, this is a really awesome way to do it.

14:14 So anyway, check them out at pythonbytes.fm/digitalocean.

14:18 Get $100 credit if you're a new user to play with Doku or whatever else you want to play with.

14:23 All right, so remember a while ago, we talked about running a Python script as a system D service.

14:30 - Yes, that was a while ago.

14:31 - It was, it was quite a while ago.

14:32 I'll link to that when we talked about that as well, that episode.

14:36 But the idea was I would like to take some Python code and make it, you know, turn on when I boot my Linux system.

14:42 The idea was to take a Python script and make it just boot when Linux boots and run in the background.

14:49 It's kind of like if you did a cron job, but you have more control, right?

14:52 Like your app, your Python code is constantly running.

14:55 If it crashes, it'll restart if you configure it that way and stuff.

14:58 Well, that's great for Linux, but what about for Windows, right?

15:03 So the equivalent infrastructure in Windows is called a Windows Service.

15:06 It starts when Windows starts, if you want it that way, it can run when you're logged out, or it can run as a different user, it can run as a restricted account, all these things.

15:16 So if you want your app to run basically as Windows runs, then you have to create this Windows service.

15:24 Well, it turns out it's quite easy to do this in Python if you use the right libraries.

15:29 So there's a cool article that just says how to create a Windows service in Python.

15:33 And it's based on this project called pywin32, which seems to have no documentation.

15:38 Maybe I just missed it, but it doesn't seem at all obvious how to use.

15:42 But it is on GitHub and pretty popular.

15:44 But this article talks about how to create a Windows service.

15:47 And the idea is you just derive from a certain class, and you override a stop, a start, and a main method.

15:53 And boom, you have Python code that runs as if it were part of Windows.

15:57 Actually, this is awesome.

15:58 I'll use this right away.

15:59 Yeah, yeah, it's really cool.

16:01 I don't have a good--

16:02 I've written a couple of Windows services back in the day.

16:04 I haven't had a chance or reason to do so recently.

16:07 I did take that systemd idea and do some really cool stuff around my courses for automation there.

16:12 But if people are on Windows or they have to deploy to Windows, I think this is a great little example.

16:17 So if that appeals to you, if that sounds like something you want to try to do, this is a really accessible way to do it.

16:23 >> That's cool.

16:23 >> Yeah, indeed.

16:24 >> I'm glad that this came out because I thought about doing this before.

16:27 I'm like, "Oh man, I'm a smart guy.

16:28 I can figure this out." I don't even know where to start looking.

16:31 >> There's weird registration stuff you have to do, but it's cool.

16:34 You just say the name of the service is this, the description of the service is this, the way it starts is on system start or delayed or whatever.

16:41 Then you just like run a command to install it. It's great. Nice. Yeah.

16:44 I probably want to package it up though when you send it out. Yeah, you should package it.

16:49 Have we talked about packaging before? I think so. Not enough. It's one of the things that should be more, more accessible. Okay. Well, let's talk about it again. So the Mahmoud Shemi, while I don't remember how long this was, I don't know if we covered it or not. But anyway, he wrote an article about different ways to package different levels of Python projects.

17:10 And then you did a talk on it.

17:13 And then that now it's been all this information has been shared with others and edited.

17:18 And it's part of the PyPA, the Python Package Authority documentation.

17:23 And it's called an overview of packaging for Python.

17:27 And it's kind of like how it's broken out.

17:29 Because when you want to share Python code, there's different levels.

17:32 So if you just want to share a module with somebody, there's that.

17:36 And then so it starts there and talks about how to just share a simple module with somebody else.

17:42 But then you quickly get into packages with source distributions and wheels and possibly binary distributions and how to do that.

17:51 But that's complete.

17:52 Packages are different than if you want to share an application.

17:56 So that's the part where I get fuzzy.

17:59 But actually, this is a good starting point that hopefully they'll keep current that talks about some of the different ways that you can share applications, because sharing a web application is going to be different.

18:10 And if you share it on Heroku, it's going to be different than sharing a desktop application or a command line application or something.

18:17 So and then also whether or not you want to assume people have Python or whether you want to package Python with it and what do you do with the dependencies and all that.

18:27 So we've talked about all this before, and there's a lot of different solutions.

18:32 And so this is a good a good starting point to take a look at if you want to share some code with somebody else.

18:38 Start here and then get lost.

18:40 There you go. I like it. It brings a lot of the stuff we talked about together.

18:44 Like for example, in the bring your own Python executable section, it's like here's a whole bunch of ways to do this.

18:51 You could use pyinstaller, cxfreeze, constructor, which apparently I'd never heard of.

18:55 OS snap, OSnap, another one.

18:58 Like there's a bunch of things in here and I actually have only heard about half of them.

19:01 So it's pretty cool.

19:02 And since applications kind of range, everything else is fairly consistent.

19:06 There's like one obvious right way to do it up through packages.

19:09 And then it's, it's with applications where it starts going off in feathering out into different solutions.

19:15 I think it's because there's a lot of different requirements for applications, different than just sharing source code.

19:21 So I think it's, I don't think it's a bad thing that, that we have a lot of different solutions right now.

19:26 We've, we've talked about how it's, it'd be really nice if there was one obvious way.

19:30 We're just not there yet.

19:31 So here's a good list of some of them.

19:33 Yep, that's really cool. Well done, Mahmoud.

19:35 So there was a little bit of drama a few weeks ago around PEP 572 about changing the Python language for an assignment in place assignment operator.

19:44 Yeah.

19:45 And that was actually part of one of the sort of straws that caused Guido to say, "All right, I've had it with this. I'm tired of fighting over these things. I'm out." Well, here's a new PEP that I think proposes a bigger change to the Python language.

19:59 this one is not accepted, it's in draft mode, so people can respond to it.

20:03 However, I actually think the value this one brings is massive.

20:08 It's a big deal though, it's a really big deal.

20:10 So the idea is there's PEP 505 now, which is for none-aware operators.

20:15 And the idea is there are several languages that have proven there's some nice design patterns or language patterns that short-circuit working with none or null or whatever it is in Swift.

20:28 I forgot about what they call it there, but nothing, right?

20:31 So there's basically two ways in which you work with this.

20:34 One of these are called null coalescing operators, which lets you substitute a value if you have a none object.

20:41 And null aware operators, which lets you chain operations regardless of whether with or null.

20:47 So the two languages that are most popular that come to mind have to be C# and Swift.

20:52 And both of these have deep support for this concept.

20:55 Swift takes it to a whole nother level to say you can't even assign the equivalent of none to a variable unless you mark it as nullable explicitly, which is way far out there.

21:07 So the idea is like Python could benefit from this.

21:10 So there's these two cases, the null coalescing and the null aware.

21:13 So I'll give you the null coalescing, right?

21:15 It's if you're going to do some kind of weird test, like you'd say something like value, if value is not none else missing, right?

21:23 this big complicated thing could just be value question mark question mark missing.

21:28 It's either going to be the value, but if value is none, then it's the other value missing.

21:31 What do you think of that Brian?

21:33 I'm still on the fence.

21:34 Okay, this one to me actually doesn't offer a huge amount of value.

21:38 It's okay.

21:39 The next one to me is like pretty killer.

21:42 More with the fluent style of calling functions chain together.

21:45 So the null aware member access operator, it's the same basic pep and the same basic but it's used in a different case.

21:53 It lets you chain these fluent interfaces together without testing for none.

21:57 Suppose I have a user, the user has orders, the orders you can call a first operation, but if there's no orders, then it returns none.

22:04 But if it does return one, the order has a name.

22:06 You would say, if user is none, return none.

22:09 User.orders.first.

22:11 If the first order is none, then we bail out.

22:14 But if you make it through all those tests, you can get firstOrder.name.

22:19 That's a lot of code to be spoken over the air, but you would now, with this new proposal, say user?orders?first?name, and it would mean exactly the same thing.

22:30 If you look at those two lines of code on digital paper, the amount of space on one and the other is ridiculous, right?

22:37 Yeah.

22:38 Sorry, I didn't mean to cut you off.

22:39 First reading of the non-aware operators, I was thinking it's just going to make the language more complicated to teach because when you're reading it, it isn't obvious what these things are doing.

22:49 However, it does make the language smaller in that you can be more expressive in less code.

22:56 And that's a good thing.

22:57 I think it would make people more willing to effectively test for none when it could be none without cluttering the code.

23:05 Right.

23:05 Like these two examples I gave you, it's like eight lines versus one line.

23:09 You're willing to just go, Oh, I just think it's there.

23:11 And we'll just go through it.

23:12 And then you'll get none type does not have attributes such and such.

23:15 You're right.

23:16 Whatever the attribute is, right.

23:17 You get that error.

23:18 all that it's one of the most common errors in Python.

23:20 But if you just put the question marks in there, that totally goes away.

23:23 That's the thing where if you don't think you need that problem, just think about how many times you see that.

23:28 Like, you know, none. None does not have the index operator.

23:31 Yes, exactly. Exactly.

23:33 And this basically provides a much nicer way to deal with it.

23:37 So my vote is for this feature, especially the null aware member access.

23:43 But I would be okay if Python never had it.

23:45 had it, but I do think the languages that do have it really make pretty good use of it.

23:50 So it's in draft mode.

23:51 People can give feedback before some sort of battle erupts over it.

23:53 Yeah, I think it's good.

23:55 Yeah, I do too.

23:56 Cool.

23:57 It'll let you have a second edition or third edition of your testing book, right?

23:59 Because there's probably somewhere you got to put a question mark in there.

24:05 You're just adding work for me.

24:07 Thanks.

24:08 Anyway, it's something for people to check out.

24:09 Quite, quite good.

24:10 I don't have anything extra to share with the folks.

24:12 You, Brian?

24:13 I've got a couple of things.

24:14 I just noticed the other day that the Pi Cascades, that's going to be in February, February 23rd and 24th of 2019, and it's gonna be in Seattle this time.

24:24 It's the call for proposals is now open.

24:27 - Oh, that's sweet.

24:28 - You got a long time too.

24:29 You got it now through October 21st to get in your proposal.

24:33 - Oh, I'm super excited about that.

24:34 The opening, the inaugural Pi Cascades in Vancouver, BC last year was excellent.

24:39 And I'm really glad I went.

24:40 It was much smaller and it was a really intimate event.

24:43 You got to meet a lot of the people who are there, and I'm looking forward to have it in Seattle.

24:47 And it's coming to Portland next year, so that'll be even better.

24:50 I'll try to go, and I'll also try to submit something.

24:52 That'll be good.

24:53 The other thing I wanted to highlight is I just wanted to brag because I got a Test and Code episode out a week or so ago that was with David Heinemeier Hansen, and it really went well.

25:07 He's not a Python person, but it's interesting information.

25:11 So that was fun.

25:12 - So for people who don't know who David Hennemeyer Hanson is, what's his claim to fame?

25:17 - Well, he's got lots, but he's the guy that made up Ruby on Rails, and he's one of the co-founders of Basecamp.

25:23 - Yeah, just that, so that's pretty awesome.

25:27 Yeah, it's really cool that he was on your show, and I'm looking forward to checking that out myself.

25:31 - It's definitely applicable to Python people as well, because we talk about language agnostic things like just testing and stuff like that.

25:40 - Very cool, well, thanks for the callout >> Sure, I'll call it PyCascades, but I also was trying to, I was catching up on your podcast, Talk Python, and it was, they had a couple episodes that were people that learned Python after the, didn't get degree, like CS degrees and learned Python later, programming later.

26:01 And just the whole concept of that and listening to everybody's stories was very interesting.

26:05 I liked those.

26:06 >> Yeah, thank you.

26:07 I did a two-part series on that, and that's, I think it really connected to a lot of people because so many people find their way into our world of programming in Python without going through the traditional CS degree path.

26:20 And I think it's just an example a lot of people doing really great in alternate ways in.

26:25 So yeah, very cool.

26:26 Well, good talking to you.

26:27 And we'll talk next week.

26:28 Yep.

26:29 You as well.

26:30 Catch you later.

26:31 Bye everyone.

26:32 Thank you for listening to Python Bytes.

26:34 Follow the show on Twitter via @PythonBytes.

26:37 That's Python Bytes as in B-Y-T-E-S.

26:40 get the full show notes at PythonBytes.fm.

26:43 If you have a news item you want featured, just visit PythonBytes.fm and send it our way.

26:48 We're always on the lookout for sharing something cool.

26:51 On behalf of myself and Brian Okken, this is Michael Kennedy.

26:54 Thank you for listening and sharing this podcast with your friends and colleagues.

Back to show page