Learn Python with Talk Python's 270 hours of courses

#415: Future of Pydantic and FastAPI Transcript

Recorded on Sunday, Apr 23, 2023.

00:00 The release of Pydantic 2.0, its partial rewrite in Rust, and its refactoring into Pydantic Core and top-level Pydantic in Python is big news.

00:09 In fact, the alpha of Pydantic 2 was just released.

00:12 Of course, these changes will have potentially wide-ranging and positive effects on the libraries that are built upon Pydantic, such as FastAPI, Beanie, and others.

00:22 That's why this chance I had to catch up with Samuel Colvin from Pydantic and Sebastian Ramirez from FastAPI together, live from PyCon 2023, was really timely.

00:32 It's a super fun and wide-ranging interview I'm sure you'll enjoy.

00:36 Plus, there's a bit of an Easter egg in the middle.

00:38 This is Talk Python to Me, episode 415, recorded on location at PyCon in Salt Lake City on April 23rd, 2023.

00:47 Welcome to Talk Python to Me, a weekly podcast on Python.

01:02 This is your host, Michael Kennedy.

01:04 Follow me on Mastodon, where I'm @mkennedy, and follow the podcast using @talkpython, both on fosstodon.org.

01:12 Be careful with impersonating accounts on other instances.

01:14 There are many.

01:15 Keep up with the show and listen to over seven years of past episodes at talkpython.fm.

01:20 We've started streaming most of our episodes live on YouTube.

01:24 Subscribe to our YouTube channel over at talkpython.fm/youtube to get notified about upcoming shows and be part of that episode.

01:31 This episode is sponsored by Sentry.

01:34 Don't let those errors go unnoticed.

01:36 Use Sentry.

01:36 Get started today at talkpython.fm/sentry.

01:39 And it's brought to you by InfluxDB.

01:42 InfluxDB is a database purpose-built for handling time series data at a massive scale for real-time analytics.

01:49 Try it for free at talkpython.fm/InfluxDB.

01:53 Samuel, Sebastian, super nice to see you here at PyCon.

01:56 Welcome to the show.

01:57 Thank you very much for having us.

01:59 It's strange and exciting to do this live and to see you.

02:03 Yes, I know.

02:04 Normally it's remote over screen share over half the world or something like that.

02:09 Yeah, I've been able to talk with you directly.

02:11 Also with Samuel here.

02:12 It's super cool, super cool to hear you.

02:14 Yeah, thank you very much.

02:15 Yes, it's great to be here.

02:16 It's really fun being at PyCon and then doing this is like, yeah, even more fun.

02:19 I've done my talk, so I'm much more relaxed than I would have been if it had been this time yesterday.

02:23 I was just thinking, talking to someone else, like one of the best parts about giving a talk is that when it's over, you can really relax.

02:30 You know what I mean? You're like, okay, now I can enjoy the conference.

02:33 Absolutely, yeah.

02:34 And the parties, because you can't go too big on the parties if you've got to talk.

02:36 I feel like all the best ones were last night.

02:38 I'm afraid. We were at a pretty good one last night, weren't we?

02:41 Yeah.

02:41 Yeah.

02:42 But that was excellent.

02:43 All right, well, really good to have you both at the show.

02:46 I guess you hardly need introductions.

02:49 You both are doing such cool work.

02:51 We've had you on the show several times each.

02:53 So maybe just let's start with a catch up.

02:55 Like you both have lots of big news.

02:57 Don't want to necessarily spoil too much, but you know.

03:00 What have you been up to?

03:01 Yeah, so I raised money earlier this year.

03:03 Well, it was all sorted last year.

03:05 Money came in in January this year.

03:06 Started a company around Pydantic.

03:08 So I've been busy hiring.

03:10 Got a team of seven now.

03:12 One more going to join in June.

03:13 And yeah, currently we're working full-time on Pydantic version 2, getting that released.

03:18 And then after that, we're going to move on to the commercial plans, which I'm not talking about too much, mostly because they're up in the air a bit.

03:25 Also because if you start talking about them, you have to finish talking about them.

03:28 And then that's like, I'll just like take over the whole podcast.

03:30 So I'll say that, yeah, working on Pydantic V2 for now and then moving on soon.

03:35 Well, first from the whole community, congratulations.

03:36 You must be really thrilled.

03:38 Yeah, it's amazing.

03:39 It's very surreal, right?

03:41 Because I was going to say, did you see this coming?

03:43 No, I didn't.

03:44 My plan had been to start a different company once Pydantic V2 was done.

03:49 And then in November, Bogomil from Sequoia, who Sebastian knew, Sebastian recommended,

03:55 he chatted to me.

03:56 We had a call.

03:57 We had another call two weeks later.

03:58 And then he said, let's have the final meeting with like a few more partners to decide whether

04:02 to invest in two weeks time.

04:03 So I thought, oh, I should probably go and speak to some other VCs.

04:07 So Sebastian very kindly got me lots of intros.

04:08 My girlfriend also got me some intros.

04:10 I had like five meetings lined up.

04:12 And then the like floodgates opened and I got another like 20 or so VCs emailing me being

04:17 like, please, can I call?

04:17 Starting to hear about, oh, why are we not part of this?

04:20 Right.

04:21 And then I got COVID.

04:23 So I spent a week like locked in the bedroom upstairs doing VC calls.

04:27 Most of them with the like camera off feeling absolutely horrific.

04:29 And yeah, and then came back full circle back and had the big call with Sequoia and took

04:35 their money.

04:35 They've been amazing.

04:36 So it was Sequoia that invested.

04:37 Yeah.

04:37 Wow.

04:38 Awesome.

04:38 That's a big name to have behind you.

04:40 So Sequoia and Partec who are the smaller VC who are like French American and then Irregular

04:45 Expression, which is this really cool CTO network based kind of again, like New York and Paris.

04:51 And then a bunch of angels.

04:52 Yeah.

04:53 Last time we spoke, it was about Pydantic V2 and then all of this broke.

04:56 Yeah.

04:57 Yeah.

04:57 So I feel like I'm just back up to, as in problem was, although I was doing it to speed

05:02 up, that was there were then two months of basically doing meetings and doing legals.

05:06 So I think I've now got a team sufficiently that I'm like caught up to where I would have

05:09 been if I had just sat there and written code all along.

05:11 Yeah.

05:12 That's how it goes, right?

05:14 Yeah.

05:15 You got to put a little more sand in the gears to grow, I guess.

05:19 And Sebastian, how about you?

05:21 What do you, what have you been up to?

05:22 How have you been?

05:22 Oh, I've been good.

05:24 I've been good.

05:24 Yeah.

05:25 Very excited about like what they are doing at Pydantic is like the team they are assembling

05:29 is like just amazing.

05:30 And like, yeah, just like recently working a bunch in FastAPI and like Typer and actually

05:36 like in also some of the low level things of FastAPI and also not just FastAPI, but like

05:43 the things that go underneath.

05:44 Right now, like one of the things that I am pushing for is having documentation of the

05:50 API reference of the reference of the, each one of the parameters for what it is for each

05:54 one of the methods, like all that stuff.

05:56 Yeah.

05:56 And I want to do it in a, in a better way that is more maintainable and that I can test

06:01 the actual documentation for those parameters and consistency between like, there's a bunch

06:06 of things that I'm trying to do.

06:08 And like, it also goes to the low levels of like typing and interacting with the people

06:12 that is handling typing and like all the stuff that is super cool, super exciting.

06:16 But like, I think it can work and it can, it can make these things have like, you know,

06:21 like the API reference for the tools is something that a lot of people have been requesting and

06:26 like being able to have that in a way that is easy to maintain and that can work well and

06:31 that I can handle.

06:32 Like, I think that's, that's super exciting on that side.

06:34 And on the other side, of course, like the integration with Pydantic V2 is super exciting

06:38 now that they have like the first alpha available.

06:41 It is.

06:42 I mean, here you are going along working on FastAPI.

06:45 Everyone I talked to was just universally impressed with it.

06:49 You know, honestly, like I've never heard a bad thing about FastAPI and people are really

06:54 enjoying it.

06:54 And then here comes Samuel just changing the foundation, changing up Pydantic.

07:00 No, no, no.

07:02 I'm just teasing.

07:03 So how much work is that actually going to be to kind of make the change?

07:07 Is it kind of nothing or is it some work?

07:09 No, like there will be some working FastAPI.

07:11 The thing is for final users, it will be like almost transparent.

07:15 Right.

07:15 They will probably like, if they are doing like weird stuff, complex things like that touches

07:21 the corner cases or things like that, like they will probably have to update some things.

07:25 But for most of the use cases, it will be pretty much transparent for people.

07:29 And they will just like get like the, like, I don't know, like 10, 20x performance from

07:33 Pydantic v2.

07:33 And also like the...

07:35 I was going to say, just on the performance, I'm sorry to interrupt you.

07:37 One of the big things that we will be able to, you'll be able to drop from FastAPI is the,

07:42 I'm going to call it a hack, but it's not your fault.

07:44 It's my fault.

07:44 Of like, don't ask the type problem of serialization.

07:48 So I think that the like speed up on serialization in FastAPI could exceed, like, you know,

07:54 could be even bigger than that.

07:54 I don't know that yet, but I'm really hopeful for some like massive improvements because of

07:59 fixes in Pydantic that make FastAPI simpler and more elegant.

08:03 Yeah.

08:03 And since they're turning up the lights, we'll see how long we last here.

08:07 We'll stay as long as we can.

08:10 If you hear any noise in the background, that's because they're trying to tear down PyCon,

08:13 but we're going to...

08:14 They're tearing down PyCon around us, it seems.

08:16 We will not let it be torn out.

08:17 It will live on.

08:19 It's not because of Pydantic V2.

08:20 So, yeah, we may have to pause and move, but we'll find out.

08:24 Anyway, from a user for Pydantic, Samuel, if you haven't gone to like deeply gone into like

08:32 root object validation and all that kind of stuff, it's probably you won't even know, right?

08:36 So I think the hardest thing...

08:38 Yeah, you're right.

08:38 The vast majority of your code will either continue to work or we'll have a...

08:44 If you get run over by a forklift, it's going to really slow down the development of Pydantic,

08:49 by the way.

08:49 We're going to have a mod tool to change the name of methods.

08:55 So with luck, the vast majority of the changes should be automated.

09:00 I suspect that, and I was saying this earlier in the open space, the hardest thing is probably

09:05 going to be where your API subtly changes in its restrictions because of effectively edge

09:11 cases that Pydantic has fixed.

09:13 So for example, in Pydantic v1, we would coerce a int to a string.

09:17 If you passed a string to an int to a string field, we would coerce it.

09:21 I think that that's wrong and we shouldn't have done it.

09:23 And so now we don't.

09:24 But I was saying in the example, if for some reason you stored your IDs as strings and therefore

09:29 your API had the ID field as a string, but your user was just like pumping them into your

09:34 API as integers because that seemed to make sense to them, that's going to break.

09:38 And you probably haven't gotten a unit test that test that because you know your ID field

09:41 is a string.

09:42 So I feel sorry for those people.

09:44 And my biggest request would be if you're a user, try Pydantic v2 as soon as possible.

09:50 I know if you use it via FastAPI, you can't yet, but like all the other libraries.

09:54 But the sooner you can try it, the sooner you can tell us and the more easily we can fix things.

09:59 And we are prepared to add compatibility shims.

10:02 Okay.

10:03 Well, there, I mean, in Python, we have sort of a from futures import.

10:06 Well, there'd be from a, from history import type of like reverse thing.

10:10 Just slow that down or is it going to be a deprecation or is it just...

10:14 So we're doing deprecation warnings everywhere we can or deprecation errors saying this has

10:19 gone away.

10:19 You probably want to replace it with this thing.

10:20 We're working really hard on that.

10:22 We haven't got a like from future import or a compact layer yet for actual like validation

10:28 logic.

10:29 But if we have to, we will.

10:30 Yeah.

10:31 Okay.

10:31 You'll see, right?

10:32 See how much screaming...

10:34 What we didn't want to do was try and guess at what the problems were and build a compatibility

10:38 layer that people didn't need.

10:39 Yeah, of course.

10:40 So that's why we're doing it this way.

10:41 Yeah.

10:42 That makes a lot of sense.

10:43 You want to go as minimal backwards trying to fill those gaps as possible, right?

10:48 And if I'm brutal about it, if insert name of big bank that use Pydantic locks and never

10:53 engage with the open source community, get stung by this, they never paid me a penny and they've

10:57 never engaged, then like, I'm sorry for them, but I'm not as sorry as I would be if they

11:02 had like come and reported an issue and tried to like help along the way.

11:05 Yeah.

11:06 Yeah.

11:06 Like, can we work with you to just like smooth this over?

11:08 And, you know, worst case, can it be, you know, equal, equal, Pydantic, equal, equal,

11:13 1.10?

11:14 I think we'll carry on supporting critical security fixes for a year.

11:18 Okay.

11:19 So there's something of an LTS type of thing you're thinking?

11:21 Yeah.

11:21 For a while.

11:22 We have to, right?

11:23 For a while.

11:24 And yeah, we'll see.

11:25 Look at the download numbers and play it by ear.

11:27 Yeah.

11:27 All right.

11:28 Cool.

11:28 While we're talking about compatibility, if people are like doing a lot of the overriding

11:33 functions and stuff in their Pydantic models, like what do they, what should they expect?

11:37 Too many changes are pretty similar.

11:38 One of the biggest changes is that the init method of a model is now no longer called when

11:45 you're, unless you literally call init.

11:47 So if you call model validate, or if your model is nested inside another model, init is no longer

11:53 called.

11:53 The solution for that is to use a wrap validator or a model validator, but that's going to

11:58 be one of the pain points for people.

12:00 But there's just, it turns out with the Rust API, it's literally impossible without a massive

12:04 performance hit to do that.

12:07 This portion of Talk Python to Me is brought to you by Sentry.

12:10 You know that Sentry captures the errors that would otherwise go unnoticed.

12:14 Of course, they have incredible support for basically any Python framework.

12:18 They have direct integrations with Flask, Django, FastAPI, and even things like AWS Lambda and

12:25 Celery.

12:26 But did you know they also have native integrations with mobile app frameworks?

12:30 Whether you're building an Android or iOS app, or both, you can gain complete visibility into

12:36 your application's correctness both on the mobile side and server side.

12:40 We just completely rewrote Talk Python's mobile apps for taking our courses, and we massively

12:46 benefited from having Sentry integration right from the start.

12:50 We used Flutter for our native mobile framework, and with Sentry, it was literally just two

12:55 lines of code to start capturing errors as soon as they happen.

12:58 Of course, we don't love errors, but we do love making our users happy.

13:02 Solving problems as soon as possible with Sentry on the mobile Flutter code and the Python server

13:08 side code together made understanding error reports a breeze.

13:12 So whether you're building Python server side apps or mobile apps or both, give Sentry a try

13:19 to get a complete view of your app's correctness.

13:22 Thank you to Sentry for sponsoring the show and helping us ship more reliable mobile apps

13:27 to all of you.

13:27 Do you already have a roadmap?

13:30 Have you already tried the alpha on FastAPI?

13:33 Like, what's the story for you guys?

13:35 So, like...

13:36 Pedantic-wise.

13:37 Yeah, yeah, yeah.

13:37 So, like, we have actually been interacting a lot, like, with what are the changes that are

13:42 needed?

13:42 Like, what is it going to be?

13:43 And like, as someone was saying, like, I have a lot of code that is quite hacky.

13:48 I was actually surprised it didn't break much.

13:51 It just, like, really worked.

13:52 And like, it's for this particular use case where you can have, like, they are so loud.

13:58 They really want to tear us down.

13:59 I know.

14:00 We might have to be weird to say it.

14:02 But let's go ahead.

14:02 Let's finish this up.

14:03 Yeah.

14:03 So, like, validation error.

14:08 Can it concentrate?

14:09 So, imagine this use case where you have user model.

14:13 And then this, you want to return this user model.

14:16 But then you have an authenticated user model, as you were showing in the talk, in the PyCon talk.

14:22 And then this authenticated user model has a field that is a password.

14:26 If you return that use, the authenticated user directly, FastAPI does a lot of tricks to make

14:33 sure that what you receive in the client side is the actual user without the password.

14:38 That is the thing that you declared that you were going to return.

14:41 But by default, if you don't do it through FastAPI, but you do it with just plain Pydantic,

14:46 it will just check, like, hey, is this an instance of the other?

14:48 And then it will include the field.

14:50 Because, like, you know, because in thinking about types, it makes sense.

14:54 Like, oh, this is a subclass of that.

14:56 So, it makes sense that it's valid.

14:58 But when you think about data in an API, it doesn't make sense that it will include more

15:02 data than what it should.

15:03 Right, right, right.

15:04 Because you don't want to either have a mass injection attack on the inbound data or an

15:10 over-exposure on the way out, right?

15:12 You know, give away the password from users.

15:14 Is that bad?

15:15 I think it's pretty bad.

15:16 Okay, yeah, all right.

15:18 Like, you know, for example, like, some months ago or years or something, like, I remember

15:23 that Kaggle, the Kaggle API was returning, like, some of the hashes of the experiments.

15:28 So, like, you know, it's like, it's a mistake and a bit, but it's sad that it will end up

15:33 just, like, filtering more data than what it should be returning.

15:36 And it's something that can happen very easily.

15:38 It can happen very easily to FastAPI applications if people don't specify what is the response

15:43 model, the thing that they want to return.

15:45 And they just return a bunch of data directly.

15:47 So FastAPI does a lot of things to make sure that when you declare a response model that

15:52 should filter this data, the data is filtered.

15:55 But that's a lot of code in FastAPI to make it compatible.

15:58 With the new Pydantic V2, that's going to be pretty much transparent.

16:02 So that's amazing.

16:03 That is amazing.

16:04 Yeah.

16:04 There's going to be, like, a bunch of things that require, like, some refactoring and

16:08 also making sure that the Pydantic V1 and V2 are compatible at the same time in some way

16:14 so that people can have, like, a migration path.

16:16 But yeah, like, we have been making sure that, like, all the things that need to be changed

16:21 or that need to be updated or, like, all the things that need to be exposed from the Pydantic

16:25 side are actually available.

16:26 Yeah, it's awesome that you guys are working so closely together on this.

16:29 I mean, it's going to make it.

16:30 Yeah, absolutely.

16:31 So in my mind, these two projects are pretty closely tied.

16:34 I know that they're not, but that's a big use case.

16:36 Yeah, I think that's true.

16:37 And we know that FastAPI is by far our biggest dependent.

16:41 But also Django Ninja, which is, I think, now second or third, maybe third after SQL model

16:46 by Starz, is, like, Vitaly, who maintains that, has been engaging a lot with us on V2.

16:51 So yeah, lots of other projects are interested in it.

16:54 And I think, yeah, lots of people will be able to remove messy code because of that problem.

16:57 Because, yeah, like, the invariance of the response interface problem.

17:01 That's fantastic.

17:02 Coming back to your previous question about...

17:04 Before we go to that, I think we should probably find it.

17:06 What do you think?

17:07 Yeah, I think you might be right.

17:08 Not even necessarily, I think the audio may be okay, but just for a concentration, it's

17:11 very loud with the trucks around us.

17:13 I feel like I'm on the deck of that aircraft carrier, so I throw things off the side.

17:16 Yeah, okay, let's pause this for a moment.

17:17 We'll be back.

17:18 Hold on.

17:18 So we have survived the disassembly.

17:22 We have returned to continue.

17:24 We were talking about the integration of FastAPI and Pydantic, and that was really cool.

17:29 I think something I'd like to kind of move to real quick is this big announcement, alpha

17:34 of version two.

17:35 Samuel, last time you were on the show, we spoke about the plan for version two, and

17:40 now you're released in an alpha stage.

17:41 Tell people where we are with this.

17:43 Yeah, so we're, yeah, we've had two alphas, maybe three alphas now out.

17:47 We're basically pretty close to a feature freeze, and the plan is to release the package, release

17:54 a beta, and effectively, we hope that we can then release the full release, say two weeks

17:58 after that.

17:59 But there'll be bugs, and we'll fix them, and we'll have more betas.

18:01 But effectively, once we get to beta, the plan is that active development is stopping

18:06 bar fixing bugs.

18:07 Now it's performance and bugs, right?

18:09 Yeah.

18:10 And obviously, one of the big things will be once that's out, there'll be a lot more work

18:13 on, say, FastAPI, Django Ninja, et cetera, et cetera.

18:16 And that might come back with, we really need this thing.

18:18 Either this is broken, or we really need that to make it, you know, to reduce the overhead

18:23 of upgrading.

18:24 One of the things I did for Pydantic 1.10, which was super valuable in beta, was to go

18:30 through packages that use Pydantic, initially sorting by star, but then looking at what they

18:35 actually do, and trying to upgrade them.

18:37 And that, like, found me a bunch of bugs in either libraries or in Pydantic.

18:41 So we're not promising we're going to go and upgrade the whole of GitHub to Pydantic V2,

18:46 but we'll do a bit of that mostly to try and find bugs.

18:50 One of the things that would be really useful is if anyone has an application that uses Pydantic,

18:54 preferably without FastAPI or another library, that they would like help upgrading, we would

18:59 love to come and help.

19:00 And it might be a really powerful way of us, again, seeing the real pain points and identifying

19:05 bugs before we get to V2.

19:07 Yeah.

19:07 And I guess another thing to mention that is a real headline, and I also want to get your

19:12 thoughts on this, Sebastian, is the performance numbers, right?

19:15 I mean, you put out some pretty impressive performance numbers, and Sebastian gets to

19:19 piggyback on that, right?

19:20 Yeah.

19:20 I mean, yeah, I'm really proud of it, right?

19:23 Yeah, you should be.

19:24 I think to go in a change of release, in a bump of release, to be in the ballpark of 22

19:30 times faster, not 22%, but 22 times faster, I don't know of another package that's made

19:35 an upgrade of that kind of order of magnitude.

19:37 What's crazy is it's not numerical computing, right?

19:41 It's general purpose.

19:42 If you look at the example I gave in my talk earlier, it's a completely standard Pynantic

19:46 model with four fields.

19:47 And that's where we're seeing that kind of like 22 times speed up.

19:50 So I think it's going to be massive.

19:51 I have my own cynicism about people who hype about performance as being the most important

19:57 thing.

19:57 I don't think most applications, it's actually the thing that matters most.

20:01 But I think it matters.

20:02 A, it matters to everyone, and everyone wants it to go in the same direction.

20:05 And two, it matters to the whole world and to the whole community that we effectively reduce

20:10 the energy that we consume, like doing compute, basically.

20:14 Right.

20:14 That's absolutely true.

20:15 And also, even if people don't actually need it, there's a group of people who are like,

20:20 well, I'm going to leave for Go because it's not fast enough.

20:22 I can't do enough concurrency or whatever.

20:24 And if they don't have that feeling, even if they didn't actually need that percentage

20:28 increase, that's still really good for the Python community.

20:30 Even me, I was saying I had a gigabyte of data from web analytics that I needed to load

20:36 into a Polar's data frame.

20:38 And for that, I needed to A, extract some attributes from nested fields and B, parse dates and things

20:43 like that.

20:44 And I used Pynantic V2.

20:45 And it was vastly faster with V2.

20:49 It went from like toodling, what's the word I'm looking for?

20:51 Twiddling your thumbs to like it happens virtually instantly, right?

20:56 And that's fantastic.

20:57 And that'll be even more true when you have an order of magnitude or two orders of magnitude

21:01 more data.

21:02 Yeah, for sure.

21:03 Sebastian, how about you?

21:04 What's the knock-on effect for FastAPI?

21:06 So I think one of the coolest things is that people won't have to change the code to get

21:11 that performance benefit.

21:12 It's just going to be like a bump suddenly.

21:13 And because of the new ways that Pynantic can handle the data, we're going to be able

21:19 to, there's something that needs to be done in FastAPI, but we're going to

21:21 be able to let the parsing of the data, let Pynantic handle that in the Rust site.

21:28 So Pynantic will be able to just read the JSON bytes instead of reading them in the Python

21:34 site and let Pynantic do that.

21:35 And then Pynantic give the models back to the rest of the code of FastAPI.

21:39 That alone will boost performance a lot.

21:41 But the fact that it's being done in Rust, in the Rust site, it's just going to be amazing.

21:45 Yeah.

21:46 Like one of the other things that I want to do that is on the plans is to let users

21:50 define how they want to serialize data and not have like, this is just like by default,

21:55 it's just like Pynantic models and like it converts automatically to JSON.

21:59 But I want to allow users to decide how to serialize the objects and the data so that

22:03 they can just...

22:04 Like data classes or something like that?

22:06 Yeah.

22:06 For example, they can say like, oh, I don't want to serialize with the standard JSON serializer.

22:10 I want to serialize with our JSON, which is like the...

22:13 I see.

22:14 Rust based implementation to serialize JSON.

22:17 Or they can say like, I want Pynantic to be the one that serializes this because I know

22:21 that this is just a model that can handle that.

22:22 They can also like...

22:23 And this is one of the things that I think is super cool.

22:25 They can also create...

22:27 They will be able to create a way to say, I want to serialize this response to XML or something

22:33 like that or to YAML and to let Pynantic handle the validation, but then like do the serialization

22:38 in a way that they can customize the whole thing without having to do it directly in the code.

22:43 Maybe even some of these crazy stream buffer type of protocols.

22:47 You know, like, yeah, like protocol buffers with GRPC or like even message pack or like,

22:51 you know, like a bunch of these things that there's no obvious way and there's no native

22:56 way to have support for that, for reading the data and for exporting the data.

23:00 And like, that's one of the things that I have like implants.

23:02 I like, I'm probably saying too much and then I'm going to account all the pieces of the code.

23:06 And now they're like, you know what?

23:07 You promised this.

23:08 You did promise it.

23:09 Well.

23:10 Can I just come back on serialization for a minute?

23:12 Yeah, please.

23:12 Yeah, please.

23:13 Yeah.

23:13 So what we've, I've worked from October, quite like putting to one side, the whole funding

23:19 round in the middle of it was working solidly on serialization.

23:21 So we have, there's almost as much code in Pynantic core now for serialization as there

23:26 is for validation.

23:26 Yeah.

23:27 Well, we can serialize directly to, to Jason using the same underlying library that, or Jason

23:32 uses using Serdi, but one, and also we can, you can customize how your serialization

23:38 goes on a per field basis rather than on a per type basis, which is like incredibly powerful.

23:42 But we also allow you to effectively serialize to Python.

23:46 So not just what used to be the dict method, but basically do JSONable Python.

23:51 So you effectively set the mode when serializing to Python, to Jason, and you will only get the

23:55 like, whatever it is, seven primitive Jason types in Python, which is super valuable if you

24:00 want your output to be XML, because then you know your XML encoder only needs to bother,

24:04 needs to take in dictionaries, list, ints, floats, none, bool.

24:08 Yeah.

24:08 Rather than whatever complex data you have.

24:11 So there's an, or I, yeah, I'm like super proud of lots of the advantages of serialization.

24:15 My 45 minute talk earlier, I was able to touch about half of the, the big new features, which

24:20 kind of talks about quite how much has changed.

24:23 Yeah.

24:23 That's really exciting.

24:24 I think we definitely, I was saying earlier, if I had known how long it was going to take,

24:28 I would never have set out on this journey.

24:30 So the best thing about it is I didn't, I didn't think about how long it was going to

24:33 take because we didn't try and do a bit more.

24:36 We tried to do everything or I tried to do everything.

24:38 And that's how it's disadvantaged.

24:40 It's taken longer than we had hoped, but.

24:41 But here you are.

24:42 You're pretty much here.

24:43 That's really good.

24:43 That's really good.

24:44 And so when you think about performance, right, obviously the 22 times faster is awesome.

24:49 The FastAPI speedup is awesome.

24:51 But if you do something like SQL model and FastAPI or Beanie and FastAPI, you're getting

24:58 on both ends, you're getting that Beanie or the Pydantic benefits with the Beanie integration

25:03 and the fast.

25:04 So you, you're kind of putting Pydantic in both those layers.

25:08 And so those speedups are like twice as good or something like that.

25:11 Yeah.

25:12 Right.

25:12 I think you, well, they're probably, yeah, they're like, they're the same relatively,

25:16 but more in absolute terms.

25:17 Yeah.

25:18 Yeah.

25:18 Yeah, absolutely.

25:19 So, yeah, I think it's, you know, the fact that it's a lot of people, so many things have been built upon Pydantic means you've just sped up a bunch of projects

25:26 without them doing too much.

25:28 Yeah.

25:29 We get the, like the win.

25:30 It's like CPython itself getting faster, helps everyone.

25:32 This is like the next layer down, but we, you know, as a dependency of lots of packages,

25:36 we get to speed up lots of the community with one package, like one person devoting a year

25:41 to it.

25:41 Does this surprise you to see all these projects coming out?

25:44 Like here's another project based on Pydantic plus, you know, name your other thing that

25:48 it's been crazy, particularly in the like machine learning space where, you know, Langchain, who are one of the like big names right now in these like big language

25:56 models, large language models, all based on Pydantic, right?

25:59 Yeah.

25:59 You were saying, I think on Twitter, that OpenAPI use a bunch of FastAPI, right?

26:04 OpenAI?

26:04 Sorry.

26:05 Yeah.

26:06 OpenAI, not OpenAPI.

26:08 Marvin from, I think from Prefect is built on Pydantic again.

26:11 So like the wave of machine learning stuff seems to have leveraged Pydantic a whole lot.

26:16 Docker array being another, another big example.

26:18 Some for Elastic and some other things as well.

26:24 This portion of Talk Python to me is brought to you by Influx Data, the makers of Influx

26:28 DB.

26:28 Influx DB is a database purpose built for handling time series data at a massive scale for real

26:35 time analytics.

26:36 Developers can ingest, store, and analyze all types of time series data, metrics, events,

26:42 and traces in a single platform.

26:44 So dear listener, let me ask you a question.

26:46 How would boundless cardinality and lightning fast SQL queries impact the way that you develop

26:51 real-time applications?

26:52 Influx DB processes large time series data sets and provides low latency SQL queries, making

26:58 it the go-to choice for developers building real-time applications and seeking crucial insights.

27:04 For developer efficiency, Influx DB helps you create IoT analytics and cloud applications

27:10 using timestamped data rapidly and at scale.

27:13 It's designed to ingest billions of data points in real-time with unlimited cardinality.

27:18 Influx DB streamlines building once and deploying across various products and environments from

27:24 the edge, on-premise, and to the cloud.

27:27 Try it for free at talkpython.fm/influxDB.

27:31 The link is in your podcast player show notes.

27:33 Thanks to Influx Data for supporting the show.

27:36 I'm sure one of the big things you're thinking going forward with FastAPI is like how do you

27:42 guys work together and make this a seamless change?

27:44 What else you got?

27:45 What else are you working on?

27:46 What else do you see in the future?

27:48 I have a bunch of things.

27:49 Are they secret or can you tell us?

27:51 No, no, no.

27:52 I can't tell.

27:52 Most of it I can't tell.

27:54 I just feel the accountability.

27:57 But I can't tell.

27:59 So like I have a bunch of projects and like the funny thing is that in some way it's kind

28:04 of a dependency graph of things that I should work on.

28:07 So for example, I have this project generator for FastAPI to generate a project with a SQL

28:12 database.

28:12 I haven't updated it in a long time and it uses SQLAlchemy.

28:16 I built SQL model for that project to use it there.

28:19 But I haven't updated it there because first I want to upgrade more things in SQL model.

28:23 I want to finish the documentation, finish the story about migration.

28:26 But then for the story about migration, I need typer for SQL model.

28:30 So I need to update things in typer.

28:32 And then for typer, I want to add support for annotated, which is actually one of the big

28:36 things.

28:36 One of the recent big things in FastAPI is that now there's support for annotated.

28:41 So annotated is this feature from Python.

28:44 It's like standard Python typings.

28:46 You import from typing, from typings import annotated, and then you can use that to meet

28:52 information to the types that you define for parameters.

28:54 Like what?

28:55 I haven't used this.

28:56 I love typing.

28:56 I use it all the time.

28:57 And here I'm learning more about typing.

28:59 The thing is it exists there in the standard library, but it doesn't have like a canonical

29:04 use in Python itself.

29:05 It's there mainly for FastAPI and Pydantic to use it.

29:09 You know, like it's just that like I haven't, I hadn't pushed for that before.

29:13 But the thing is you import from typings, import annotated, and then you create a function that

29:19 takes like a username.

29:20 And then this function will normally be of type string.

29:23 So it will be like the parameter of the function will be username colon str.

29:28 Now you can say username colon annotated, and then open square brackets as if it was like

29:33 a list or like a dict or something.

29:35 Open square brackets.

29:36 And then the first thing that you put there, that's the actual type.

29:38 So you will say annotated string.

29:40 Ah, okay.

29:41 And then you can pass additional metadata afterwards.

29:43 And the additional metadata is the thing that you will use to tell FastAPI this will be extracted

29:48 from the query parameters or from the cookies or from headers.

29:51 Before, and like up to recently in FastAPI, the only way to do that was using the default value of the parameter.

29:57 Right.

29:57 You would set the default to like a depends or...

29:59 Yeah, to depends or equals a cookie or equals header or something like that.

30:04 And then FastAPI can take the information from that to give you the data in your function.

30:08 But the thing is, if you call that function manually somewhere else, the editor and Python

30:13 won't complain that you are not passing some parameter that is required.

30:16 And then you're going to end up with some strange value internally that is just for FastAPI.

30:20 Right.

30:21 Or the type checker complains, you're not passing a depends.

30:24 Like, no, I'm passing a string.

30:25 That's what it's supposed to be.

30:26 But that's...

30:26 Yeah, exactly.

30:27 Some weird thing like that.

30:28 Exactly.

30:28 Yeah, okay.

30:29 So for those cases, having annotated, like all the type is exactly what it is.

30:32 And if it has a default value, it's the actual default value instead of like some strange

30:37 internal concept in FastAPI.

30:40 And having support for that allows having like much better support for typings, for editors,

30:45 autocompletion, inline errors, all these things.

30:47 It's reusing the same functions in other places.

30:49 And it will also, having support for that in typer, will allow users to have the same

30:54 function being used for FastAPI and typer, having the custom metadata necessary for each

31:01 one of the parameters for FastAPI and for typer and things like that.

31:04 So it's something that is super powerful and super interesting.

31:06 Yeah.

31:07 I'm going to come in on annotated because I'm excited about it too.

31:09 So Pydantic V2, we use annotated for all of our custom types.

31:13 So for example, positive int type is just annotated of int.

31:17 And then we use the annotated types package, which is some reusable metadata for annotated.

31:22 So we would use like positive int is annotated of int and then greater than zero.

31:28 And what's even cooler is that will be used by Pydantic, of course.

31:33 Hypothesis is going to get support for that really soon.

31:36 So it will only pass a positive value in if it sees greater than zero there.

31:40 And then typer, I guess, could like, even if it's still based on click, it can go and take

31:44 that greater than and infer it as, you know, must be greater than zero.

31:47 So I think it was one of the things that typing guys, when they first created annotated, hoped

31:52 was going to build a rich network of libraries that interchanged metadata.

31:56 It's taken a bit longer than they expected, but we're getting there.

31:59 Here the two of you are kind of doing that a little bit, right?

32:02 That's cool.

32:02 That's really cool.

32:03 One of the areas where I feel like typing is a little janky is on ORMs and ODMs.

32:08 When you define a class, you say, for example, it's like a SQLAlchemy column, or it's a beanie

32:15 column or something like that.

32:17 And the type is it's a string column, but really it's a string.

32:21 It's not a string column.

32:22 And so there's this weirdness of using types to kind of drive behavior.

32:28 That's a perfect case for using annotated.

32:31 That's what I was thinking.

32:31 Yeah.

32:31 What it doesn't do is the other case where there is a context where you'd want to get the

32:36 column object of some sort rather than the integer in a row.

32:40 So it does mean two different things, the kind of dot objects in the Django context.

32:44 But yeah, absolutely.

32:45 Yeah.

32:46 It's there precisely to solve this kind of problem.

32:48 And it's also because like currently, as far as I remember, there's no way.

32:52 So the thing is that this is all based on something called descriptors.

32:55 And it's that when you call like, I don't know, class user dot name, it's actually the

33:01 attribute in the class.

33:02 But when you create an instance of that user and then say user dot name, that is the attribute

33:07 on the actual instance.

33:08 And the way that these ODMs or ORMs or these things work is that they have a special way

33:14 to say like when someone calls the actual class, this is a different thing than when someone

33:18 calls an instance attribute.

33:20 Right.

33:20 And there's sort of two behaviors.

33:22 Yeah.

33:22 Yeah.

33:23 And like it's super powerful.

33:24 That's how SQLAlchemy works.

33:26 And it's super powerful because then like all the queries and all the stuff is actually

33:29 like consistent with how Python works.

33:32 And you can say like greater than or equals to using Python syntax, which is great.

33:36 But then currently, as far as I know, there's no way to define that with type annotations

33:41 in a standard way.

33:42 I think it's something that will probably be improvable.

33:45 But I think there's currently no way.

33:46 There will probably be a way at some point.

33:47 But to be able to say like, hey, this SQLAlchemy column is a column when it's accessed

33:53 at the class level.

33:54 But this is going to be a string when it's accessed at the instance level.

33:57 A scope level in the annotated, you know, the class is this and this.

34:01 And it's the instance is that and that.

34:03 Yeah.

34:03 That's really interesting.

34:04 While we're talking types, and I know you both are really big fans because it's such a

34:09 central part, both your libraries.

34:11 What do you want to see coming?

34:13 It feels like this is an area of Python changing fast.

34:15 But is there something like they just if they could just and I have another question on types

34:19 by the way after that.

34:20 If I remember.

34:20 So I gave a talk at the typing summit asking for certain things.

34:23 So now we're going to test my can I remember PEP numbers challenge, which I'm going to fail

34:28 in.

34:28 But pep472 is that keyword args to so one option would be to allow keyword arguments to get

34:36 item, which would make annotated even more powerful because then you could use keyword arguments

34:40 to describe the meaning of your metadata, rather than having to have these kind of identifier

34:44 types like greater than one of the big things that I hope we're going to persuade.

34:49 So I think one of the things that's happened recently is that everyone gets that runtime

34:52 use of type hints is a legitimate thing.

34:54 They might not want to do it themselves, but they get that like, it's a legitimate thing

34:58 to do.

34:58 How much pushback was there when you first came out by Tandic there?

35:01 I think we were like the black sheep of Python.

35:03 I was a black sheep of Python.

35:04 This is supposed to have no meaning.

35:05 What are you doing?

35:06 You're doing it wrong.

35:07 And I think nowadays that's changed and everyone gets it's a real thing.

35:10 But so for example, the hash of a union is independent of the order of the members of the union.

35:16 That makes sense in the context of static typing, where the union of int float is exactly the

35:21 same as a union of float int.

35:23 It turns out in static typing, particularly when you're doing coercion, there are some cases

35:27 where that is not the case.

35:28 And so it's really difficult right now that effectively when you unions are fine on their

35:34 own.

35:34 But if you have a union, say within a string, the capital string square brackets, it will

35:40 the order will be match the order that the first time you call that not what you actually call

35:45 unless you use lowercase string when it is the right order, except there's a PR open right

35:49 now to break it on string to string as well.

35:53 So anyway, we are on lowercase lists as well.

35:58 Anyway, so things like that, where I do think that we'll see what happens on that particular

36:02 case.

36:02 But I feel like the voice of people doing runtime use of types, we're not the only people, are

36:07 being heard better.

36:08 And yeah, I think things are going to continue to improve.

36:11 Yeah, there was a PEP that proposed an optimization for typing that kind of broke the runtime behaviors

36:17 of it a little bit for both of y'all.

36:18 Yeah, it did in some edge cases.

36:20 And that's going to be fixed soon by the successor pep.

36:24 Absolutely.

36:24 So that's really good.

36:26 Generic alias is another thing that kills us internally in Pydantic.

36:30 I won't go into all of the details of it.

36:31 But yeah, the high-level takeaway is that the typing community seemed happy with the idea

36:38 that they might make a change to typing to make it easier for us.

36:41 And I think that's also for the Pydantic team to engage better.

36:44 And instead of spending ages...

36:46 Problem is, right?

36:46 You have a problem.

36:47 You see a solution in typing.

36:49 You submit the PR.

36:50 Even if it gets accepted in a week, which it won't, you wait five years before we can

36:54 remove the code that deals with the other case.

36:56 So it's very tempting not to engage with typing, but just go and write the work around where

37:00 we should be better Python citizens and go and submit the PR to see Python to try and fix

37:04 it properly.

37:05 Yeah.

37:05 What's your wish list for typing?

37:07 So, well, the first thing is like this thing that I have been trying to work on and like

37:11 trying to do to have like better ways to do documentation of the APIs that's also related

37:15 to typing and to the annotations.

37:17 Like, let's see if I can pull it off.

37:19 The other thing is like, it's actually not that necessarily that related to the things

37:23 that we have been talking about, but it's quite relevant for the data science and machine

37:28 learning community.

37:28 That is that there are many, many APIs for many libraries that decorate in some way, some

37:35 function.

37:36 And then the function is expected to give some types of values to the body of the function

37:41 internally, but to be able to receive different types of values.

37:45 That sounds a bit abstract, but like that's the core idea that is like replicated across

37:51 several libraries.

37:52 And this will apply to, for example, to Ray, the distributed machine learning or computing

37:56 system, to Dask, to, I think, Dagster also uses something like that.

38:00 Monad, this system for deploying workloads and machine learning and things like that, also uses

38:06 these types of ideas.

38:07 So there are many of these libraries that like the way that they are designed is that you create

38:12 some function and then you are going to tell something to call this function.

38:16 And then in the function, you say, I want to expect this value.

38:19 And instead of you calling all the functions that will generate that value, you tell it like,

38:23 hey, distributed system, blah, blah, blah.

38:25 Give me this value.

38:26 Execute this for me.

38:27 But that means that you will have or no type annotations or invalid type annotations or red

38:34 squiggly lines in some places or no auto completion or auto completion for the wrong things, just

38:39 because there's currently no way to define this specific thing of saying, hey, this function after

38:45 being decorated is going to be able to receive a different type.

38:49 Oh, yeah.

38:50 Than what it's going to give to internal.

38:52 So I think that's something that, and it's probably quite challenging and like a big thing to tackle,

38:57 but it's something that is replicated across several libraries, in particular for these things

39:01 that do distributed processing of data.

39:04 I think that's something that will be great to improve.

39:07 Does paramspec fix some of that?

39:10 It's very close, but the paramspec only does it for being able to sort of copy the params

39:18 that come from one function to another.

39:20 And actually, I use all that for, for example, for async and for other things to be able to

39:24 get like auto completion for the decorated function or for the generated function or things like

39:30 that.

39:30 And it will probably like the change will probably be somewhere around paramspec to

39:35 be able to say like, not just the paramspec, but like this function will not only have the

39:40 paramspec, but will receive a modification like this of the parameters.

39:45 Almost making paramspec generic.

39:50 All right.

39:50 One more typing question.

39:52 Do you all think typing is going too far with like the generic stuff?

39:56 And is it going too much like C++ and C Sharp and Java?

39:59 Or is it, is it still, still good?

40:02 I think it's, I think the way Python is growing is super interesting because like,

40:07 we all have to agree that Python 3.12 is not the same Python 2.7.

40:12 Yeah.

40:12 It's quite different.

40:13 And I think it's a different in a good way.

40:15 The users are different and the light, the, the focus of the runtime is different.

40:20 And like the things that we can do with types now, and like the fact that in Python, we can

40:26 access these types at runtime, which means like, I don't know, I was always confused with the

40:31 term runtime.

40:32 It's like, what does that mean?

40:33 And it's like, when you execute Python, the same Python code can inspect and like see what

40:38 are those types.

40:39 That's what FastAPI and Pydantic do.

40:40 It's just like seeing like, what are those types?

40:42 We can do that in Python.

40:43 You cannot do that in things like TypeScript, or you cannot do it in Java.

40:48 You cannot do it in many other languages.

40:49 You get access to this typing information to be able to do additional things with that, like

40:53 validation, data serialization, documentation, all that stuff.

40:56 So I think that's, to start, that's super powerful in Python.

41:00 The language in Python for typings is not as powerful as, for example, TypeScript.

41:06 That is just like so much stuff that you can do with that.

41:09 Nevertheless, I feel that in Python is just like, is growing and is growing organically.

41:14 And like, we have growing pains, you know?

41:16 Like, there are some things that is like, oh, this little thing here is slightly incorrectly

41:21 named.

41:22 Yeah.

41:23 But like, now there's a better way to do that in Python 3.10.

41:26 So we don't care much about that slightly incorrect name.

41:29 Things like that.

41:30 Yeah, I feel like there's some tensions of people who are in the mypy side, and they want

41:34 perfect validation of, I want to prove my code hangs together like a static compiler.

41:39 And folks like you all who are like, we want to leverage typing to make it behave in interesting

41:46 ways.

41:46 And maybe that behavior expression doesn't exactly match what it looks statically like, but

41:51 it is.

41:52 Everybody wants it, but it might trip up mypy.

41:55 And I feel like there's this tension between those two things.

41:57 That's kind of what I was thinking when I asked that question.

41:59 I guess there's a little bit of that, but at the same time, there's, is much less than

42:04 you could imagine.

42:05 There are so many people that are so close to, you know, core mypy and these things that are

42:11 actually very excited about the things that we are doing.

42:13 So they're like, you know, like the, it's actually quite friendly, all the communication.

42:17 It's just that there is some people that just don't really care about runtime types and

42:22 that's fine.

42:22 But like, I feel like it's much more, you know, much more closer together and like much more

42:28 stronger the relationship, I think.

42:30 Yeah.

42:30 Yeah.

42:30 That's great.

42:30 Yeah.

42:31 I think actually we've gone in the, we've, typing's got better for someone who's not

42:35 like, it's actually got less verbose, cleaner, easier to understand.

42:38 You don't have to import union.

42:40 You can do pipe operator.

42:41 You don't have to import list from typing.

42:44 You can use list, which makes complete sense.

42:46 Any is an unfortunate one, but I also understand why the any function might, it would not make

42:51 sense.

42:52 I give up.

42:52 I just, I can't deal with this part.

42:54 So yeah.

42:54 No, in general, I think it's got much better.

42:57 I do think that the interchange between runtime, so there's a PEP open now to add to data class

43:03 transforms, a converter function.

43:06 I forget exactly how it works, but I think that is awareness in the static typing space

43:11 that data gets converted when you construct something that looks like a data class.

43:15 So no, I think, I think it's really positive.

43:18 I think we're incredibly lucky that we're like, I could say TypeScript is the other, is in some

43:23 ways the best untyped language typing system.

43:25 But the fact that they're not available at runtime means we're, we're killing it.

43:29 I think I spoke to someone who maintains a library that does a type analysis at runtime in

43:35 TypeScript and all his types are strings and like they're valid TypeScript, but they're

43:40 strings.

43:40 And that's, you know, he was saying that doesn't matter and it's all fine.

43:44 I tend to feel like it probably does a bit.

43:46 We're really lucky to have them at runtime.

43:48 Then you go to the other end where I've been writing a lot of Rust.

43:51 I am like, Rust's great.

43:52 It has many advances, but if you want to just get something done and not have to,

43:55 think too hard about what the types are, it's really nice.

43:58 I write a lot of Python that's untyped when I'm just trying to get something to, something

44:01 to work.

44:01 I'm not a like, everything must have a type on it kind of person.

44:05 So no, I think we're in a really great place.

44:06 And I think most of the advantages are actually cleaning it up.

44:09 So the new six something, 649, the new generics syntax to me, 695.

44:18 There are people who know the names of their numbers of their peps and there's everyone

44:25 everyone's saying.

44:26 That for me, it cleans up generics, right?

44:30 Yes, it's a fundamental change to the language.

44:32 Yes, it makes the syntax of a function look a bit more like Rust or something.

44:36 But like, if you look at it independently of our experience, it's a heck of a lot more elegant

44:41 than importing type var.

44:42 All right.

44:43 Yeah.

44:43 Yeah.

44:44 Let me ask you one that's, this is purely theoretical because I don't think it'll get adopted,

44:48 but we have int, pipe, none.

44:50 We have optional of int.

44:51 A lot of languages have question mark for nullable types.

44:55 Like it'd be int.

44:56 You could even say it like int.

44:57 I'm not sure.

44:58 Is it an int?

44:59 It could be an int.

44:59 It might be nullable.

45:00 I don't know.

45:01 Right?

45:01 Or use int as an int.

45:03 You just know.

45:03 There's no question mark.

45:04 And those types, what are your thoughts about null, call us, annual care?

45:08 I'm really happy with the new situation and not having the optional that isn't optional.

45:12 That's been a problem for a long time.

45:14 So not needing to use optional is being able to use pipe none is great.

45:19 I actually think one of the things that's going to happen with, particularly with the advent

45:23 of the match syntax and with increased use of type dict, we're going to need a new union

45:29 type that operates much more like an enum in Rust.

45:32 So basically a union that keeps track of which member of the enum you have an instance of.

45:38 I keep meaning to build a package to demonstrate what I mean.

45:40 And I haven't got around to it, but like if you have a union.

45:44 Type dict, which is a legitimate thing to do.

45:46 It's effectively impossible without starting to do effectively validation to work out which

45:50 member you're on.

45:51 So I think we need, and it would be really neat if you could use a match expression to process

45:55 each branch of your union.

45:57 Sebastian?

45:57 You already said everything.

45:58 No, but like, you know, like I feel, I feel that way, I was saying that like, I feel

46:04 Python is just like growing and like the typing system is growing.

46:08 I feel it's growing in a very healthy way because it's not, you know, it's not like just some,

46:12 some, some academics hidden in some corners somewhere saying like, this is how it should

46:17 be done.

46:17 I did my thesis on this type system and here we are.

46:19 Yeah.

46:19 And then like everyone should just use it.

46:21 It's just like a lot of hearing everyone and just receiving the feedback from everyone

46:26 and just like growing in the ways that it should grow.

46:29 I think that's amazing.

46:30 I think like we are, you know, it's like a kind of renaissance of like typing in Python

46:35 and like how we can build all these things.

46:37 I think that's amazing.

46:38 I think it absolutely is.

46:39 All right.

46:39 I think we're pretty much out of time.

46:41 We've used up all the various places we've escaped to at a shutting down conference here.

46:44 Final question for you both.

46:46 Just, you know, what's your big takeaway?

46:47 What's the experience like here at PyCon?

46:49 Like how's it been 2023?

46:51 For me, it's been amazing.

46:52 It's my first PyCon in the US.

46:55 Oh, it is.

46:55 Yeah.

46:55 Like I have never been in a PyCon in the US.

46:57 I have been in PyCons in like many other places, but not in the US.

47:00 And like I got to see, I got to put faces to so many handles in Twitter and GitHub.

47:06 I got to meet you in person.

47:08 That's amazing.

47:09 Wow.

47:09 It's great.

47:09 Like a bunch of other people that I only knew, you know, just like on the internet,

47:14 a bunch of core developers and like, that's so cool.

47:16 They are so cool.

47:16 Like I knew they were super cool, but just like, you know, talking on Twitter and like

47:20 didn't see me in person.

47:21 That's amazing.

47:23 It's my favorite part of the whole conference.

47:25 It's just the people and the getting together.

47:27 Definitely.

47:28 I think I attended like two talks.

47:31 I was just on the hallways talking to everyone.

47:34 You feel the hallway track.

47:35 Yeah.

47:35 I was all the way on the hallway track.

47:38 Awesome.

47:38 Well, that's great.

47:38 Yeah.

47:39 I absolutely love it.

47:40 I remember Sebastian and I joined the Language Summit remotely two years ago, the year when

47:44 there was no PyCon.

47:44 And the most interesting bit of the like four hours Zoom call was the five minutes between

47:49 talks when people just chatted.

47:50 And I remember then thinking how cool PyCon must be to have that same group of people

47:54 like in a room rather than on a Zoom call.

47:57 So no, I love it.

47:58 I think it's, I've really enjoyed it.

48:00 Last year was my first year.

48:01 This year is even more fun.

48:03 Yeah.

48:03 I really enjoy it.

48:03 Awesome.

48:04 Yeah.

48:04 It's been great to meet you both in person.

48:06 Meeting you has been the best bit of all.

48:07 Thank you very much.

48:08 No, no.

48:08 It's been really great to spend some time with you all here.

48:10 Thanks for coming on the podcast.

48:12 Part two now here to wrap things up.

48:14 So it's, thanks for taking the time and congrats both on the success of your projects.

48:18 They're amazing.

48:19 Thanks so much.

48:20 Thank you very much.

48:21 Thanks for having us.

48:21 Thanks for seeing us.

48:23 Yeah.

48:23 Bye guys.

48:24 This has been another episode of Talk Python to Me.

48:26 Thank you to our sponsors.

48:27 Be sure to check out what they're offering.

48:29 It really helps support the show.

48:30 Take some stress out of your life.

48:32 Get notified immediately about errors and performance issues in your web or mobile applications with

48:38 Sentry.

48:38 Just visit talkpython.fm/sentry and get started for free.

48:43 And be sure to use the promo code talkpython, all one word.

48:46 InfluxData encourages you to try InfluxDB.

48:49 InfluxDB is a database purpose built for handling time series data at a massive scale for real-time analytics.

48:56 Try it for free at talkpython.fm/InfluxDB.

49:00 Want to level up your Python?

49:01 We have one of the largest catalogs of Python video courses over at Talk Python.

49:05 Our content ranges from true beginners to deeply advanced topics like memory and async.

49:10 And best of all, there's not a subscription in sight.

49:13 Check it out for yourself at training.talkpython.fm.

49:16 Be sure to subscribe to the show, open your favorite podcast app, and search for Python.

49:20 We should be right at the top.

49:22 You can also find the iTunes feed at /itunes, the Google Play feed at /play,

49:26 and the direct RSS feed at /rss on talkpython.fm.

49:31 We're live streaming most of our recordings these days.

49:33 If you want to be part of the show and have your comments featured on the air,

49:37 be sure to subscribe to our YouTube channel at talkpython.fm/youtube.

49:41 This is your host, Michael Kennedy.

49:43 Thanks so much for listening.

49:44 I really appreciate it.

49:45 Now get out there and write some Python code.

49:47 I'll see you next time.

49:48 Bye.

49:48 Bye.

49:48 Bye.

49:48 Bye.

49:49 Bye.

49:50 Bye.

49:50 Bye.

49:50 Bye.

49:51 Bye.

49:52 Bye.

49:52 Bye.

49:52 Bye.

49:53 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:54 Bye.

49:55 Bye.

49:55 Bye.

49:55 Bye.

49:55 Bye.

49:56 Bye.

49:57 Bye.

49:58 Bye.

49:59 Bye.

50:00 Bye.

50:01 you you Thank you.

Back to show page
Talk Python's Mastodon Michael Kennedy's Mastodon