python: typehinting post3.10 syntax

This commit is contained in:
thomasabishop 2023-10-15 17:32:40 +01:00
parent 537038e32c
commit 077460e62f

View file

@ -8,6 +8,8 @@ tags: [python, types]
With type hinting we can add type information to variables, functions, and classes. This is not enforced by the Python interpreter but can be used by external tools like `mypy` to check the code. With type hinting we can add type information to variables, functions, and classes. This is not enforced by the Python interpreter but can be used by external tools like `mypy` to check the code.
Prior to 3.10, to use types you would have to import the types you wanted `from` the `typing` module. With later versions you can use them directly without importing from `typing`.
## Basic syntax ## Basic syntax
### Variables ### Variables
@ -30,11 +32,18 @@ def greet(name: str) -> str:
## Complex data types ## Complex data types
// TODO: Give examples of lists, tuples, dictionaries, sets We can type complex data types such as dictionaries, lists, tuples etc.
## Custom dictionay types The following function takes a tuple comprising two integers as a parameter and returns a list of ints:
We can create custom dictionay types in the manner of TypeScript types and interfaces as follows: ```py
def populate_pair_values(pair: tuple[int, int]) -> list[int]:
return [i for i in range(pair[0], pair[1] + 1)]
```
## Custom dictionary types
We can create custom dictionary types in the manner of TypeScript types and interfaces as follows:
```py ```py
class ArticleInfo(TypedDict): class ArticleInfo(TypedDict):
@ -46,7 +55,7 @@ class ArticleInfo(TypedDict):
We could then use it thus: We could then use it thus:
```py ```py
def parse_articles() -> List[ArticleInfo]: def parse_articles() -> list[ArticleInfo]:
``` ```
## Optional types ## Optional types
@ -56,7 +65,7 @@ def parse_articles() -> List[ArticleInfo]:
```py ```py
from typing import Optional from typing import Optional
def find_index(numbers: List[int], target: int) -> Optional[int]: def find_index(numbers: list[int], target: int) -> Optional[int]:
try: try:
return numbers.index(target) return numbers.index(target)
except ValueError: except ValueError:
@ -65,6 +74,16 @@ def find_index(numbers: List[int], target: int) -> Optional[int]:
The function above returns an `int` or `None`. The function above returns an `int` or `None`.
Post 3.10, we don't need to use `Optional`, we can use a union to cover the `None` case. Refactoring the previous example:
```py
def find_index(numbers: list[int], target: int) -> int | None:
try:
return numbers.index(target)
except ValueError:
return None
```
## Union types ## Union types
`Union` can be used to indicate that a variable can be one of several types. `Union` can be used to indicate that a variable can be one of several types.
@ -90,3 +109,11 @@ def my_function() -> List[int]:
def my_function() -> List[Union[int, float]]: def my_function() -> List[Union[int, float]]:
return [1, 2, 3] return [1, 2, 3]
``` ```
Post 3.10 we can use `|` syntax instead of importing `Union`. E.g:
```py
def add(a: int | float, b: int | float) -> int | float:
return a + b
```