Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
[Анотации в python] Анотации типов в Python

Анотации типов в python и модуль typing

Simple example

Пример анотации для функции

def print_name(name: str) -> None:
  print(f'Hello, {name}!')

Для полей класса аннотации должны быть указаны явно при определении класса. Однако анализаторы могут выводить автоматически их на основе init метода, но в этом случае они не будут доступны во время выполнения программы.

class Book:
  title: str
  author: str
    
  def __init__(self, title: str, author: str) -> None:
    self.title = title
    self.author = author

Using module typing

Optional

Если пометить переменную типом int и попытаться присвоить ей None, будет ошибка:

Incompatible types in assignment (expression has type "None", variable has type "int")

Для таких случаев предусмотрена в модуле typing аннотация Optional с указанием конкретного типа. Обратите внимание, тип опциональной переменной указывается в квадратных скобках

from typing import Optional

amount: int
amount = None  # Incompatible types in assignment (expression has type "None", variable has type "int")

price: Optional[int]
price = None

Any

Иногда вы не хотите ограничивать возможные типы переменной. Например, если это действительно не важно, или если вы планируете сделать обработку разных типов самостоятельно. В этом случае, можно использовать аннотацию Any. На следующий код mypy не будет ругаться:

unknown_item: Any = 1
print(unknown_item)
print(unknown_item.startswith("hello"))
print(unknown_item // 0)

Union

Для случаев, когда необходимо допустить использование не любых типов, а только некоторых, можно использовать аннотацию typing.Union с указанием списка типов в квадратных скобках.

def hundreds(x: Union[int, float]) -> int:
    return (int(x) // 100) % 10

hundreds(100.0)
hundreds(100)
hundreds("100")  # Argument 1 to "hundreds" has incompatible type "str"; expected "Union[int, float]"

Result from functions

Если же функция никогда не возвращает управление (например, как sys.exit), следует использовать аннотацию NoReturn:

def forever() -> NoReturn:
    while True:
        pass

Если это генераторная функция, то есть её тело содержит оператор yield, для возвращаемого можно воспользоватьтся аннотацией Iterable[T], либо Generator[YT, ST, RT]:

def generate_two() -> Iterable[int]:
    yield 1
    yield "2"  # Incompatible types in "yield" (actual type "str", expected type "int")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.