WEBVTT

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

00:00:05.280 --> 00:00:13.440
This is episode 188, recorded June 24th, 2020. I'm Brian Okken.

00:00:13.440 --> 00:00:14.240
And I'm Michael Kennedy.

00:00:14.240 --> 00:00:20.620
And this episode is brought to you by us, Talk Python Training and Brian's fabulous pytest book.

00:00:20.620 --> 00:00:23.800
Brian, can you believe 188 contiguous episodes?

00:00:23.800 --> 00:00:28.260
I cannot. The number keeps going up. I guess that's what numbers do.

00:00:28.260 --> 00:00:31.620
I guess so. It's awesome. I'm glad we're still doing it. It's fun.

00:00:31.620 --> 00:00:32.920
What you got for us to start with?

00:00:32.920 --> 00:00:38.020
Well, you may have heard me talk about async. And actually, I didn't cover it on purpose.

00:00:38.020 --> 00:00:45.120
There's sort of a controversial async article going around. Don't really want to talk about it at the moment, unless I have to.

00:00:45.120 --> 00:00:52.740
But I do want to talk about my favorite async thing, which is unsync. U-N-S-Y-N-C. Unsync.

00:00:52.740 --> 00:00:53.140
Okay.

00:00:53.140 --> 00:00:57.740
I feel like the Python core developers should look at this and say, you know what?

00:00:57.740 --> 00:01:04.340
We massively overcomplicated all the asynchronous parallel capabilities of Python.

00:01:04.340 --> 00:01:10.280
Let's create a unifying API that is the one simple way that you can do things.

00:01:10.280 --> 00:01:13.460
And if you need to dig into the details of the other ones, that would be great.

00:01:13.460 --> 00:01:14.720
They haven't done that yet.

00:01:14.720 --> 00:01:16.200
I mean, async it away.

00:01:16.200 --> 00:01:17.060
The keywords are great.

00:01:17.060 --> 00:01:25.280
But if you want to, say, work with like a thread and some asyncio thing, the way you do it is like totally destroy and unrelated.

00:01:25.280 --> 00:01:33.400
So this unsync library is like a unification library on top of threading, multiprocessing, and async and await.

00:01:33.400 --> 00:01:35.920
So I've talked about that a bunch of times, and it's sweet.

00:01:35.920 --> 00:01:41.260
I'd love to see Python just adopt something very similar to that API internally.

00:01:41.260 --> 00:01:49.260
Anyway, there's a cool article called Making a Trading Bot Asynchronous Using Python's Unsync Library by Matt Godston.

00:01:49.260 --> 00:01:49.720
Oh, nice.

00:01:49.720 --> 00:01:50.300
Yeah, it's cool.

00:01:50.300 --> 00:01:56.520
It just walks you through a somewhat realistic example of creating something that does freighting.

00:01:56.520 --> 00:02:03.380
And in order to do it, it has to go and, you know, it talks to different web services and some databases and whatnot.

00:02:03.620 --> 00:02:09.740
Now, all these are simulated with a function call to a time.sleep call, right?

00:02:09.740 --> 00:02:20.160
One of the things you'll see a lot of people when they do like these performance analyses and stuff is they'll have some async code and it's hitting up against some other thing.

00:02:20.160 --> 00:02:26.760
And that other thing has a performance limit that is like near what it can handle anyway.

00:02:26.760 --> 00:02:28.680
And so you can't get a big boost out of it.

00:02:28.720 --> 00:02:36.780
So this kind of like puts that to the side and says like we're not going to actually talk to another thing because maybe that thing is slower than we can handle or who knows.

00:02:36.780 --> 00:02:41.260
We're just going to go and simulate slowness by sleeping, right?

00:02:41.260 --> 00:02:44.800
So it actually walks you through some different ways of doing things.

00:02:44.800 --> 00:02:49.880
It has a synchronous version and the async and await version using unsync.

00:02:50.000 --> 00:02:51.080
I don't know if there's intermediate.

00:02:51.080 --> 00:02:57.260
I can't remember if there's intermediate versions in this tutorial about having just a pure threaded version, right?

00:02:57.260 --> 00:03:00.680
But it's mostly about taking the synchronous version and making it unsync.

00:03:00.680 --> 00:03:04.160
So it's nice because it's a somewhat realistic example.

00:03:04.160 --> 00:03:09.420
It's not as much of a realistic example as some of the scenarios.

00:03:09.420 --> 00:03:12.260
It's not as ideal of an example as some of the other scenarios.

00:03:12.260 --> 00:03:16.000
Like for example, if I need to web scrape a hundred different websites, right?

00:03:16.000 --> 00:03:24.280
You can do that a hundred times faster by just like kicking them all off and getting it back and not really waiting because all the work is happening distributed elsewhere.

00:03:24.280 --> 00:03:27.560
But it's still a pretty realistic example doing some different things.

00:03:27.560 --> 00:03:34.080
It would be fun to hear it talk about scalability more like how much it's like we've got a couple.

00:03:34.080 --> 00:03:35.200
I think it's doing three things.

00:03:35.200 --> 00:03:36.740
It's like, look, we could do these three things quicker.

00:03:36.940 --> 00:03:38.260
But, you know, like what is the limit?

00:03:38.260 --> 00:03:39.920
Like how far can you push it?

00:03:39.920 --> 00:03:43.240
Because I think you could push it quite far actually with what they're doing.

00:03:43.240 --> 00:03:47.420
It's just hard to know when if sleeps are representative as well.

00:03:47.420 --> 00:03:47.760
Yeah.

00:03:47.760 --> 00:03:49.980
It is hard to know if like a sleep is representative.

00:03:49.980 --> 00:03:55.060
Basically, if it's like a truly external system that has infinite scale, right?

00:03:55.060 --> 00:03:58.240
Some cloud service, then a sleep is probably pretty representative.

00:03:58.240 --> 00:04:00.860
Like whatever you're doing is not going to affect it.

00:04:00.860 --> 00:04:03.260
But if it's say like a database, right?

00:04:03.300 --> 00:04:08.580
If I'm doing 10 requests against the database versus one, maybe the database can't handle it.

00:04:08.580 --> 00:04:11.900
And it slows down to what like two or three queries at a time would be like.

00:04:11.900 --> 00:04:12.820
There's things like that, right?

00:04:12.820 --> 00:04:13.780
Where it hits a limit.

00:04:13.780 --> 00:04:18.400
But if the thing you're talking to totally scales and sometimes it does, sometimes it doesn't.

00:04:18.400 --> 00:04:25.320
One thing that I think is missing from this is it doesn't actually use async methods.

00:04:25.320 --> 00:04:27.080
It just has regular methods.

00:04:27.080 --> 00:04:29.240
So this is really an interesting thing, right?

00:04:29.240 --> 00:04:31.200
So it's like, okay, we're going to put unsync on it.

00:04:31.680 --> 00:04:38.040
Here's some regular functions and we put the unsync decorator, which turns them into these things that are awaitable and parallel and so on.

00:04:38.040 --> 00:04:48.280
And what you really probably want to do is actually leverage async and await, create, you know, def async methods, use, you know, await asyncio sleep and all that kind of stuff.

00:04:48.280 --> 00:04:52.800
So it didn't actually fully transition them to leveraging asyncio.

00:04:53.180 --> 00:04:57.580
But what I think is interesting about that is it still got much better with unsync.

00:04:57.580 --> 00:05:00.320
And what's cool is like it said, okay, well, these are not async methods.

00:05:00.320 --> 00:05:03.900
So we're going to have to use threads, but let's just fire them off with threads anyway.

00:05:03.900 --> 00:05:09.980
And because the time.sync releases the gill, just like a network call would, it still kind of works.

00:05:09.980 --> 00:05:16.380
So it's kind of neat that like it wasn't fully converted over, but unsync still made it better in the same way that you would expect.

00:05:16.380 --> 00:05:16.800
Interesting.

00:05:16.800 --> 00:05:17.220
Yeah.

00:05:17.220 --> 00:05:17.500
Yeah.

00:05:17.500 --> 00:05:17.700
Yeah.

00:05:17.700 --> 00:05:22.680
So anyway, a cool example of someone talking about unsync was not me.

00:05:22.680 --> 00:05:25.480
Except for right now, reviewing it.

00:05:25.720 --> 00:05:29.280
There's a lot of cool stuff in there, kind of like a fruit salad, would you say?

00:05:29.280 --> 00:05:30.100
Yeah.

00:05:30.100 --> 00:05:33.640
Just a lot of stuff to take and it's sweet and people generally enjoy it.

00:05:33.640 --> 00:05:37.920
Oh man, I shouldn't have picked this story right before lunch also, because I'm kind of hungry.

00:05:37.920 --> 00:05:38.320
I know.

00:05:38.320 --> 00:05:39.360
I know.

00:05:39.360 --> 00:05:40.360
It's good.

00:05:40.360 --> 00:05:41.460
So tell us about this.

00:05:41.460 --> 00:05:46.380
I was going to put this as an extra thing, but I put it as one of my topics because it's actually pretty darn cool.

00:05:46.380 --> 00:05:54.820
So this, on Twitter, Lacey Henschel just asked the question of like, there was this scrum estimation tool with fruit.

00:05:54.820 --> 00:05:56.000
Does anybody remember it?

00:05:56.000 --> 00:06:00.720
And Kathleen Jones replied and said, is this it?

00:06:00.720 --> 00:06:01.200
Essentially.

00:06:01.200 --> 00:06:01.900
And it was.

00:06:01.900 --> 00:06:04.480
And so we're linking to this article.

00:06:04.480 --> 00:06:07.960
It's called the Fruit Salad Scrum Estimation Scale.

00:06:08.500 --> 00:06:16.360
And, you know, task planning and scrum estimation is a, you know, it's a kind of an art form and a science together.

00:06:16.360 --> 00:06:18.680
It takes a while to get things right.

00:06:18.680 --> 00:06:23.800
So maybe just really, really super quickly tell people, what is this scrum estimation about?

00:06:23.800 --> 00:06:24.520
Oh, okay.

00:06:24.520 --> 00:06:27.440
Maybe scientists and they're like, we don't do that in our biology lab.

00:06:27.440 --> 00:06:28.420
Oh, that's true.

00:06:28.420 --> 00:06:38.440
Lots of teams have picked up scrum or sort of a variant of scrum, which is a way to plan what tasks, what things that people are going to work on.

00:06:39.320 --> 00:06:45.000
And the things that people work on, we kind of want to, you know, have a, like a size for them.

00:06:45.000 --> 00:06:52.180
And instead of doing like, oh, it's a one day task or a two day task or a five day task, or some people just use small, medium, large.

00:06:52.180 --> 00:06:53.640
T-shirt sizes are popular.

00:06:53.640 --> 00:06:59.000
And then also, for some reason, just points are very popular.

00:06:59.000 --> 00:07:05.140
And the point system is often a Fibonacci sequence, which, but it's not really, it's just kind of Fibonacci.

00:07:05.140 --> 00:07:07.860
So I can't remember the numbers right off the top of my head.

00:07:07.920 --> 00:07:10.340
I think they're like one, two, three.

00:07:10.340 --> 00:07:11.680
We usually skip three.

00:07:11.680 --> 00:07:16.660
So one, two, either four or five and like eight sometimes.

00:07:16.660 --> 00:07:18.940
And then like 13 and 40.

00:07:18.940 --> 00:07:24.140
So it isn't really quite fit normal Fibonacci, but I think that's where people took it from.

00:07:24.140 --> 00:07:32.080
So we've been using them at work as well lately, but the numbers, it's kind of like t-shirt sizes, but I don't know.

00:07:32.260 --> 00:07:33.880
None of these things really fit.

00:07:33.880 --> 00:07:38.560
But the fruit salad estimation scale actually kind of fits.

00:07:39.220 --> 00:07:46.760
So they've mapped one, two, three, five, and eight to grape, apple, cherry, pineapple, and watermelon.

00:07:47.480 --> 00:07:55.180
And I like these ideas because they're kind of like how easy they are to cut up something and how easy they are to eat them.

00:07:55.180 --> 00:07:56.840
So like a grape is trivial.

00:07:56.840 --> 00:07:58.360
You know, you just pop it in your mouth.

00:07:58.360 --> 00:07:59.040
It's no big deal.

00:07:59.040 --> 00:08:01.120
You don't even have to cut it up for a fruit salad.

00:08:01.120 --> 00:08:02.120
Although I usually do.

00:08:02.120 --> 00:08:03.140
An apple.

00:08:03.520 --> 00:08:07.460
Everybody knows how to cut up an apple, but it's a little more food.

00:08:07.460 --> 00:08:10.520
So it takes a little bit more and it might take some more time.

00:08:10.520 --> 00:08:11.520
A cherry.

00:08:11.520 --> 00:08:15.860
It's also easy, but there's some unknowns in it because of the pit.

00:08:15.860 --> 00:08:17.360
And a pineapple.

00:08:17.360 --> 00:08:19.580
Yeah, you can't just eat that.

00:08:19.580 --> 00:08:21.900
You've got to actually put some work into it.

00:08:21.900 --> 00:08:26.320
Some people don't know how to cut it up and it's a little messy.

00:08:26.320 --> 00:08:29.160
You're going to have to get your hands dirty for that one.

00:08:29.160 --> 00:08:30.180
And a watermelon.

00:08:30.180 --> 00:08:31.420
All bets are off.

00:08:31.420 --> 00:08:32.080
Nobody knows.

00:08:32.520 --> 00:08:35.720
You don't know what you're getting into until you cut open the watermelon.

00:08:35.720 --> 00:08:38.080
So I like that as the large size.

00:08:38.080 --> 00:08:40.180
There's more description on this article.

00:08:40.180 --> 00:08:42.320
And then they throw in some nice ones.

00:08:42.320 --> 00:08:43.680
Tomato and avocado.

00:08:43.680 --> 00:08:46.900
Tomato and avocado do not map to points.

00:08:46.900 --> 00:08:49.680
But tomato is unknown.

00:08:49.680 --> 00:08:52.000
I mean, are you a fruit or are you not?

00:08:52.000 --> 00:08:55.360
And you need more information before you can estimate it.

00:08:55.360 --> 00:08:58.960
And it really doesn't belong in the fruit salad until you change it into something else.

00:08:58.960 --> 00:09:01.680
And then one of my favorites is avocado.

00:09:02.020 --> 00:09:03.600
That's something that you just get.

00:09:03.600 --> 00:09:05.500
You can't really scope it very well.

00:09:05.500 --> 00:09:08.560
And it's probably urgent because it'll go bad quickly.

00:09:08.560 --> 00:09:09.640
These are great.

00:09:09.640 --> 00:09:12.040
I like this concept of thinking about them here.

00:09:12.040 --> 00:09:12.320
Yeah.

00:09:12.320 --> 00:09:17.180
So I think that somebody needs to put these fruits in an official product.

00:09:17.180 --> 00:09:18.100
That would be cool.

00:09:18.100 --> 00:09:19.420
That would be cool.

00:09:19.420 --> 00:09:21.680
You know, another one that comes to mind here is a mango.

00:09:21.960 --> 00:09:22.080
Yeah.

00:09:22.080 --> 00:09:22.400
Yeah.

00:09:22.400 --> 00:09:27.560
You know, those are tricky because I like to cut them like in the orientation of the husk

00:09:27.560 --> 00:09:29.540
or whatever the thing in the middle is, the giant seed.

00:09:29.540 --> 00:09:33.060
But you got to hack into it a little bit before you can even figure out what that is.

00:09:33.060 --> 00:09:35.560
So you kind of start out unknown and it's slippery.

00:09:35.560 --> 00:09:36.760
You may hurt yourself on it.

00:09:36.800 --> 00:09:41.000
But it's really, I don't know, it's a high value once you get it out of there.

00:09:41.000 --> 00:09:41.560
I don't know.

00:09:41.560 --> 00:09:42.140
Mango.

00:09:42.340 --> 00:09:46.680
And sometimes you can't tell until you get into the mango if it's even good or not.

00:09:46.680 --> 00:09:47.460
Exactly.

00:09:47.460 --> 00:09:48.260
Yeah.

00:09:48.260 --> 00:09:48.520
Yeah.

00:09:48.520 --> 00:09:50.740
I think mango is in this category somewhere.

00:09:50.740 --> 00:09:54.840
But this is a really cool idea of thinking about it because it's super hard to be very

00:09:54.840 --> 00:09:56.520
accurate when you're estimating stuff.

00:09:56.520 --> 00:10:01.480
And what I like about this is it just brings that together in a pretty clear way, right?

00:10:01.480 --> 00:10:03.000
They're not like, well, how many hours is it going to take?

00:10:03.000 --> 00:10:04.940
It's going to take three or four hours.

00:10:04.940 --> 00:10:05.740
Like, no, no, no.

00:10:05.740 --> 00:10:06.280
We're not talking.

00:10:06.280 --> 00:10:08.900
Like, I can't possibly give you that answer.

00:10:08.900 --> 00:10:10.560
It's like, all right, fine.

00:10:10.560 --> 00:10:12.300
It's four hours plus or minus 16 hours.

00:10:13.260 --> 00:10:13.540
Yeah.

00:10:13.540 --> 00:10:14.940
And then that kind of stuff.

00:10:14.940 --> 00:10:19.600
If you do points, people always have like some conversion to hours anyway, and it's annoying.

00:10:19.600 --> 00:10:24.780
I think it'd be cool to if somebody said, you know, I got a manager or somebody saying, hey,

00:10:24.780 --> 00:10:27.400
hey, how many, how much time we have left?

00:10:27.400 --> 00:10:30.900
And be like, well, we have three grapes and a cherry left to do.

00:10:30.900 --> 00:10:32.340
Yeah.

00:10:32.340 --> 00:10:34.260
Just don't talk about it by lunchtime.

00:10:34.260 --> 00:10:37.040
Anyway, I am hungry now.

00:10:37.040 --> 00:10:42.280
So, instead of doing another topic, we should just talk about how awesome we are.

00:10:42.360 --> 00:10:43.940
How awesome your training courses are.

00:10:43.940 --> 00:10:44.420
Thanks.

00:10:44.420 --> 00:10:49.020
Well, so this episode is brought to you by us, and we both are doing stuff we would love for

00:10:49.020 --> 00:10:49.700
you to check out.

00:10:49.700 --> 00:10:51.720
So, over at Talk By The Line Training, we have a bunch of courses.

00:10:51.720 --> 00:10:56.740
I think we're up, probably by the time that this goes out, we're up to almost 200 hours

00:10:56.740 --> 00:10:59.420
of courses and a couple hundred hours of exercises.

00:10:59.420 --> 00:11:01.480
So, lots of stuff to be learned over there.

00:11:01.480 --> 00:11:07.400
But I want to call out, if you have a company and your company has a training budget or a

00:11:07.400 --> 00:11:09.260
training plan, you know, reach out to us.

00:11:09.260 --> 00:11:15.160
We have special deals and offers and pilot programs to help get our courses started at

00:11:15.160 --> 00:11:15.600
your company.

00:11:15.760 --> 00:11:20.820
So, shoot me a message over at Michael at talkpython.fm, or just check us out over

00:11:20.820 --> 00:11:21.000
there.

00:11:21.000 --> 00:11:24.000
And if they're writing code, they should test it, right?

00:11:24.000 --> 00:11:25.160
Definitely should test it.

00:11:25.160 --> 00:11:31.020
And tell everybody, the Python testing with pytest is the best way to get started with testing

00:11:31.020 --> 00:11:31.720
with Python.

00:11:32.420 --> 00:11:37.880
And even though it's like 180 pages, the first two or three chapters will get you up

00:11:37.880 --> 00:11:39.940
and running like in a day, less than a day.

00:11:39.940 --> 00:11:44.700
So, you can get started right away and then you just get faster and more awesome as you

00:11:44.700 --> 00:11:45.120
go along.

00:11:45.120 --> 00:11:45.500
Indeed.

00:11:45.500 --> 00:11:49.140
I take advantage of all those features and pytests that people might not know about.

00:11:49.140 --> 00:11:49.340
Yep.

00:11:49.340 --> 00:11:54.380
So, you know, one thing I think people come into programming often feel like if they're

00:11:54.380 --> 00:11:56.280
going to be programmers, they have to be good at math.

00:11:56.280 --> 00:11:59.060
Like, oh, I was really good at calculus, so I'd be a good programmer.

00:11:59.060 --> 00:12:02.400
Or I never actually got algebra very well, so I'd probably be able to be a good programmer.

00:12:02.400 --> 00:12:07.860
And I think that connection is often very much not true.

00:12:07.860 --> 00:12:11.980
Like, I don't do math other than like basic arithmetic in my programming these days.

00:12:11.980 --> 00:12:14.380
But some people do, right?

00:12:14.380 --> 00:12:20.920
Some people come as engineers or they come as scientists and they actually do math frequently

00:12:20.920 --> 00:12:22.980
and they want to do it with Python.

00:12:22.980 --> 00:12:31.160
So, Vernon Thamaret sent over this cool project called Math to Code.

00:12:31.160 --> 00:12:31.980
Have you seen this?

00:12:31.980 --> 00:12:32.320
Yeah.

00:12:32.320 --> 00:12:32.480
Yeah.

00:12:32.480 --> 00:12:33.900
I was checking this out the other day.

00:12:33.900 --> 00:12:34.840
It's pretty fun.

00:12:34.840 --> 00:12:35.140
Yeah.

00:12:35.140 --> 00:12:39.680
So, imagine you wanted to learn something by doing flashcards.

00:12:39.680 --> 00:12:40.580
Right?

00:12:40.580 --> 00:12:41.480
I'm going to show myself.

00:12:41.480 --> 00:12:45.640
I'm going to flip through them and like see like a simple thing and then what the answer

00:12:45.640 --> 00:12:46.140
to that is.

00:12:46.140 --> 00:12:47.180
And this is kind of like that.

00:12:47.180 --> 00:12:51.020
Like it starts out and says, what I want you to do is take the square root of something

00:12:51.020 --> 00:12:52.020
using NumPy.

00:12:52.020 --> 00:12:55.240
And it's all based on NumPy or just pure Python.

00:12:55.240 --> 00:12:57.300
Like raise something to the power.

00:12:57.300 --> 00:12:59.360
It's just X star star Y, for example.

00:12:59.360 --> 00:13:02.580
But it just really quickly and simply takes you through that.

00:13:02.660 --> 00:13:04.380
So, you type out the answer, hit enter.

00:13:04.380 --> 00:13:06.820
It's all hotkey driven, which is great for a web app.

00:13:06.820 --> 00:13:13.560
And it just kind of guides you through like practice experience of here's a math problem.

00:13:13.560 --> 00:13:14.400
Solve it.

00:13:14.400 --> 00:13:14.780
NumPy.

00:13:14.940 --> 00:13:15.260
Yeah.

00:13:15.260 --> 00:13:17.200
And it's so beautiful.

00:13:17.200 --> 00:13:17.980
It is pretty, right?

00:13:17.980 --> 00:13:18.280
Yeah.

00:13:18.280 --> 00:13:18.620
Cool.

00:13:18.620 --> 00:13:18.880
Yeah.

00:13:18.880 --> 00:13:20.720
I honestly haven't made it to the end.

00:13:20.720 --> 00:13:26.420
So, I don't know how many answers or questions or whatever there are or flashcards as I'm calling

00:13:26.420 --> 00:13:26.640
them.

00:13:26.640 --> 00:13:30.040
But it is open source on GitHub, which is pretty cool.

00:13:30.040 --> 00:13:35.960
So, you can go in there and, you know, check out the source code and play with it.

00:13:35.960 --> 00:13:42.320
And yeah, it looks like 13 questions, but it's on GitHub and the questions are just marked

00:13:42.320 --> 00:13:42.520
down.

00:13:42.520 --> 00:13:44.620
So, you could go add as many as you would like.

00:13:45.160 --> 00:13:46.160
Actually, that's pretty cool.

00:13:46.160 --> 00:13:46.460
Yeah.

00:13:46.460 --> 00:13:51.600
But what also is interesting, just at a more higher metal level, maybe you don't care about

00:13:51.600 --> 00:13:57.280
finding, you know, the square root of something in Python, is the building blocks.

00:13:57.280 --> 00:14:01.440
So, if you look at how this thing is built, and like I said, open source on GitHub, you

00:14:01.440 --> 00:14:01.960
can check it out.

00:14:01.960 --> 00:14:05.380
It's built running Python on the client side.

00:14:05.380 --> 00:14:05.760
What?

00:14:05.760 --> 00:14:06.200
Really?

00:14:06.200 --> 00:14:06.600
Yeah.

00:14:06.600 --> 00:14:11.320
So, it's built using Sculpt, which is a JavaScript implementation of Python.

00:14:11.840 --> 00:14:18.020
And then it has Sculpt NumPy for the subset of NumPy running on a client side that it wants

00:14:18.020 --> 00:14:20.360
you to experiment with, right?

00:14:20.360 --> 00:14:24.080
Like NumPy.square root, for example, or MPs.square root.

00:14:24.500 --> 00:14:29.280
It has KTX for rendering LaTeX on the browser side.

00:14:29.280 --> 00:14:34.060
It has Next.js for front-end, Tailwind CSS, which my friend Mark just told me about, which

00:14:34.060 --> 00:14:38.080
is a really interesting alternative way to like CSS front-end frameworks.

00:14:38.360 --> 00:14:44.320
I like Bootstrap, but different Remark from Markdown on the client side, Gray Matter, all

00:14:44.320 --> 00:14:44.740
sorts of stuff.

00:14:44.740 --> 00:14:49.140
So, there's a lot of cool building blocks here, regardless of whether or not you're actually

00:14:49.140 --> 00:14:49.960
into the questions.

00:14:49.960 --> 00:14:51.920
Yeah, this is awesome.

00:14:51.920 --> 00:14:55.080
That might be more interesting, actually, than the thing, right?

00:14:55.080 --> 00:14:58.220
Because I honestly don't care about learning the math features generally.

00:14:58.220 --> 00:15:00.060
It's nice, but it's just not as it might do.

00:15:00.200 --> 00:15:04.120
Yeah, but this sort of model of like have a, I mean, if you look at it, I don't know if

00:15:04.120 --> 00:15:08.440
you already said this, but if you look at it, you've got like some explanation and a question

00:15:08.440 --> 00:15:13.200
on the left, a place to type in and submit your answer on the right, and then there's even

00:15:13.200 --> 00:15:18.900
a place where you can like set up a hint and show the answer or a hint for somebody.

00:15:18.900 --> 00:15:26.280
And having all this just, it looks very nice, and having like this as an example for somebody

00:15:26.280 --> 00:15:26.440
else.

00:15:26.440 --> 00:15:31.960
I could totally see like a teacher running with this to help their students learn really

00:15:31.960 --> 00:15:32.860
pretty much anything.

00:15:32.860 --> 00:15:36.680
Yeah, it doesn't have to be exactly Python, as long as you can verify it with Python.

00:15:36.680 --> 00:15:37.640
Yeah, cool.

00:15:37.640 --> 00:15:38.060
Yeah, yeah.

00:15:38.060 --> 00:15:38.940
Tell us about the PEP.

00:15:38.940 --> 00:15:40.640
There's always a PEP to be discussed.

00:15:40.640 --> 00:15:43.400
I've learned about a couple of new PEPs in the 3.9 time frame.

00:15:43.400 --> 00:15:47.660
Right, so this is the 3.10 time frame.

00:15:47.660 --> 00:15:54.400
So, where everybody should be using 3.8 now, and you should be testing 3.9, especially if you

00:15:54.400 --> 00:16:00.640
have a package that depends on, that people depend on, so that when 3.9 is then official,

00:16:00.640 --> 00:16:01.800
it'll all work.

00:16:01.800 --> 00:16:08.200
But people are already working on 3.10, of course, and one of the PEPs for 3.10 is PEP 6.22,

00:16:08.200 --> 00:16:11.520
and it's not official yet.

00:16:11.520 --> 00:16:18.020
It's in draft status, but there's some cool people working on it, including Guido, and I

00:16:18.020 --> 00:16:19.900
think it's super cool.

00:16:19.900 --> 00:16:21.580
Have you taken a look at this?

00:16:21.680 --> 00:16:22.840
I have taken a look at it.

00:16:22.840 --> 00:16:25.700
It starts out to me feeling like a switch statement.

00:16:25.700 --> 00:16:26.620
Yeah.

00:16:26.620 --> 00:16:28.620
But there's a lot more going on here.

00:16:28.620 --> 00:16:30.700
It's called structural pattern matching.

00:16:30.700 --> 00:16:36.300
And right off the bat, they note that there have been previous PEPs before that have tried

00:16:36.300 --> 00:16:40.060
to put switch case statements in Python, and they've been rejected.

00:16:40.060 --> 00:16:41.500
I don't know why they were rejected.

00:16:41.680 --> 00:16:43.540
It's kind of something I didn't pay attention to.

00:16:43.540 --> 00:16:51.180
But this, yes, instead of a switch case, it's a match case statement and a multiple statements.

00:16:51.180 --> 00:16:54.380
But the neat thing is there's all these different...

00:16:54.380 --> 00:17:00.620
So when we think of like a switch case statement in like from C, it matches by equality or value.

00:17:00.620 --> 00:17:04.040
You switch on some variable name or some expression.

00:17:04.540 --> 00:17:10.020
And if the answer matches one of the case statements, then you run that part of the code.

00:17:10.020 --> 00:17:20.340
So that would be in the PEP 622 world, that sort of a use model would be like the literal pattern or the constant value pattern, basically with equality and stuff.

00:17:20.500 --> 00:17:21.840
But it does more than that.

00:17:21.840 --> 00:17:26.180
You've got name patterns so that if you just have a whatever, if these will always...

00:17:26.180 --> 00:17:36.140
If nothing else succeeds prior to it, you can just have a variable name and it just assigns whatever you're passing in to that name and you can use it there.

00:17:36.140 --> 00:17:38.120
My first thought was, what's the big deal?

00:17:38.120 --> 00:17:40.520
You already have the variable name or the value.

00:17:41.020 --> 00:17:45.320
But this new value in the name pattern is only available in that.

00:17:45.320 --> 00:17:48.900
It isn't assigned otherwise if that didn't get hit.

00:17:48.900 --> 00:17:51.340
So that's kind of some useful, neat things.

00:17:51.340 --> 00:17:54.800
Constant pattern is kind of the same, but then it gets interesting.

00:17:54.800 --> 00:17:57.540
So I think it'd be worth it just for that.

00:17:57.540 --> 00:18:01.360
But you've got sequence patterns where you can do...

00:18:01.360 --> 00:18:03.480
It works like unpacking assignment stuff.

00:18:03.480 --> 00:18:09.640
You've got mapping patterns that are like similar to sequences, but for like dictionaries.

00:18:10.280 --> 00:18:18.900
And class patterns where you can have like a custom class or a class that it might be and you have a match object.

00:18:18.900 --> 00:18:22.280
It's similar to equality, but you could have...

00:18:22.280 --> 00:18:23.600
It could be different than equality.

00:18:23.600 --> 00:18:31.920
And then you can combine them with ores so you can match cases if multiple things are true, like a boolean expression in there.

00:18:31.920 --> 00:18:37.020
I don't think it's a full boolean expression, but at least ores work for pipes.

00:18:37.020 --> 00:18:38.440
Guards.

00:18:38.440 --> 00:18:45.320
So you can say if this pattern matches and then have an extra if expression so you can clarify it even more.

00:18:45.320 --> 00:18:47.240
And then even sub patterns.

00:18:47.240 --> 00:18:49.180
And at that point, I kind of got lost.

00:18:49.180 --> 00:18:51.480
So just there's a lot here.

00:18:51.480 --> 00:18:54.440
I don't think it's going to clutter Python up.

00:18:54.440 --> 00:18:59.180
Actually, I've seen some examples of how this would dramatically simplify some Python.

00:18:59.180 --> 00:19:00.380
Yeah, it's interesting.

00:19:00.780 --> 00:19:05.320
What's surprising to me is how many types of things it's trying to do at once, right?

00:19:05.320 --> 00:19:08.780
Like it's not just like, oh, let's have a switch statement with like a slight variation.

00:19:08.780 --> 00:19:09.780
Like it's...

00:19:09.780 --> 00:19:21.060
There's a ton of stuff going on, including things like if you switch on an enumeration, you can just say dot attribute and it'll try to like pull that attribute out of that type and check it.

00:19:21.060 --> 00:19:23.100
And yeah, it's pretty interesting.

00:19:23.100 --> 00:19:28.720
One thing that's missing here that I would love to see is range matching.

00:19:29.420 --> 00:19:29.860
Right.

00:19:29.860 --> 00:19:33.160
So I could say it's in the range of zero to 10.

00:19:33.160 --> 00:19:34.460
Match this case.

00:19:34.460 --> 00:19:38.320
If it's a range of 11 to 100, do this other thing.

00:19:38.320 --> 00:19:45.380
Actually, so I have my package, the switch link package, which adds switch to Python and it has those types of things.

00:19:45.380 --> 00:19:50.520
So I actually sent that over to one of the people working on this PEP and said, hey, this is really cool.

00:19:50.520 --> 00:19:56.740
You know, check out some of the ideas from this one, like especially the range matching and see if it makes sense here.

00:19:56.740 --> 00:20:04.440
Because it's so common that you would want to say like this range is this case, that range is that case and so on.

00:20:04.440 --> 00:20:06.260
And we even talked about a package a while ago.

00:20:06.260 --> 00:20:10.780
I can't remember exactly what it was called, which is unfortunate.

00:20:10.780 --> 00:20:12.280
We've covered too many things.

00:20:12.280 --> 00:20:20.840
But it was basically you could give a like a number or a value and then this range and you could ask, is this thing in that range in some real simple ways?

00:20:20.840 --> 00:20:22.600
So it'd be cool if like that was all combined.

00:20:22.600 --> 00:20:24.440
You might be able to do it with the if guard though.

00:20:24.600 --> 00:20:30.200
So you could say like, you know, match X if X is within, you know, in this range.

00:20:30.200 --> 00:20:30.520
Yep.

00:20:30.520 --> 00:20:31.320
Yep.

00:20:31.320 --> 00:20:32.420
It's true.

00:20:32.420 --> 00:20:33.120
Yeah, we'll see.

00:20:33.120 --> 00:20:38.060
I mean, at that point, like if you're writing a lot of complicated if statements, you might as well just write if statements.

00:20:38.060 --> 00:20:40.080
Right.

00:20:40.080 --> 00:20:40.420
Yeah.

00:20:40.420 --> 00:20:40.960
Yeah.

00:20:41.120 --> 00:20:46.600
Although, I mean, it's just always, I don't like it when I see like these, the if else ladders.

00:20:46.840 --> 00:20:51.740
So I think that this is more than, of course, more than just replacing the if else ladders.

00:20:51.740 --> 00:20:56.680
It's also doing things like unpacking and other sorts of cool stuff.

00:20:56.680 --> 00:20:57.160
But you're right.

00:20:57.160 --> 00:20:57.380
Yeah.

00:20:57.380 --> 00:20:58.520
There's a lot going on here.

00:20:58.520 --> 00:20:59.460
There is.

00:20:59.460 --> 00:21:00.320
There is.

00:21:00.320 --> 00:21:02.860
But it's cool to see innovation around this.

00:21:02.860 --> 00:21:06.660
I do feel like that thing, that general idea is missing from Python.

00:21:06.660 --> 00:21:18.220
I know people say you could just use a dictionary or stuff, but there's like a lot of cases where if else is buggy, hard to maintain, or like these other cases are very, you know, verbose and so on.

00:21:18.220 --> 00:21:21.120
Anyway, I'm happy to see this, I think, depending on how it comes out.

00:21:21.120 --> 00:21:23.880
It's very complicated, but the idea is good.

00:21:24.300 --> 00:21:30.160
So one thing that we've talked about a lot, Brian, is how do you host your own private PyPI, right?

00:21:30.160 --> 00:21:40.040
Pip install a thing, but I want to be able to pip install and version, like say you work at a large company, you probably have libraries, packages that you've shared across projects.

00:21:40.040 --> 00:21:45.000
How do you like have the pip style package management, but for you?

00:21:45.000 --> 00:21:47.900
Well, we've got a custom PyPI at work.

00:21:47.900 --> 00:21:49.040
That's right.

00:21:49.040 --> 00:21:49.740
And that's fine.

00:21:49.740 --> 00:21:50.300
That's fine.

00:21:50.740 --> 00:21:56.340
The more global you are, the harder it is to maybe do that well without people getting a hold of it.

00:21:56.340 --> 00:22:01.400
Like, obviously you want to protect that code because that's internal private code, but at the same time you want to share and version it.

00:22:01.400 --> 00:22:05.720
So there's all sorts of options that you can set up and take care of that.

00:22:05.720 --> 00:22:14.380
But there's this new thing, which Tormod McLeod has said over our way, called Code Artifact from AWS.

00:22:14.380 --> 00:22:14.920
Neat.

00:22:15.000 --> 00:22:15.140
Yeah.

00:22:15.140 --> 00:22:23.920
So the idea is it is a general purpose, basically package management system for a variety of things.

00:22:23.920 --> 00:22:27.920
So right now it works with Java, with Maven and Gradle.

00:22:27.920 --> 00:22:30.160
For JavaScript, it has npm and Yarn.

00:22:30.160 --> 00:22:32.340
And for Python, it has pip and Twine.

00:22:32.340 --> 00:22:37.000
And basically you can just set it up in AWS and tell it to go.

00:22:37.260 --> 00:22:41.460
And it'll take care of all the storage and the security and all that kind of stuff.

00:22:41.460 --> 00:22:43.820
And then you can just pip install all the things.

00:22:43.820 --> 00:22:48.420
And it also is backed by the real PyPI or the realnpm.

00:22:48.420 --> 00:22:50.060
And you can whitelist stuff.

00:22:50.060 --> 00:22:57.380
You say, okay, if somebody pip installs requests, just get the real requests and stay in sync with that, but let them have it.

00:22:57.380 --> 00:23:05.080
But if they pip install the misspelled request, I think you can say don't let them have the typo squatting hacker version.

00:23:05.080 --> 00:23:05.520
Yeah.

00:23:05.520 --> 00:23:14.560
So these sorts of solutions are pretty interesting to be able to have basically a cache of PyPI stuff and then also your own stuff.

00:23:14.560 --> 00:23:18.180
So you push to it just like often you publish it.

00:23:18.180 --> 00:23:24.120
I don't know about this one, but often some of these you use Twine or something to push just like you normally would.

00:23:24.120 --> 00:23:26.220
But it doesn't go to PyPI.

00:23:26.220 --> 00:23:27.260
It goes to your own thing.

00:23:27.260 --> 00:23:28.240
Yeah, it's pretty neat.

00:23:28.240 --> 00:23:34.300
It reminds me of Artifactory, which people might have heard of, which looks really cool.

00:23:34.300 --> 00:23:42.180
However, if you look at the pricing, it starts at just $2,900 a year for the base version.

00:23:42.180 --> 00:23:45.220
The pro version is $14,000 and it goes up from there.

00:23:45.980 --> 00:23:52.840
So, you know, this looks like one of those cases where one of these cloud services from places like AWS and so on is coming along and going, you know what?

00:23:52.840 --> 00:23:54.000
We got you.

00:23:54.000 --> 00:23:57.500
And it's not $14,000 a year or whatever or a month.

00:23:57.500 --> 00:23:57.920
I don't know.

00:23:57.920 --> 00:24:00.420
Whatever the unit was I said there per year.

00:24:00.420 --> 00:24:00.680
Yeah.

00:24:00.780 --> 00:24:04.880
I think to some degree, I believe GitHub is working on something like this as well.

00:24:04.880 --> 00:24:11.180
I can't remember what it's called over GitHub, but it doesn't have Python yet, which is why I haven't jumped up and down about it.

00:24:11.180 --> 00:24:12.400
But I think it will.

00:24:12.400 --> 00:24:13.240
I think they're working on it.

00:24:13.240 --> 00:24:19.940
Well, supposedly like warehouse was something you could just use that is used for, well, I guess they don't call it warehouse anymore.

00:24:19.940 --> 00:24:22.100
PyPI.org, the new PyPI.

00:24:22.100 --> 00:24:22.560
Yeah.

00:24:23.060 --> 00:24:33.240
So, I think that you can deploy that yourself, but there's not, I haven't seen very many people like, well, one, I'd like to see people write instructions on really how to get that up and running for yourself.

00:24:33.240 --> 00:24:38.640
And I'd also like to see some like, you know, warehouse as a service sorts of things.

00:24:38.640 --> 00:24:39.400
I mean, why not?

00:24:39.400 --> 00:24:41.920
Some free money laying on the table there, people.

00:24:41.920 --> 00:24:42.660
Yeah, that's a good point.

00:24:42.660 --> 00:24:43.360
That's right.

00:24:43.360 --> 00:24:44.160
All right.

00:24:44.160 --> 00:24:44.800
What's this last one?

00:24:44.800 --> 00:24:46.660
I wanted to bring up Invoke.

00:24:46.660 --> 00:24:52.780
And it's at, what, pyinvoke.org is where you can see the documentation for this.

00:24:53.400 --> 00:25:01.380
And to tell you the truth, we've had it on our list for a while and I've tried several times and couldn't get it to work, but I had some confusion.

00:25:01.380 --> 00:25:09.360
So, then my confusion was the product, when you install it, you install it with pip install invoke, not with the py part.

00:25:09.360 --> 00:25:13.500
But there is a pyinvoke on PyPI, but it does something different.

00:25:13.500 --> 00:25:22.120
So, the invoke that I'm talking about is invoke without the py in front, but the website is pyinvoke.org.

00:25:22.120 --> 00:25:22.740
Okay.

00:25:23.440 --> 00:25:26.120
If you're confused, I'm confused, but we've got it in the show notes.

00:25:26.120 --> 00:25:27.740
But why do we care about this?

00:25:27.740 --> 00:25:31.980
We care about it because it does make me feel, I like make files.

00:25:31.980 --> 00:25:33.380
I think make files are fine.

00:25:33.380 --> 00:25:35.120
There's parts of them I don't like.

00:25:35.120 --> 00:25:42.620
Like, I don't like that the tab, like, it's the only thing in my life that I have to use tabs for because I usually use spaces in Python.

00:25:43.340 --> 00:25:44.340
Make files have tabs.

00:25:44.340 --> 00:25:57.920
And often things like cleaning out your, building your documentation or kicking off your tests or deploying or a lot of those other book maintenance things for a project you put into a make file.

00:25:57.920 --> 00:26:00.520
And some people use talks for that, and you can.

00:26:00.520 --> 00:26:05.380
But invoke is intended to do that sort of thing, but with Python code.

00:26:05.920 --> 00:26:11.360
So, with invoke, you just create a little task.py file with these little types.

00:26:11.360 --> 00:26:16.360
You just have little functions that you decorate with the at task decorator.

00:26:16.360 --> 00:26:22.180
If you have it installed, you can just say on the command line invoke and then the name of the function.

00:26:22.360 --> 00:26:27.420
So, if you have a build function, you can say invoke build, and you can pass in command flags to it.

00:26:27.420 --> 00:26:29.820
And it's just pretty easy to run something.

00:26:29.820 --> 00:26:34.680
So, something like you would use make files for, you can have it without any make files.

00:26:34.680 --> 00:26:35.260
Yeah, that's cool.

00:26:35.260 --> 00:26:38.580
And you get to write Python for your scripting, right, basically?

00:26:38.580 --> 00:26:39.160
Yeah.

00:26:39.160 --> 00:26:43.660
The project looks like, I'm not quite sure if this is recent or old.

00:26:43.660 --> 00:26:49.820
It says that it was intended for building documentation, but it does look like there's some examples on how to combine it.

00:26:49.960 --> 00:26:54.660
I don't see why you couldn't use it to run your tests and run all sorts of other stuff, too.

00:26:54.660 --> 00:26:59.080
Because it's just, it's got things like you can run Python code, but you can also run command line.

00:26:59.080 --> 00:27:02.640
It can launch a command line tools and all sorts of stuff.

00:27:02.640 --> 00:27:11.180
Yeah, if you can run stuff off the command line, then you could do get pre-commit hook type stuff or all kinds of automation.

00:27:11.180 --> 00:27:16.660
Or even cycle the version, increment the version numbers and all kinds of stuff you want to put together.

00:27:16.660 --> 00:27:17.520
Oh, yeah.

00:27:17.520 --> 00:27:19.800
That would be a good thing to put in there, version incrementing.

00:27:19.800 --> 00:27:24.920
And then also just like things like deploying, like check linting, that's a good thing.

00:27:24.920 --> 00:27:30.720
And then you can, so one of the neat things about make is different make targets can depend on each other.

00:27:30.720 --> 00:27:33.600
And this one has dependencies as well.

00:27:33.600 --> 00:27:40.480
You can have, like, for instance, build can depend on clean and it can have to run off and do a different target.

00:27:41.040 --> 00:27:43.520
And you can make a whole mess of stuff in there.

00:27:43.520 --> 00:27:44.760
Or you could keep it clean.

00:27:44.760 --> 00:27:50.680
But I like things like this to have, I mean, one of the reasons I'm not even, I don't mind make files.

00:27:50.680 --> 00:27:56.760
But people that are not from a Unix or don't come from a Unix background have no idea what to do with a make file.

00:27:56.760 --> 00:27:57.040
Yeah.

00:27:57.040 --> 00:27:59.040
It's good for the team to make it easy for them.

00:27:59.040 --> 00:27:59.220
Yeah.

00:27:59.220 --> 00:27:59.520
Yep.

00:27:59.600 --> 00:27:59.840
Indeed.

00:27:59.840 --> 00:28:00.200
All right.

00:28:00.200 --> 00:28:00.660
That's pretty cool.

00:28:00.660 --> 00:28:01.620
I like to use this.

00:28:01.620 --> 00:28:04.240
And I just got to think of a reason, a use case for it.

00:28:04.240 --> 00:28:05.180
And I will.

00:28:05.180 --> 00:28:05.860
It looks great, though.

00:28:05.860 --> 00:28:08.140
Well, that's all of our six items.

00:28:08.140 --> 00:28:11.220
Actually, I've been, like, totally swamped at work.

00:28:11.220 --> 00:28:13.560
I don't have a lot of extra things to share with people.

00:28:13.560 --> 00:28:14.860
Do you have anything extra for us?

00:28:14.860 --> 00:28:17.760
I have a mystery that we can discuss.

00:28:17.760 --> 00:28:18.400
You have a mystery?

00:28:18.400 --> 00:28:19.360
Yeah, apparently.

00:28:19.360 --> 00:28:25.000
You just talked about Python 3.9, and it's in beta, which means it's getting no new features.

00:28:25.000 --> 00:28:27.440
It's just getting tested and ironed out.

00:28:27.440 --> 00:28:30.720
And there was Python 3.9, beta 1.

00:28:30.720 --> 00:28:35.880
And then there, Hito announced, oh, hey, everybody, here's Python 3.9, 0.

00:28:35.880 --> 00:28:37.760
Beta 3 is out for immediate testing.

00:28:37.760 --> 00:28:41.100
And somebody disappeared beta 2.

00:28:41.100 --> 00:28:50.340
So the problem, apparently, with beta 2 was somehow the way that it looked up certificates was busted.

00:28:50.340 --> 00:28:55.200
So if you, like, installed it from source and just ran it, it would be fine.

00:28:55.200 --> 00:29:02.940
But if you installed it from the installer, all of a sudden, every web request that went to HTTPS or something along those lines would fail.

00:29:02.940 --> 00:29:08.920
So that's not good to break the networking subsystem of Python because a lot of things depend on that.

00:29:09.160 --> 00:29:12.880
And so they quickly ditched that one and fixed it and rolled out beta 3.

00:29:12.880 --> 00:29:13.240
Okay.

00:29:13.240 --> 00:29:22.460
And just about the time that this is released, so on June 29th, we'll have beta 4, which presumably will still make web requests successfully.

00:29:22.460 --> 00:29:23.780
It won't have to be disappeared.

00:29:23.780 --> 00:29:26.600
So anyway, just some Python 3.9 news.

00:29:26.600 --> 00:29:27.500
Beta 3 is out.

00:29:27.500 --> 00:29:30.160
Beta 4 will be out days after this comes out.

00:29:30.160 --> 00:29:32.340
Or actually, maybe even before.

00:29:32.340 --> 00:29:34.340
So there is no beta 2.

00:29:34.340 --> 00:29:36.700
Before will be after or before will be before?

00:29:37.980 --> 00:29:40.420
Before will be before, I think.

00:29:40.420 --> 00:29:41.300
But it might be after.

00:29:41.300 --> 00:29:41.780
I'm not sure.

00:29:41.780 --> 00:29:51.940
So I've got a joke for you I grabbed here off of Geek and Poke, which is like a cartoon strip.

00:29:51.940 --> 00:29:52.240
Okay.

00:29:52.240 --> 00:29:52.700
All right.

00:29:52.700 --> 00:29:54.880
So it's a mom and a son.

00:29:54.880 --> 00:29:57.420
And you have kids.

00:29:57.420 --> 00:29:58.980
I'm sure you know how this goes.

00:29:58.980 --> 00:29:59.960
How was your day?

00:29:59.960 --> 00:30:00.540
Eh.

00:30:00.540 --> 00:30:01.720
Good day?

00:30:01.720 --> 00:30:02.440
Yeah.

00:30:02.440 --> 00:30:03.740
What did you learn at school?

00:30:03.740 --> 00:30:04.840
Not much.

00:30:04.840 --> 00:30:10.840
You were there for eight hours, continuously getting instructed like you didn't learn more

00:30:10.840 --> 00:30:11.840
than like half a cent.

00:30:11.840 --> 00:30:12.340
Like, eh.

00:30:12.340 --> 00:30:12.760
Yeah.

00:30:12.760 --> 00:30:13.080
Right.

00:30:13.080 --> 00:30:18.640
So, but if this child happens to be a geek, there's another ploy in which you can employ,

00:30:18.640 --> 00:30:23.100
another technique you can employ to get them to tell you more about their day.

00:30:23.100 --> 00:30:24.480
So it goes like this.

00:30:24.480 --> 00:30:25.460
It says, hi, Darlene.

00:30:25.460 --> 00:30:26.180
How was your school day?

00:30:26.180 --> 00:30:28.760
And like sort of a blank stare.

00:30:28.760 --> 00:30:29.760
Hi, Darlene.

00:30:29.840 --> 00:30:30.740
How was your school day?

00:30:30.740 --> 00:30:31.860
Dash, dash verbose.

00:30:31.860 --> 00:30:33.320
Yeah.

00:30:33.320 --> 00:30:36.680
I totally wish I had verbose flags on my kids sometimes.

00:30:36.680 --> 00:30:37.440
Yeah.

00:30:37.440 --> 00:30:42.020
Also, sometimes a dash Q, like a quiet one would be good sometimes too.

00:30:42.020 --> 00:30:42.840
Yeah, exactly.

00:30:42.840 --> 00:30:44.660
The dash, dash quiet.

00:30:44.660 --> 00:30:50.040
If I got to pick one or the other, I'm going to go for the dash, dash quiet as an option.

00:30:50.040 --> 00:30:51.900
Yeah.

00:30:51.900 --> 00:30:53.340
Especially for young kids.

00:30:53.340 --> 00:30:53.820
Yeah.

00:30:53.820 --> 00:30:54.620
Exactly.

00:30:54.620 --> 00:30:55.360
Exactly.

00:30:55.360 --> 00:30:57.440
Daddy needs a little piece, dash, dash, quiet.

00:30:59.240 --> 00:31:00.500
Yeah, definitely.

00:31:00.500 --> 00:31:00.880
All right.

00:31:00.880 --> 00:31:02.940
Well, that's it for the episode, I guess.

00:31:02.940 --> 00:31:03.300
Yeah.

00:31:03.300 --> 00:31:04.320
Thanks a lot again.

00:31:04.320 --> 00:31:04.740
You bet.

00:31:04.740 --> 00:31:05.220
See you later.

00:31:05.220 --> 00:31:05.460
Bye.

00:31:05.460 --> 00:31:07.420
Thank you for listening to Python Bytes.

00:31:07.420 --> 00:31:09.880
Follow the show on Twitter at Python Bytes.

00:31:09.880 --> 00:31:12.900
That's Python Bytes as in B-Y-T-E-S.

00:31:12.900 --> 00:31:15.800
And get the full show notes at pythonbytes.fm.

00:31:15.800 --> 00:31:20.860
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:31:20.860 --> 00:31:22.900
We're always on the lookout for sharing something cool.

00:31:22.900 --> 00:31:24.080
This is Brian Okken.

00:31:24.080 --> 00:31:28.680
And on behalf of myself and Michael Kennedy, thank you for listening and sharing this podcast with your

00:31:28.680 --> 00:31:29.340
friends and colleagues.

