type RGB = tuple[int, int, int]
type TripleInt = tuple[int, int, int]
9 Type Hint: Evolution
Source: https://youtu.be/RwH2UzC2rIo?si=dJwlRhTjOlAx6lQ7
9.1 Type Alias
== TripleInt RGB
False
type User = dict[str, str | int | None]
def create_user(first_name: str, last_name: str, age: int | None = None) -> User:
= f"{first_name.lower()}_{last_name[0:3].lower()}@example.com"
email return {
"first_name": first_name,
"last_name": last_name,
"age": age,
"email": email
}
"kittipos", "sirivong", None) create_user(
{'first_name': 'kittipos',
'last_name': 'sirivong',
'age': None,
'email': 'kittipos_sir@example.com'}
9.2 NewType
from typing import NewType
= NewType("RGB", tuple[int, int, int])
RGB = NewType("HSL", tuple[int, int, int])
HSL
type User = dict[str, str | int | None | RGB]
def create_user(first_name: str, last_name: str, age: int | None = None, fav_color: RGB | None = None) -> User:
= f"{first_name.lower()}_{last_name[0:3].lower()}@example.com"
email return {
"first_name": first_name,
"last_name": last_name,
"age": age,
"email": email,
"fav_color": fav_color
}
"kittipos", "sirivong", None, RGB((122, 334, 433))) create_user(
{'first_name': 'kittipos',
'last_name': 'sirivong',
'age': None,
'email': 'kittipos_sir@example.com',
'fav_color': (122, 334, 433)}
# Will warn wrong type
"kittipos", "sirivong", None, HSL((122, 334, 433))) create_user(
{'first_name': 'kittipos',
'last_name': 'sirivong',
'age': None,
'email': 'kittipos_sir@example.com',
'fav_color': (122, 334, 433)}
9.3 TypedDict
from typing import TypedDict
class User(TypedDict):
str
first_name: str
last_name: int | None
age: str
email: | None fav_color: RGB
def create_user(first_name: str, last_name: str, age: int | None = None, fav_color: RGB | None = None) -> User:
= f"{first_name.lower()}_{last_name[0:3].lower()}@example.com"
email return {
"first_name": first_name,
"last_name": last_name,
"age": str(age), # Wrong type
"email": email,
"fav_color": fav_color
}
9.4 DataClass
from dataclasses import dataclass
@dataclass
class User:
str
first_name: str
last_name: str
email: int | None = None
age: | None = None fav_color: RGB
def create_user(
str,
first_name: str,
last_name: int | None = None,
age: | None = None,
fav_color: RGB -> User:
) = f"{first_name.lower()}_{last_name[0:3].lower()}@example.com"
email return User(
=first_name,
first_name=last_name,
last_name=email,
email=age,
age=fav_color,
fav_color )
"kittipos", "sirivong", None, RGB((122, 334, 433))) create_user(
User(first_name='kittipos', last_name='sirivong', email='kittipos_sir@example.com', age=None, fav_color=(122, 334, 433))
9.5 Generic Type (TypeVar
)
from typing import TypeVar
import random
= TypeVar("T")
T
def random_choice(items: list[T]) -> T:
return random.choice(items)
# Or
def random_choice2[T](items: list[T]) -> T:
return random.choice(items)
= create_user("kittipos", "sirivong", None, RGB((122, 334, 433)))
user1 = create_user("lightbridge", "ks", None, RGB((122, 334, 433))) user2
random_choice([user1, user2])
User(first_name='lightbridge', last_name='ks', email='lightbridge_ks@example.com', age=None, fav_color=(122, 334, 433))
random_choice([user1.email, user2.email])
'kittipos_sir@example.com'