Skip to content

Instantly share code, notes, and snippets.

@mypy-play
Created September 9, 2022 15:43
Show Gist options
  • Save mypy-play/cd69cb964cc29b881d51d7a1798a73ad to your computer and use it in GitHub Desktop.
Save mypy-play/cd69cb964cc29b881d51d7a1798a73ad to your computer and use it in GitHub Desktop.
Shared via mypy Playground
from typing import List, Sequence, Dict, Mapping
from typing_extensions import reveal_type
class Animal:
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
def mutate_list(d: List[Animal]):
pass
def no_mutate_list(d: Sequence[Animal]):
pass
dog_list = [Dog()]
catdog_list = [Cat(), Dog()]
print(reveal_type(dog_list)) # List[Dog]
print(reveal_type(catdog_list)) # List[Animal]
# error: Argument 1 to "mutate_list" has incompatible type "List[Dog]"; expected "List[Animal]"
# note: "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance
# note: Consider using "Sequence" instead, which is covariant
mutate_list(dog_list)
mutate_list(catdog_list)
no_mutate_list(dog_list)
def mutate_dict(d: Dict[str, Animal]):
pass
def no_mutate_dict(d: Mapping[str, Animal]):
pass
cat_dict = {"cat": Cat()} # Dict[str, Cat]
catdog_dict = {"cat": Cat(), "dog": Dog()} # Dict[str, Animal]
# error: Argument 1 to "mutate_dict" has incompatible type "Dict[str, Cat]"; expected "Dict[str, Animal]"
# note: "Dict" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance
# note: Consider using "Mapping" instead, which is covariant in the value type
mutate_dict(cat_dict)
mutate_dict(catdog_dict)
no_mutate_dict(cat_dict)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment