Generics4:40 with Kenneth Love
Sometimes you can't specify your types just with the built-in types. In that case, you can us `Optional`, `Union`, and `List` from the `typing` module to specify custom type combinations.
Like I said in the introduction to this workshop, 0:00 Python 3.5 gave us the typing module. 0:02 This module defines a bunch of, 0:05 well, types that we can use when creating hints for our code. 0:07 Let's look at something a bit more complex. 0:10 I've been working on some classes that all relate to recipes. 0:12 There's an ingredient class that's already typed it just uses strings but 0:15 the ones in this model are a bit more complicated. 0:19 For instance the recipe ingredient class can when instantiated receive 0:22 either an ingredient or a string to turn into an ingredient. 0:26 Maybe not the best design but that's what I have to work with. 0:31 In the typing module there are several types defined for 0:34 these more complex situations but 0:37 there are three of them that you'll find yourself using more often than the others. 0:38 It just so happens that I need to use all three of them in here. 0:42 So let me go ahead and import these, 0:45 the first one that I want to talk about is list. 0:48 So I'm gonna say from typing import list. 0:52 The list type lets you say that you want a list of items of a particular type. 0:58 For example, I would want a list of strings, 1:02 if I was annotating the str.join method. 1:04 In my recipe class, 1:07 down here, I want to store ingredients as a list of recipe ingredients. 1:09 I wanted to start out blank too, so, hey, you get a twofer. 1:14 So ingredients right now is a list and I'm gonna say this is gonna 1:19 be a list of RecipeIngredients and I want it to be a blank list. 1:25 So that's what this equals blank is and 1:30 for instance self.title right here is going to be a string. 1:32 And I also want to have steps be a list of recipe steps. 1:38 And this is where we're using Python 3.6's variable type hinting too, by the way, 1:47 this line right here. 1:51 Just like when we hint function parameters, we use a colon and 1:53 then the type. 1:55 And if we don't want to define a default value for the variable, 1:57 we can just name it and hint it, right? 2:00 So, if I had say another one, self.order, 2:02 this is just going to be an int, all right? 2:07 So, that just makes that one an int. 2:12 But if I want to have a default value or 2:14 I want to assign a value, I can do with an equal sign afterwards. 2:15 And I don't need that order, so I'm gonna go ahead and take that out. 2:18 The method where we just have the variable name and the type ends up looking a lot 2:21 like other languages where you have to declare a variable before you can use it. 2:25 But this is 100% semantic sugar and 2:28 doesn't actually create the variable in Python. 2:30 Quick note about lists. 2:33 Much like the actual list type you don't usually want to 2:34 use it when you're declaring types with parameters in a function or a method. 2:37 You want to check out the mapping sequence and abstract set types from the typing 2:42 module for those cases there's a link to these in the teacher's notes. 2:45 I also wanna make this one add a string. 2:50 All right, so what about recipe ingredient needing either a string or an ingredient. 2:53 Right right up here that was our thing. 2:58 Well this is where the union type comes in. 3:01 Union lets you specify two or more valid types. 3:04 So let's bring in union. 3:07 And then here for ingredient I'm gonna say 3:11 this is a union of ingredient or string. 3:16 So now the type checkers know that either of these values are valid for the method. 3:20 If you do a union with only one type Python ignores the union and 3:24 just uses the type that you included. 3:27 Python also flattens unions If you nest them. 3:29 All right on to the third handy dandy type that I mentioned this one is optional. 3:31 Not that it is optional. 3:37 It's called optional and it specifies that a type is well exactly that it's optional. 3:38 This means that the value can be one of the types that are specified or none. 3:46 This is really good for places where you have arguments that can be left out 3:52 in fact recipe ingredient needs exactly that. 3:56 Because measurement here can be none. 4:00 So we'll say that measurement is optional and 4:03 if it's available if it's included I want it to be a string. 4:06 Otherwise it's none condition would be the same. 4:10 The measurable value is optional, defaults to none. 4:14 Now the type checker knows that it's okay for the argument to be admitted. 4:15 If you look through the downloads that are associated with this workshop, 4:19 you'll see this file fully filled out with types. 4:21 Something you might notice is that it feels a bit redundant. 4:24 You could just specify the types when you're defining the method parameters and 4:26 be safe enough. 4:29 But I like to specify the types when I first define a variable too. 4:30 Just make sure that my thinking follows the same pattern all the way through again 4:34 this is something to decide with your team. 4:37
You need to sign up for Treehouse in order to download course files.Sign up