WEBVTT

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

00:00:05.420 --> 00:00:10.960
This is episode 116, recorded January 29th, 2019. I'm Michael Kennedy.

00:00:10.960 --> 00:00:11.780
And I'm Brian Okken.

00:00:11.780 --> 00:00:16.960
And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm/DigitalOcean.

00:00:16.960 --> 00:00:23.540
For now, I would like to get out there and explore a dictionary. What do we got here, Brian?

00:00:23.540 --> 00:00:28.060
This is totally cool. I don't even know what to call this.

00:00:28.060 --> 00:00:33.120
I've got a link. It's called Inside Python Dict and Explorable Explanation.

00:00:33.120 --> 00:00:36.860
But it's really like a four-page different tutorial.

00:00:36.860 --> 00:00:41.000
It starts with lists and searching efficiently in a list.

00:00:41.000 --> 00:00:43.460
And then it kind of builds up to dict.

00:00:43.460 --> 00:00:48.920
So it has like a description of what hash tables are, why are they called hash tables,

00:00:48.920 --> 00:00:53.840
and then creates a Python-like, almost Python dictionary structure.

00:00:54.140 --> 00:00:56.800
And it's sort of a deep dive into how...

00:00:56.800 --> 00:01:01.120
And then at the end, it does actually show you how Python dictionaries really work.

00:01:01.120 --> 00:01:02.820
It's a pretty deep dive.

00:01:02.820 --> 00:01:06.960
But what I really want to highlight is the interactiveness of this.

00:01:07.440 --> 00:01:13.820
So if you go take a look at this, it shows a lot of the examples in playable code.

00:01:13.820 --> 00:01:17.300
So the code's like auto-playing with like a little...

00:01:17.300 --> 00:01:22.400
It looks like a debugger where it walks you through different lines and then shows you the output.

00:01:22.400 --> 00:01:25.920
And it's this very visual way to learn.

00:01:26.240 --> 00:01:28.000
And it's pretty darn cool.

00:01:28.000 --> 00:01:30.200
And I don't even know how they're doing this.

00:01:30.200 --> 00:01:34.520
But you can figure it out if you want to, because all of the code for this website is up on GitHub.

00:01:34.520 --> 00:01:35.780
This is a cool example.

00:01:35.780 --> 00:01:36.540
And you're right.

00:01:36.540 --> 00:01:43.300
The little visual played, highlight the code, highlight the visual data structures animation is really great, I think.

00:01:43.300 --> 00:01:44.860
Yeah, it's a neat option.

00:01:44.860 --> 00:01:50.880
And then occasionally, some of the code has like fill-in-the-blank stuff where you can type in stuff

00:01:50.880 --> 00:01:53.600
and change what the code does on the back end.

00:01:53.600 --> 00:01:54.660
And it's just...

00:01:54.660 --> 00:01:56.740
I don't even know how this is doing it, but it's fun.

00:01:56.740 --> 00:02:05.200
And actually, really getting a handle on how dictionaries work in Python is one of the superpowers.

00:02:05.200 --> 00:02:09.780
To get really good at Python, you kind of have to really grok dictionaries.

00:02:09.780 --> 00:02:11.200
So this is a good thing.

00:02:11.200 --> 00:02:19.000
Yeah, they're certainly used more than regular, let's say, everyday programming languages like C, C++, C#, Java.

00:02:19.720 --> 00:02:24.300
They have dictionaries or hash tables, but they are not built on top of them, right?

00:02:24.300 --> 00:02:28.640
Like the variables you look up come out of the locals dictionary, right?

00:02:28.640 --> 00:02:32.420
Your classes and their fields and values and attributes are based on dictionaries.

00:02:32.420 --> 00:02:34.880
And yeah, understanding them is super important.

00:02:34.880 --> 00:02:35.800
This is a cool example.

00:02:35.800 --> 00:02:36.440
I like it.

00:02:36.440 --> 00:02:36.700
Yeah.

00:02:36.700 --> 00:02:41.680
So neither of us are super big gamers, but there's a lot of people out there who are.

00:02:41.680 --> 00:02:46.980
And then there's also a lot of people building visualizations or 3D interactions.

00:02:47.220 --> 00:02:54.220
And Python itself is also used a lot in creating pipelines for creating games and movies and stuff like that.

00:02:54.220 --> 00:02:58.600
So I kind of have a theme through this whole episode that I put together.

00:02:58.600 --> 00:03:01.320
I ran across some stuff kind of all at once.

00:03:01.320 --> 00:03:09.780
And so the first one I want to talk about is the Unreal 4 engine, which is one of the big game engines, you know, built on C++, things like that.

00:03:09.780 --> 00:03:20.360
So as like Fortnite saved the world, Gears of War 4, Marvel versus Capcom, System Shock, not the old one, which is an awesome game from the 90s, but the new one that's being remade.

00:03:20.540 --> 00:03:22.620
All these are being done on Unreal Engine 4.

00:03:22.620 --> 00:03:39.100
And the news is you can now use a plugin to embed Python 3 entirely inside of the Unreal Engine, both for controlling editing, like automating, scripting, say loading a bunch of stuff and auto generating characters or stuff like that.

00:03:39.100 --> 00:03:41.620
And also runtime, like even characters in the games.

00:03:41.780 --> 00:03:42.640
Yeah, that's neat.

00:03:42.640 --> 00:03:43.320
That's cool, right?

00:03:43.320 --> 00:03:46.180
So yeah, so basically this is like a meta plugin.

00:03:46.180 --> 00:03:56.020
Like you take this plugin, you stick it in Unreal, and then you can create Python plugins to do stuff and even write automated tests against like the AI of your game and stuff like that.

00:03:56.020 --> 00:03:56.640
Oh, wow.

00:03:56.640 --> 00:03:58.260
Yeah, it's pretty interesting.

00:03:58.260 --> 00:04:03.820
And the GitHub repo is super detailed in like walkthroughs and steps.

00:04:03.820 --> 00:04:12.320
So there's an example usage on how to create this character from a mesh and from textures and stuff in Python in the editor.

00:04:12.320 --> 00:04:16.760
And there's also one about how to create gameplay elements, you know, that run around in a game.

00:04:16.760 --> 00:04:26.560
So it looks really cool if anyone needs to do 3D interactive stuff and they want to use Unreal 4 Engine or even plug into a game that exists like some.

00:04:26.560 --> 00:04:28.760
There's a whole bunch more than the ones I listed here.

00:04:28.760 --> 00:04:30.640
This is a cool option here.

00:04:30.640 --> 00:04:31.360
Yeah, nice.

00:04:31.360 --> 00:04:31.860
Cool.

00:04:31.860 --> 00:04:32.100
Yeah.

00:04:32.100 --> 00:04:34.980
So this next one you got for us is on context love.

00:04:34.980 --> 00:04:37.380
I'm a big fan of context managers in the West David.

00:04:37.380 --> 00:04:38.360
Tell us what you found.

00:04:38.360 --> 00:04:45.220
I was actually slow to come to context managers, but they definitely, once you get your head around them, they're really handy.

00:04:45.220 --> 00:04:48.900
And I saw this reference and I didn't know existed.

00:04:48.900 --> 00:04:54.380
There's a lot of functions that just print stuff, like they print stuff to standard out or to standard error.

00:04:54.380 --> 00:04:57.880
And I am used to testing that.

00:04:57.880 --> 00:04:59.340
I know how to test that.

00:04:59.340 --> 00:05:07.940
With pytest, there's the capsys fixture that you can use that to capture the output of something and check what it is and read it, whatever.

00:05:07.940 --> 00:05:14.440
But there's a lot of times where you might be using something that prints to standard out and you don't want it to,

00:05:14.620 --> 00:05:18.340
or you want to be able to get that output programmatically.

00:05:18.340 --> 00:05:24.180
And context lib has a redirect standard out function that you just give it a new target.

00:05:24.180 --> 00:05:31.420
And then using the with statement, run whatever code you're going to run and you can capture the output.

00:05:31.420 --> 00:05:32.780
And didn't know that was there.

00:05:32.780 --> 00:05:33.620
And it's very cool.

00:05:33.700 --> 00:05:39.280
I'm going to drop a little tiny code snippet in the show notes to show people how to use it.

00:05:39.280 --> 00:05:39.480
Yeah.

00:05:39.480 --> 00:05:44.020
And it'd be great for testing and something like that without trying to do too much.

00:05:44.020 --> 00:05:44.200
Right.

00:05:44.200 --> 00:05:49.760
What's cool that I like about this is because it's a with statement, a little bit of code is being redirected.

00:05:49.760 --> 00:05:51.060
Then it goes back to normal.

00:05:51.060 --> 00:05:51.540
Right.

00:05:51.540 --> 00:05:54.500
It's not like you're permanently changing what it is.

00:05:54.500 --> 00:05:58.120
It's just maybe during a test or during one function call or something.

00:05:58.120 --> 00:05:58.340
Right.

00:05:58.340 --> 00:06:02.980
I didn't put this in the show notes, but in the link to the context lib documentation,

00:06:02.980 --> 00:06:10.780
the output I showed in our example, just capturing it with string IO, but you can pass it in like a file.

00:06:10.780 --> 00:06:14.560
So if you've got part of your system that usually just prints to standard out,

00:06:14.560 --> 00:06:17.860
you can redirect all that to a file if you want to save it somewhere.

00:06:17.860 --> 00:06:18.440
Yeah.

00:06:18.440 --> 00:06:18.700
Nice.

00:06:18.700 --> 00:06:20.180
And there's a standard error edition as well.

00:06:20.180 --> 00:06:20.380
Right.

00:06:20.380 --> 00:06:20.640
Yep.

00:06:20.640 --> 00:06:20.980
Sweet.

00:06:20.980 --> 00:06:22.380
You know, I love this pattern.

00:06:22.380 --> 00:06:24.340
I've done stuff like this with,

00:06:24.340 --> 00:06:25.440
colored output.

00:06:25.440 --> 00:06:31.300
So use something like colorama and say for this output, I would like it to go to green,

00:06:31.300 --> 00:06:33.380
but then I want it to go back to whatever it was before.

00:06:33.380 --> 00:06:38.800
So a really nice way to do that as well as to put it into one of these, create a little context manager,

00:06:38.800 --> 00:06:44.600
throw it in there and adjust the stuff like that interacts with a console or terminal in the width block is green.

00:06:44.600 --> 00:06:44.760
Right.

00:06:44.760 --> 00:06:45.280
That's pretty cool.

00:06:45.280 --> 00:06:45.940
I like this pattern.

00:06:45.940 --> 00:06:46.540
Very nice.

00:06:46.540 --> 00:06:49.740
Before we move on to the next one, let me tell you about digital ocean.

00:06:49.740 --> 00:06:52.840
Of course, a lot of our hardware is running on digital ocean.

00:06:52.840 --> 00:06:54.240
They're super, super nice.

00:06:54.680 --> 00:06:56.760
One thing I don't know much about Brian.

00:06:56.760 --> 00:06:58.520
I don't know how you're doing is Kubernetes.

00:06:58.520 --> 00:06:59.580
Have you done a lot of Kubernetes?

00:06:59.580 --> 00:07:00.460
I have not.

00:07:00.460 --> 00:07:11.560
I have not either, but it definitely seems like one of the most widely adopted ways to use Docker containers and orchestrate them and really take more than one Docker container and make it work as a whole.

00:07:11.560 --> 00:07:14.440
Do live zero downtime upgrades, things like that.

00:07:14.700 --> 00:07:22.260
So you should check out digital oceans, Kubernetes, do K eight service, which is a managed Kubernetes service.

00:07:22.260 --> 00:07:23.440
It's out officially now.

00:07:23.440 --> 00:07:25.440
It's been around in beta and alpha for a while.

00:07:25.440 --> 00:07:33.840
So you can deploy faster, get your Kubernetes clusters in seconds, provision and access it in a few minutes, easily scale persistent storage.

00:07:33.840 --> 00:07:37.140
Based on incoming traffic with block storage and load balancers and whatnot.

00:07:37.620 --> 00:07:43.240
And it costs 2.4 times less or better performance per price compared to the other providers.

00:07:43.240 --> 00:07:51.800
So on top of that, if you go to pythonbytes.fm/digital ocean as a new user, you'll get a hundred dollars credit to Kubernetes, all the things.

00:07:51.800 --> 00:07:54.320
So it sounds like a lot of fun and definitely check it out.

00:07:54.320 --> 00:07:55.360
It supports the show.

00:07:55.880 --> 00:08:00.540
So to continue on with my theme, it's all about the 3D and the Python.

00:08:00.540 --> 00:08:05.060
So the next one that I want to cover is something called Panda 3D.

00:08:05.060 --> 00:08:10.180
And now it may seem very similarly named to Pandas, but it has nothing to do with that.

00:08:10.180 --> 00:08:19.560
It's just an open source, completely free to use game engine for real time 3D games, visualization, simulation, simulations, experiments, all that kind of stuff.

00:08:19.560 --> 00:08:23.240
This one comes from Kolia Lubitz.

00:08:23.240 --> 00:08:24.560
Hopefully that was close enough.

00:08:24.560 --> 00:08:26.380
Thank you, Kolia, for sending that in.

00:08:26.380 --> 00:08:26.880
That's great.

00:08:26.880 --> 00:08:36.160
One of the things I thought was cool, I don't think everyone's going to be building a game, but I think a lot of people out there are doing science and experiments and visualizations and stuff like that.

00:08:36.160 --> 00:08:42.740
And I think this is a great little 3D engine for simulations that just happen to be in 3D and you can do them in Python.

00:08:42.740 --> 00:08:43.400
Oh, that's cool.

00:08:43.400 --> 00:08:43.700
Yeah.

00:08:43.700 --> 00:08:44.280
Isn't that nice?

00:08:44.280 --> 00:08:53.400
So this is basically a C++ 3D engine that has a bunch of library plugins and stuff that make it a lot easier to work with.

00:08:53.440 --> 00:08:55.260
So it runs on all the platforms.

00:08:55.260 --> 00:08:55.980
On all the platforms.

00:08:55.980 --> 00:09:05.360
It has very little overhead because you basically get your meshes, you load them into the system, and then you just sort of poke at them and control them from Python.

00:09:05.360 --> 00:09:08.180
But they run like on your GPU in C++.

00:09:08.460 --> 00:09:10.000
So really good performance as well.

00:09:10.000 --> 00:09:10.540
Oh, nice.

00:09:10.540 --> 00:09:10.780
Yeah.

00:09:10.780 --> 00:09:16.300
So some of the features, platform portability, it runs on Mac, Linux, and Windows, maybe Raspberry Pi.

00:09:16.300 --> 00:09:18.520
I can't remember where else, possibly other places.

00:09:18.520 --> 00:09:23.340
But the main places, it has a lot of tools for handling assets.

00:09:23.340 --> 00:09:32.840
I don't know if you've ever done anything with 3D, but it's these library files and this Adobe file format for that other thing.

00:09:32.840 --> 00:09:34.220
And there's just all that kind of stuff.

00:09:34.220 --> 00:09:38.020
So there's a lot of tools for handling these assets, which is pretty awesome.

00:09:38.160 --> 00:09:42.260
So you can automate either your pipeline or even the code.

00:09:42.260 --> 00:09:44.920
It also has library bindings, which is cool.

00:09:44.920 --> 00:09:58.420
So you can do things like plug in the Bullet Physics Engine or the Asimap Loader or OpenAL or all these different things that, you know, just because you have 3D doesn't mean you have like physics or interaction and stuff like that.

00:09:58.420 --> 00:09:58.640
Right?

00:09:58.640 --> 00:09:58.940
Yeah.

00:09:58.940 --> 00:09:59.460
Pretty cool.

00:09:59.460 --> 00:10:03.860
And then finally, it comes with this thing called PStats for Panda 3D profiling.

00:10:03.860 --> 00:10:12.660
So you can actually get a visual representation of exactly where your program is spending its time, like this frame or this mesh or whatever.

00:10:12.660 --> 00:10:14.060
It takes that amount of time to run.

00:10:14.200 --> 00:10:18.240
So you get like super detailed runtime profiling and performance analysis.

00:10:18.240 --> 00:10:21.840
So not bad for a completely free Python enabled thing.

00:10:21.840 --> 00:10:22.160
Yeah.

00:10:22.160 --> 00:10:23.480
And it's like completely free.

00:10:23.480 --> 00:10:25.380
You can even use it for commercial use if you want.

00:10:25.380 --> 00:10:26.160
Yeah, exactly.

00:10:26.160 --> 00:10:28.700
And I don't think like Unreal 4, for example, is.

00:10:28.700 --> 00:10:30.320
So this is a nice one.

00:10:30.320 --> 00:10:30.640
Nice.

00:10:30.640 --> 00:10:30.940
Yep.

00:10:30.940 --> 00:10:31.780
What's the next thing you got?

00:10:31.780 --> 00:10:34.960
I have an interesting article and I should have written down.

00:10:34.960 --> 00:10:40.760
It's from Dustin Ingram called Why PyPI Doesn't Know Your Project's Dependencies.

00:10:41.700 --> 00:10:44.240
And I guess it's something I never really thought about before.

00:10:44.240 --> 00:10:53.000
But if you go look in on packages on PyPI, it would be kind of cool if you could see all the dependencies of a particular package.

00:10:53.000 --> 00:10:53.460
Yeah.

00:10:53.560 --> 00:10:57.900
You can do it on GitHub as a whole project, but you can't do it as like a single.

00:10:57.900 --> 00:11:00.920
You can't go, this package I'm going to get has exactly.

00:11:00.920 --> 00:11:01.560
That's nice.

00:11:01.560 --> 00:11:02.460
It would be nice.

00:11:02.460 --> 00:11:03.400
He's trying to answer.

00:11:03.400 --> 00:11:08.020
He said he gets a lot of questions like, how can I produce a dependency graph for Python packages?

00:11:08.600 --> 00:11:13.640
And why doesn't PyPI show that the project dependencies right out on the page?

00:11:13.640 --> 00:11:14.800
That would be neat.

00:11:14.800 --> 00:11:19.580
And also just how can I get all the dependencies without downloading it first?

00:11:19.580 --> 00:11:23.160
And the answer is you can't, which is interesting.

00:11:23.580 --> 00:11:29.060
And the reason is because of setup tools and setup.py is dynamic.

00:11:29.060 --> 00:11:29.740
It's code.

00:11:29.740 --> 00:11:30.220
It runs.

00:11:30.220 --> 00:11:33.460
And he gives an example, which is sort of funny.

00:11:33.460 --> 00:11:41.040
He gives an example of building a setup.py package that does a dependency with random choice.

00:11:41.040 --> 00:11:43.720
So randomly pulls in different packages.

00:11:43.720 --> 00:11:44.180
Fun.

00:11:44.180 --> 00:11:45.500
Just to make a point.

00:11:45.500 --> 00:11:46.040
Yeah.

00:11:46.040 --> 00:11:48.180
So that would be evil, but it could be done.

00:11:48.240 --> 00:11:52.100
And I'm hoping that a listener will do this and push it up just for the heck of it.

00:11:52.100 --> 00:11:55.540
But there's some real reasons to do that.

00:11:55.540 --> 00:12:02.620
And a lot of them have to do with like different packages being available on Windows versus Linux versus Mac or whatever.

00:12:02.620 --> 00:12:08.600
So operating system dependencies are something that often makes you have to pull one end versus another.

00:12:08.600 --> 00:12:11.280
Also, different versions of Python.

00:12:11.280 --> 00:12:16.400
So if you're using Python different, if you want to use data classes and you're using an older Python,

00:12:16.520 --> 00:12:20.020
you need to actually depend on data classes, for instance.

00:12:20.020 --> 00:12:20.500
Yeah.

00:12:20.500 --> 00:12:26.260
So this is an interesting article that talks about that, but also points out why wheels are awesome.

00:12:26.260 --> 00:12:31.140
So wheels are not something that are dynamic.

00:12:31.140 --> 00:12:33.220
They are more predictable.

00:12:33.220 --> 00:12:36.580
So this is, I think, also a little bit of a plug for wheels.

00:12:36.580 --> 00:12:38.740
And I wanted to highlight that.

00:12:38.740 --> 00:12:42.480
Wheels, they have dependencies in them also, but they're not as dynamic.

00:12:43.040 --> 00:12:46.700
So there'll be a different wheel up there for different operating systems.

00:12:46.700 --> 00:12:53.000
And while I was poking around on here, I also, I wanted to go on a little bit of a tangent.

00:12:53.000 --> 00:12:58.420
There's a website called pythonwheels.com that I'll just drop a link in here too.

00:12:58.420 --> 00:13:00.900
And it talks about some of the advantages of wheels.

00:13:00.900 --> 00:13:01.560
It's nice.

00:13:01.560 --> 00:13:02.820
It installs faster.

00:13:02.820 --> 00:13:04.220
It doesn't run setuppy.

00:13:04.220 --> 00:13:05.360
Yeah.

00:13:05.360 --> 00:13:07.500
It doesn't require a compiler.

00:13:07.500 --> 00:13:12.260
So basically, kind of a binary version instead of a source version, which is cool.

00:13:12.260 --> 00:13:17.000
For some packages that have wheels up there, it is kind of cool if you can put up,

00:13:17.000 --> 00:13:24.080
if you've got hard operating system dependencies, then have some sort of build step that puts those up for the different operating system.

00:13:24.180 --> 00:13:24.540
Yeah, cool.

00:13:24.540 --> 00:13:25.580
I like it.

00:13:25.580 --> 00:13:27.700
And it's a totally reasonable question.

00:13:27.700 --> 00:13:30.360
Like, I'm considering installing this thing.

00:13:30.360 --> 00:13:31.660
What does it use?

00:13:31.660 --> 00:13:32.000
Right?

00:13:32.000 --> 00:13:33.660
That's a little, that should be obvious.

00:13:33.660 --> 00:13:34.580
And I'm not sure it is.

00:13:34.580 --> 00:13:40.640
And one of the things I also, I don't know why people are, if you really want to know on my operating system, what do I need?

00:13:40.640 --> 00:13:43.080
Pip includes a command called download.

00:13:43.080 --> 00:13:53.920
So you can say pip download something and point it to a directory and it'll download something and all of the dependencies that are valid for your operating system.

00:13:53.920 --> 00:13:57.100
So if you're really curious, that's one way to do it.

00:13:57.100 --> 00:13:57.620
Very, very cool.

00:13:57.620 --> 00:13:58.540
All right.

00:13:58.540 --> 00:14:05.020
For the last one, I want to talk about building games and other stuff, other stuff with Python.

00:14:05.020 --> 00:14:06.560
Now, this one is different than the other.

00:14:06.560 --> 00:14:14.580
The first two, there's about 3D engines, one, a big commercial one, and one, a free open source one that you can plug in and control and automate and work with Python.

00:14:14.580 --> 00:14:17.920
But what this is, actually, this one makes me super excited.

00:14:17.920 --> 00:14:19.280
It makes me want to go along with it.

00:14:19.280 --> 00:14:23.220
It's a at least six-part series on Pygame.

00:14:23.220 --> 00:14:27.160
And they're really quite detailed and in-depth and interactive.

00:14:27.560 --> 00:14:28.800
So I'll just give you a sense.

00:14:28.800 --> 00:14:40.600
It starts out with building a simple dice game and then building a game framework so you can build on top of it, adding players, moving your characters around, having heroes and villains that fight.

00:14:40.600 --> 00:14:47.140
And then the last one, at least at the time of the recording, is putting platforms in a Python game with Pygame.

00:14:47.140 --> 00:14:56.020
And what they mean by that is, you know, think of Mario Brothers or Joust or something like one of these old 2D side-scroller games.

00:14:56.020 --> 00:14:58.180
Like, how do you create a game with that?

00:14:58.180 --> 00:14:59.780
And it's pretty elaborate and pretty nice.

00:14:59.780 --> 00:15:00.480
Oh, that's cool.

00:15:00.480 --> 00:15:00.760
Yeah.

00:15:00.760 --> 00:15:02.560
It's like basically the six-part series.

00:15:02.560 --> 00:15:15.040
So if you wanted to kind of get your Python better or you wanted to learn Pygame, either of those, this would be a really cool set of series to go through because you're going to come up with like a 2D side-scroller game at the end.

00:15:15.040 --> 00:15:16.120
And that seems pretty awesome.

00:15:16.120 --> 00:15:18.020
Man, I haven't thought about Joust in a long time.

00:15:18.020 --> 00:15:18.760
I missed that game.

00:15:18.760 --> 00:15:19.280
That was cool.

00:15:19.280 --> 00:15:19.740
I know.

00:15:19.740 --> 00:15:21.720
I can't even remember the sounds.

00:15:21.720 --> 00:15:24.140
But yeah, I remember it for sure.

00:15:24.140 --> 00:15:25.340
Even the arcade there.

00:15:25.340 --> 00:15:25.860
That was fun.

00:15:25.860 --> 00:15:27.480
Yeah, that one in Dungeon.

00:15:27.480 --> 00:15:31.420
That Dungeon game, that was sort of just a video more or less.

00:15:31.420 --> 00:15:32.320
But those were fun times.

00:15:32.320 --> 00:15:32.600
Yeah.

00:15:32.600 --> 00:15:34.660
Now, one other thing that I want to throw in here.

00:15:34.660 --> 00:15:37.320
Like, so this is the series and that was kind of what I want to talk about.

00:15:37.320 --> 00:15:38.580
I'm linking to all the pieces.

00:15:38.580 --> 00:15:41.940
But something I ran across recently as well that I thought was pretty cool.

00:15:41.940 --> 00:15:43.280
I haven't gotten it.

00:15:43.280 --> 00:15:44.040
I haven't played with it yet.

00:15:44.040 --> 00:15:46.480
But it gave me the same feeling of like, oh, this looks so cool.

00:15:46.480 --> 00:15:51.280
Is this thing called Mission Python, a code space adventure game.

00:15:51.280 --> 00:15:57.840
So similarly, it's like a whole learn Python and learn Py game by building like a space adventure game with Py game.

00:15:57.840 --> 00:15:59.160
And it just looks so fun.

00:15:59.240 --> 00:16:01.340
I just, I don't want to do it, but haven't done it yet.

00:16:01.340 --> 00:16:02.220
Haven't ordered the book.

00:16:02.220 --> 00:16:03.520
Oh, yeah, it does look fun.

00:16:03.520 --> 00:16:04.060
Yeah.

00:16:04.060 --> 00:16:05.000
Yeah.

00:16:05.000 --> 00:16:12.620
So if you're interested in learning Py game or you want to use Py game for some kind of simulation type thing, either of these would be real helpful.

00:16:12.620 --> 00:16:13.120
Yeah.

00:16:13.120 --> 00:16:14.360
Sorry.

00:16:14.360 --> 00:16:16.300
I'm already giggling about the joke.

00:16:17.740 --> 00:16:18.760
Yeah, it's coming.

00:16:18.760 --> 00:16:21.260
So those are our main items.

00:16:21.260 --> 00:16:27.760
You got anything extra to share with folks before we unleash an amazing joke on them?

00:16:27.760 --> 00:16:31.100
No, nothing extra this week.

00:16:31.100 --> 00:16:31.920
How about you?

00:16:31.920 --> 00:16:32.520
Not really.

00:16:32.520 --> 00:16:38.800
But I do want to say I'm looking forward to being at Py Cascades with you and everyone else up in Seattle into February.

00:16:38.980 --> 00:16:44.820
So if there's still tickets available by the time this goes out and people want to make it there, then definitely check it out.

00:16:44.820 --> 00:16:45.880
It was a fun conference last year.

00:16:45.880 --> 00:16:46.260
Definitely.

00:16:46.260 --> 00:16:46.740
Absolutely.

00:16:46.740 --> 00:16:47.200
All right.

00:16:47.200 --> 00:16:50.480
I guess we got our friend Dan Bader to thank for this, don't we?

00:16:50.480 --> 00:16:51.100
I guess.

00:16:51.100 --> 00:16:51.560
I think.

00:16:51.560 --> 00:16:52.660
I'm not sure.

00:16:52.660 --> 00:16:54.120
Somebody at RealPython.

00:16:54.120 --> 00:16:55.040
Yeah, somebody at RealPython.

00:16:55.040 --> 00:16:55.320
All right.

00:16:55.320 --> 00:16:56.200
Hit us with a joke.

00:16:56.200 --> 00:16:58.980
This comes from the RealPython Twitter and I linked to the joke.

00:16:58.980 --> 00:17:01.100
It's got a little graphic to it, but you can do it without.

00:17:01.100 --> 00:17:01.500
Yeah.

00:17:01.500 --> 00:17:03.560
So why do Pythons live on land?

00:17:03.560 --> 00:17:04.140
I don't know.

00:17:04.140 --> 00:17:05.120
They're snakes.

00:17:05.120 --> 00:17:05.620
I don't know why.

00:17:05.620 --> 00:17:07.680
Because they're above sea level.

00:17:08.900 --> 00:17:12.200
The letter C, capital dash level, of course.

00:17:12.200 --> 00:17:12.600
Yeah.

00:17:12.600 --> 00:17:15.280
Because Python's a higher level language.

00:17:15.280 --> 00:17:17.680
You know, it gets worse as you explain it more.

00:17:17.680 --> 00:17:19.260
That's right.

00:17:19.260 --> 00:17:20.980
See, because you don't compile it.

00:17:20.980 --> 00:17:21.140
No.

00:17:21.140 --> 00:17:22.400
Yeah, it's bad.

00:17:22.400 --> 00:17:25.040
It's a good joke, though.

00:17:25.040 --> 00:17:26.160
And very, very funny.

00:17:26.160 --> 00:17:26.780
Thanks for sharing.

00:17:26.780 --> 00:17:27.840
Yeah, definitely.

00:17:27.840 --> 00:17:28.960
So thank you.

00:17:28.960 --> 00:17:29.160
Yeah.

00:17:29.160 --> 00:17:30.160
Thanks for doing the episode as well.

00:17:30.160 --> 00:17:30.900
And goodbye, everyone.

00:17:30.900 --> 00:17:31.080
Bye.

00:17:31.080 --> 00:17:32.980
Thank you for listening to Python Bytes.

00:17:32.980 --> 00:17:35.500
Follow the show on Twitter via at Python Bytes.

00:17:35.500 --> 00:17:38.400
That's Python Bytes as in B-Y-T-E-S.

00:17:38.820 --> 00:17:41.820
And get the full show notes at pythonbytes.fm.

00:17:41.820 --> 00:17:46.160
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:17:46.160 --> 00:17:48.860
We're always on the lookout for sharing something cool.

00:17:48.860 --> 00:17:52.260
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:17:52.260 --> 00:17:55.760
Thank you for listening and sharing this podcast with your friends and colleagues.