Pydantic: Modern Python Data Validation and Settings by Michael Kennedy

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello and welcome to another episode of v brown bags i'm your uh tonight we have michael kennedy he's here to talk to us about pi dantic modern python data validation and settings excellent um just a few housekeeping notes here uh you can get another conversation at v brownbag and or any of those other ads there uh we also have a twitter hashtag going chris will be monitoring the twitter sphere not all night not all night no no just just just for the duration of this recording um and yeah you can uh find michael kennedy there at m kennedy on twitter again i'm your host sean doyle and chris williams at misswire on twitter um and we do this every wednesday night so yeah well uh and with that and what's your twitter handle sean you can't you can't follow me on twitter oh no cool all right i will stop sharing mr kennedy are you ready sir i'm ready hello everyone chris and sean thank you for having me here wonderful to have you on once again mr kennedy yeah it's great to have you here yeah well shall we kick it off i think you know let's just start with some screen sharing how's that sound i'm excited to learn about this all right me as well so we will jump over here and i will try to push away all my little screen sharing bits that i'm sure will be in the way so we're going to talk and we're going to talk about pydantic and pydantic is not this amazing software that you would use directly but it's the software that you would use to make other software better if you're building an api it's fantastic as the data exchange layer it's so powerful that people are starting to use this as the classes that you create for orms for things you know like what would be the the next generation sql alchemy or some kind of mongodb odm data access layer they've started to decide well these pedantic models if we could put those between our database and our code then we would get automatic validation type conversion all this beautiful stuff that we get with this pedantic library so you should think of pedantic as this salt that you can sprinkle on to existing libraries existing web frameworks or if you're even just doing straight up devops type stuff you'll see that there's really cool things you can do about taking like environment variables and other settings that you might need parsing those into your code and then working with them knowing that they've been validated and are mostly correct as correct as you can validate them for anyway so that's the idea we're going to explore this library pedantic that enhances other things you do with python now let's just jump straight into some code here i've got a few things put together and a couple of comments i put together for myself so here you can see i have an elaborate presentation mechanism number one we're gonna go create some types and we're gonna try to get them out of this environment so i organized some things a little bit so you can kind of tell where they come from this is to be ignored but over here i have just some data files i'm going to first start talking about some json data and i made it intentionally janky looking so that just to sort of get the feel of here's unstructured yucky data coming to us that will pop out the other side in a nice way and then also if you work with python a lot or other frameworks as well there's this dot env file format that plugs into python plugs into the environmental settings and so on and you'll see that there's neat stuff we can do with pedantic around that as well as i was hinting at so over here in this environment section we're going to have those kinds of things and then in the models these are going to be our identic classes it's mostly an object-oriented programming style this is where we define python code that maps over to this data so let me just nab one of these over here and we'll go over to this people thing so in this thing we're going to have some kind of data and they somebody said hey you've got to process this data and you're like okay geez all right well i got to parse this and what what what parts of this are we sure we're going to have what is required what is the data formats and all those things so what we'll do is we're going to go and create a class that represents a person right and pedantics world you have this base class and if you derive from this base class it will do all sorts of magic but we'll put that to the side for a minute so what we do is in our data we've got over here we've got like a first name and in python in recent python you can do things like this you can say that this is a string and put it like this you don't have to give it a value you can just say there's a thing called first name and if i come down here and i create a person it'll have a first name and if you go click on it you can see it does like string stuff so i could set it to be like my name or chris's name or sean's name or whatever okay so we can define this class that has that and we also have one for the last name and maybe we want one for the address which who knows what that is so we're just going to say we don't know what that is for the minute because that looks complicated and one of the favorite numbers and we'll just say that this for now i'll say it's a list like this right that's what the square brackets represents so this is a start but there's a couple other things that we want to do what we learned by talking to people who said you have to process this data is they said that this last name sometimes we don't have that we kind of got this from like a sign up form for a webcast something called v brown bag or something people signed up they didn't necessarily give us their last name but we made sure they gave us their first name so in python there's a weird about weird but there's a non-obvious way in which you say that this thing might not have a value some languages you can have a thing like a string and then it cannot have a value but other languages like say swift you have to explicitly say this thing might not have a value and it's a different type than if it's the same thing that might have a value python doesn't really have types right i mean it's a dynamic language but in its way that it describes what it wants not what it requires but what it would ideally have what you would put is you it has this mechanism of must explicitly say this one might not be there and so it's not obvious but the way you do is you say this is optional and that comes from the typing library so we can go over here and say this is an optional string and then down here we can say that that's not a list like that but it's a list and over here this list contains integers and also comes from this typing library okay so here this could be an empty list or it could be a list like one seven and five but it can't be nothing it can't be other things right it'd have to be an optional so then this let's deal with this last one and we'll have some pretty interesting things to work with let's have a class address what if this habit has a street which is going to be a string let's say and it has a country which is a string but it'll have a default usa and it has a zip code which is also a string like this okay and then so down here we can come and say this is address or we could even go so far as to say this is an optional address because we don't know that it's going to necessarily be supplied right this was a webcast sign up or something right so here we have it i have no idea what favorite numbers has to do with sign up for the web but just run with it okay all right so we've we've got this and these are this is pure python there's nothing identic happening here yet but these data class type definitions pydantic can extend them and make them awesome so we can say there's a base model which it comes from pedantic and we have this base model here and then this is where it gets really cool we can come over to let's go to this bear thing that i was working on we can say from models dot people import person and address so we can come down here and we can actually load up this data right this is all this json data it's all janky and it actually has validation errors not valid it has incorrect data in it as we'll see so we'll say with open uh let's oh that's a lot of autocomplete go away environment by the way just pycharm sidenote check that out that it's auto completing the file system over here that's just cool that makes me happy that's awesome yeah so we can go over here and say the data is json dot load from that file pointer and let's just really quickly pretty print the data because it wasn't pretty before but python loaded it so we should be able to make that work whoo look at that there it is so we've got our address there's michael kennedy there's chris williams loves that on on wood lane here's sarah jackson her favorite numbers are such and such here so this is not pedentic this is just the raw data but notice for example that this favorite numbers it's supposed to be numbers like 1 7 11 and 97 but it's somebody put the numbers in quotes so really the data is kind of right but it's not right you know if you were to go to like load that up and try to work with it say use it in a calculation or ask if it's greater than or less than another number your program is going to crash right because it it can't work with those heterogeneous types it needs them actually to be numbers normally that's the kind of stuff you've got to deal with we've got to come over here well make sure like in this case that there is a first name are you sure there's a first name okay great we were able to load up this thing go to the address well if it exists it has to have these things in it but if it doesn't exist at all that's also okay here's a list of numbers are they really numbers could they be turned into numbers and if they're not possible which one is wrong and all these things right this is this is that the tedious details of programming that you just get into right right so yeah catch or try to catch or cast it to an integer and yeah just as it gets more nested it just gets worse but check this out uh i'll leave that commented for y'all so let's go and here's our people i'm gonna go to my person um it's a little bit complicated because we have an array of people i put in here i suppose i did this to myself but we have an array of multiple people so i've got to do it like this i gotta create a i want to say p for p and data so those will be for the json person thing and i'm going to go to that and say i want a person and the way that you specify is you go to this person object and you say here are the keyword arguments like first name equals the value last name equals the value something handy in python that you can if you have a dictionary you can say do the keyword argument thing instead is i can say star star p and while that looks weird all that means is take every key in the dictionary like first name and last name and say that equals the value as arguments if we do that though check this out spelling is hard even with autocomplete apparently okay so we've got this person object loaded up and let's even make it a little bit more easy to see just put them on one line each so that they're not completely out of control here on the small screen so we got michael we got kennedy chris and williams and so on here's the address look at this so it went down and we said we have a person and this thing address is an address class it actually went and found that and pulled those pieces in and it has this hierarchical way but the thing that i think should impress us all the most is that seven right there where did the quotes go right it knows that that was a list of integers so it went through and said is each one an integer normally most things would just go crash no it's not an integer go away it said could it possibly become one sure it's a quote seven it just means seven and so it automatically converted that uh check this out so i said the last name was optional so that's fine so chris's last name is now gone but if i did it different and he only gave his last name but not his first name which we didn't say was optional remember it's just stir not optional stir crash required field on this one what is missing first name it gets even cooler than that like check this out so if i go over here to sarah and i said this one is 7-11 because we all love convenience stores and run it it crashes and says no no no the favorite numbers is wrong but not just which one is wrong zero base indexed two so zero one two that one in the list is wrong right so there's this really beautiful way in which it just takes the data and it just goes through and it makes sure everything that you put into your code up here is either exactly true or can be converted to be true so you just have to write really simple code here and then all sorts of neat stuff happens we're just at the tip of the iceberg i'm going to show you some other neat stuff but it's it's pretty cool right yeah totally yeah so let me fix this so don't die and we'll just leave it as cool set 11. that's fine so that is pretty neat you can also get it back in reverse if i wanted to create some kind of json from this i could come over here what would i do people as json again because i don't know what i was thinking make it an array make my life hard but it's okay so we would say p dot json um oh we'll fire four p n people i can't remember if it is a function yeah it is and then we could print um p print people as json if we do that one then it's converted back to the way it was so there's this bi-directional aspect of it as well that's all pretty cool i'm gonna comment out the printing here real quick so we don't go crazy now i know a lot of folks here into like devops type stuff and so on so one of the things that's got special attention over here is dealing with settings so so far what what you would think of this is probably like a an api data exchange or something like that right somebody's done a post to an api endpoint and here's their json data and you can parse it and work with it but there's other things if we check out the settings management stuff i'll do a little bit but not a ton of it if we derive from base settings instead of base model and then we can come over and do all sorts of stuff we can come down and parse those directly from environment variables or from these hey guess what dot emv files like i was just talking about you can do interesting things like where does it say find it here somewhere there's things that you can do where you put prefixes on it so if you have a machine that's got like a redis server a mongodb server and a celery server in each one of these it could just have a server is a string but then in the class you could put the prefix like all the settings that go to this one are salary underscore server salary underscore port and so on and it will automatically just pull those in so let's do like a real quick thing with that so i've got this this database over here and this server over there so just like before we want to create a class that maps over to this stuff so let's do that real quick we'll say class server config let's call it our settings i'll go with settings but this time it's not a base model it's a base settings like so and we come over here it's going to be a string this is going to be an int and then we'll have db settings which is going to be something we're going to make up here what are we going to get for our db a bunch of very nice stuff like i hope you all appreciate that password i use an exclamation mark and a number so we're good so again if you just create these classes you can say you know some things are optional like this could be a an optional stir because sometimes we will blur out your super secure password oh gosh did i leave that in there that's in the recording isn't it oh my goodness oh well i'm gonna have to just i'm gonna regenerate that i'm gonna put a four safer that's not moved three to four so much better yeah so we come over here and say that this is a um an optional one of these as well right like that and then i kind of i don't actually remember so i'm going to snatch for my little um snippets this little bit here so what we can do is we can come and we can just say the environment file is i don't want it actually out there on it right here and the encoding is that and let's just print out settings so that'll be cool let's go and run this and check that out we're like parsing it straight out of our emv file and if that was not in the env file but it was in like a true environment variable it'll just grab it and pull them over and there you're working with them but it's not just that like let's go one step further now i would think that it should be able to pull in this as like a nested thing but i don't know how to nest stuff in dot env files so let me just db is what i want there we go settings and db settings there may be a way but i'm not entirely sure but check this out so we have our db settings that we parsed over and remember uh which one there's the version somebody entered that as a quote seven it doesn't matter it got converted to a seven and you can put additional validators like that this is really an ip address and things like that so all sorts of cool stuff like now your config files are just automatically pulled in but they're also really easy to work with from code because i come over here and say settings.db settings dot and then you know there's my autocomplete magic but you know they're all there and verified like if it says there's a stir it's there right if it wasn't there pretty sure this will cause some problems uh yeah well i gotta finish finish my thought down there right like it says the setting required this names field and it's not there so i think that's really cool you should definitely check out this base setting things but let's go and take it a little bit farther and see some other neat things we can do i'm going to close a few of these suckers off we'll come back to that okay so let's suppose we're going to build an api so i have two examples for you i have a flask app that i wrote there it is like it's kind of crazy though that's a flask app but there it is let's run it i think you'll all be impressed with my web design skills here oh yeah you like it that's nice right all right is this the appropriate time to plug your uh to plug your flash class it is it absolutely is yeah you can you too if you can do this good on one hand it's kind of impressive that this is the entire web app but what you get is not impressive all right so let's add an api to this something fun now flask and pedantic don't typically go together what typically happens in flask is you're on your own and you're doing it by hand the old dreadful way but let's go and create a function called api and say it has an app.route to slash api and in here what we can do is we can get the data we can say flask.request.json and that's might be none which will make some of the stuff we're going to do crash so if it's none i would like it to just be an empty dictionary if it's not none that will be a dictionary so this sort of like makes it always a dictionary not to test all right and then let's just print out for the moment the data that we got back and then return let's let's return we'll just echo it back for a moment say flask flow flask dot gj sonify data okay so this is going to start out being boring so if i click it well with our raw data nothing so let's send it something more interesting are you all familiar with postman postman is a really cool program that lets you very carefully construct stuff we send to a api so i could go to my browser and i could type that in in fact i did and i got this but how do i post not do a get but post some kind of interesting data you just you know maybe if you go to the console or get a plugin but you're better off getting a dedicated tool so let's go over here change this to a post and we'll go to the body and let's go say i want this to be raw as a json and let's just go and nab this from our data that we had before let's send i will send sarah over come here sarah you're going go into the server okay so we go to the body and thankfully that doesn't quite fit that's kind of a ui issue but we can beautify it and make it a little nicer and notice again it still has like this slightly invalid but not really invalid data so if we go send this over it didn't like it it said method not allowed so let's go over here and i think it's method equals i think it's a list post good methods let's see nope there we go and check it out if one could get this thing to fit on one screen oh you would totally have it all right close the close up the body come on show it to me oh yeah i can zoom it there we go beautiful so let's do ascend and where's the response 200 okay where did the body go oh this is the body this is the response right here sorry it's the same like this is what we're sending this is what we're getting back sorry i'm sitting the same thing so that's okay that's what we would do in flask but we can bring pedantic into this we could say you know what we're getting a person here so we're going to say person equals just like we had already created that same object we go here and we just do our pass in the keyword argument thing we print out person and let's imagine now that we want to return a person.address now these are not json things so it doesn't quite work so you need to say json and also notice that sarah doesn't have an address so this is going to crash let's get her an address she's moving in with chris all right grace i hope you're okay with that kim is going to have kids about this well you've got a roommate that's all okay like you just you got you all are running out of room okay somebody let me pay the rent cool yeah exactly address there we go so do i restart it let's restart one more time if we send this over check this out now we've got our data back why did it come back to the string because i called jsonify on it and i did not mean to i think maybe i want to turn this directly do that yes exactly mixing too many web frameworks together so here we've got our our response right check this out and the other thing that would be nice which we see if we print is notice those sevens and elevens are now parsed over right and if something's missing if our our person says you know what we decided um that we don't want to send the first name over and you call it just like before it didn't take care of we're not returning the details directly but you would see the validation error right first name right so that is pretty cool let's take it one step further i know getting short on time but trust me this will be quick so that was fun this is this is great stuff take your time i'm enjoying this awesome so good so is there a way to see like so you see it come in and it transfers the integer from a string to an integer in the list of things is there a way to see before pyden well i guess we could just print it out or or log it out but like how do you how do you like get people to say hey stop sending me strings you know send me a seminar exactly um there are a bunch of like interception methods you can add and stuff you can probably get in the way and like check or something um so that's that's probably it i'm not sure it's really quite in the zen of it i think it's like if i can convert it i'm just going to convert it but there are a bunch of interception points in which you can get into the the conversion process and add like like i'm saying like additional validators where it's like this one's a ip address or something yeah that would be really cool to validate the ips i've i've had to write code to validate like is this uh i had to use some library i can't remember but you know is this the correct cider what what you know is this a valid subnet et cetera et cetera so if it just does it for you that's amazing yeah well i think you would have to write it but you could put it in just one place and then then whenever it's needed that conversion it'll just do it is what i was thinking i see yeah yeah okay so that's fun let's talk about another web framework that was flask let's talk about fast api so we run this you will also be equally impressed there it is again it's incredible but this time it's on port 8000 instead of 000 so i feel that's we're making progress but no seriously this is going to be amazing so watch this so fast api goes farther than the other frameworks because it was built alongside idantic and it's like you know what what could we do if we actually had pedantic you know flask was built 10 15 years ago so let's go and get that bit of code here and then fast api if i it so this is going to be a post we don't have to say the method it's in the by the way flask 2 they now have post and get that's a new thing they're like oh yeah that was a good idea so over here instead of doing all of this explicitly they said you know what let's just say that we have a person that comes in to the to the api right the argument to it is a person and that comes actually from the json body so watch this so if we run this i click on it it's supposed to open click on this you get a it only accepts posts so we're out of here back over to this change that to eight and look at that we get our response automatically so it knew it it took this thing and converted it to the person just by virtue of it being an input now what am i returning here i don't want to return json in the fast api world let's do it again we just return the address look at that because it knows oh this is a pedantic thing and it can be turned into json so here we go bam this is all pretty cool and again it has the same validation so like if we don't have a first name boom check out that js that like sort of api friendly error field is required it's missing what's missing first name from the body that's really cool that it prints it out like that in json isn't that neat yeah yeah so you can deal with it programmatically because it's sort of programmatic api first right now now check this out what if i was new to this advanced api we've created here i would go over to my beautiful website and i would say okay well i could click this and that doesn't work but but what if i could have documentation and hit docs okay so now we have this a get to index that we don't really need to see but this post this looks like an api and here's the schemas that are exchanged we have an address that is exchanged and a person and the person has an address by the way so let's go down to this all right so this has no parameters but its request body is required and it looks like that looks like our person right what did we do to create this documentation nothing this that's just that's awesome right yeah that's awesome yeah oh but the return is a string and we saw that it's not really a string it's an address ah what's going on here so we can do one more little quick thing we can say the response model not class is the address we rerun it and we regenerate our documentation now our response is an address with a json schema validation and all of that pretty cool right so if you're building little apis and you want to have make sure the data that comes in is valid and also the data that goes out you can't construct these models to return by passing them invalid data so you know that they're going to be the right format type etc for them before you can even send them back as well as taking them in so really really neat stuff that we can do here with fast api and pedantic but as you saw also really neat stuff that you can do just working with like straight json files working with environment variables darn there's that password again and so on so um but really the the pinnacle of it is obviously this right yeah the the address parser and whatnot but neat stuff so if you've got examples where you're taking json data or you've got some other class that that you're working with some other data format you want to pull these in really really neat let me see if i can find uh some examples here so beanie i really should put more qualifiers and this is not good beanie db um there so this beanie i think is really cool and it is an async python data access layer for mongodb based on you guessed it pedantic so when you get started what do you do you come down here and you create a class that is one of these pedentic models here's another one that's a pedentic model and here's even the nested stuff you do in mongodb and then you just go say here's my models from my database off it goes with indexes and all sorts of stuff so there's a lot of neat things like this i think oh gosh i can't remember what there's a brand new sequel based one of these as well and i'm just forgetting the name off the top of my head what exactly it is but there's something else that's like a sql alchemy competitor but also using pedantic so this pedantic stuff is starting to show up in a lot of different layers and it makes a lot of sense like where it's on the boundary right i'm getting data from the database into my app and this is what i expect i'm sending it out over an api and this is what they expect and so on to do an extra layer of just making sure that data has been scrubbed properly yeah exactly nice exactly i i totally missed an opportunity when you were talking about flask about 10 minutes ago when you said oh and and flask does this now it's like and you would know that if you had listened to mike kennedy's episode 316 flask 2.0 thank you yeah so now we can do this brand new you can do a get and you can do a post that's so 2020. all right oops that won't make any difference but if i rerun it it should still work yeah thanks thanks for that plug yeah i interviewed the guys who are doing flask about their updates to it nice so yeah there you go method not allowed just like you would expect yeah that's really handy i mean the fact that it can take these what would typically be a bunch of custom like you know lines and lines of code to validate and test and if this that you know error handling and what have you and then just turn it into two lines essentially well a class and then a couple lines so um it's also nice that it centralizes that validation right so if in a real application that's large you're probably using this person concept and doing this data exchange in different places right on the file system on the apis and all different parts of your app you write it once in the class and then it just happens everywhere so that's really nice too right because you could leverage this on all of your all of your different data ingestion and ingress and ingress points exactly right yeah the model and then you can create yeah separate controller and do all that so uh what do you do when things go wrong like error handling by dantic so pydendic has this philosophy that is really good for apis it's not always a perfect fit for everything and so the philosophy is as soon as it hits an error it throws an exception and it says no no no we're done this is wrong so when you're taking a block of data from an api either it's good or it's not good and then it can proceed but sometimes you're like trying to read a bunch of lines out of a file and you know like it's you kind of want to just capture the data that's bad and carry on so i think really the thing is you're going to need to which is a good place to show this not there something that i didn't quite finish filling out but this like this part here when you're doing stuff each one of those should probably be in a try except block and if something goes wrong you just hang on to the original data and say this this one is no good we got to throw it away or log it or something you know gotcha yeah that makes sense yeah can i look at this oh sweet okay so i would do something like yeah yeah something like that so there's probably some like error class validation exactly something like that okay and then that validation you could even append like you could have save the error and the data something like that as a tuple and then you're like okay i've got to go back and deal with these and then you could figure out what's wrong with each one of them say you know here's the error message because this thing is going to have a bunch of details about here's the model that it's working with and the raw errors and you know give me the errors as like a chain of things and yeah so on but it's default mode is you try to give me something somewhere along the way it was bad it doesn't give you the person class as good as it can get it plus the error it just goes nope you're not getting that it's broken right and that's a lot of times what you want but sometimes it doesn't make sense and it just probably means you can't use pedantic for that situation right right yeah for rapid development i think that would be amazing like it's just like nope here's the thing you you need to to pass me right and then you can go back and and you can ease it out and make it more forgiving as well and what you could do is you you could do things you know i'd not necessarily endorsing this but you could go back and say you know what this is a an innie actually this can just be what it's just a list of something right you could sort of step it back right to to accept more things there's there's a way to go down here and create an inner class config and then you can put stuff goes here um and some of the things you put in there like uh let's see there's some neat things here pinedant egg um where is the it's not validated this model config so uh you can put things like let me show where the config thing goes do i have an example yeah here's an example so you've got an inner class called config and then you can just put stuff on here about like a different types of errors and stuff so you can say things like if somebody gives me a string do a strip on it to get rid of any white space at the beginning or end or make everything lower case or um oh interesting different different types of things like um i'm forgiving some example but for uh example like uh yeah this white space one uh is something and then of course i believe you can make your own as well that's really neat so you can override basically the defaults if you if you so choose of what pedantic would have done with that base model yeah then there's a bunch of field types that it supports um and here that you all can check out so it's not just like list and string but it's got like um some more odd stuff down here i think do they actually have ip addresses you can do like patterns yeah there you go ip address file oh nice there you are ip address 6 and so on so you can see that the type is an ip address rather than a string and yeah it's going to be right stuff like that oh so a bunch of neat things anyway you can also say it's in a new so if you've got an enumeration that's like colors you know green yellow blue gray it's got to be one of those four right it can't be beige or whatever so there's all sorts of like stuff that we're not getting into here but yeah just go check out the documentation because there's a bunch of neat things going on but in general the the simple use case is what most people will probably be doing very slick yeah very interesting very very interesting yeah i like it because it's easy to adopt right like this is not a this is not a large overhead for you to do it and it just like it kind of just handles all the problems for you yeah i was using the the typing and the you know optional and list and things like that before but this on top of that is really really pretty sweet i mean yeah yeah i love this i love the way it works together so it's very nice cool chris do we have any uh any questions no i i think you i think you did a great job um ringing some questions from mr kennedy yes thank you that was great appreciate all the questions yeah um so i i was i was uh keeping an eye on the on the uh the twitter sphere but we are clean for questions um but sean i mean you did a fantastic job and you you ran us right up until the the end of the time with uh with all of your questions which honestly i had the same ones so so you you asked the exact same things that i would have asked so job well done sir thank you thank you and thank you to michael thanks a lot michael for joining us and giving us that overview of pydantic really really cool stuff yeah i definitely need to check it out um it's definitely worth a look if anybody here is not a follower of if if somebody that's watching this is a is a python aficionado and they are not listening to the talk python podcast i highly highly encourage you to go to talkpython.fm and uh and check out where your current he's mike is currently up to 325 episodes of delicious python and goodness going from everything from from beginners to to advanced interviews there's there's something for everybody in there oh and he's also teaching he's also got some classes on there uh that that are great for beginners and all the way up to advanced folks yeah definitely sean and i are fans definitely second that if you're into python if you're into machine learning contain i mean there's a conversation with uh the gentleman from docker talking about docker best practices super insightful yeah super insightful thanks talkpython.fm thank you both for that i really appreciate it and thanks everyone for watching uh and go check out pedantic i'm not involved with it just a fan i think we should all be using it yeah absolutely it's good stuff cool all right sean why don't you walk us out all right well that's it for tonight folks uh yeah we will be here next week wednesday i i believe we're here next week wednesday as well so thank you so much for tuning in and talk to you talk to you then
Info
Channel: vBrownBag
Views: 15,258
Rating: undefined out of 5
Keywords: Data, DevOps, IT Education, ORM, PyCharm, Python, Typing, vBrownBag
Id: lon-dEXfY2I
Channel Id: undefined
Length: 45min 32sec (2732 seconds)
Published: Thu Jul 22 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.