Typing
Most people know the issue with mutable defaults in Python. But what’s the best way to fix it? The issue class User: def __init__(self, name: str, emails: list[str] = []) -> None: self.name = name self.emails = emails def add_email(self, email: str) -> None: self.emails.append(email) james = User(name="James") james.add_email("james@gmail.com") john = User(name="John") # John will have the emails ['james@gmail.com'], even though we never added that email to John's list. # That's a bug!
Let’s say you have a parent class Animal and a child class Cat that inherits from Animal. You might think that you can add a Cat to a list of Animals. But then your pyright / vscode / mypy linter will complain that you can’t do that. Why is that? Let’s start with a simple example: class Animal: def make_sound(self) -> None: print(f"animal!") class Dog(Animal): ... class Cat(Animal): ... def meow(self) -> None: print("meow!