Я пытаюсь указать тип переменной экземпляра, используя PEP 484 синтаксис Python 2. Однако я не нашел способа добавить типы без инициализации переменной в python 2, что эквивалентно следующему python 3:
value: int
Моя обычная работа для этого состоит в том, чтобы объявить тип переменной в __init__
при создании экземпляра переменной. Однако это не работает для протоколов, где тип переменной экземпляра должен быть частью протокола (типы в __init__
, похоже, не учитываются). Вот пример в Python 3, где я использую реализацию по умолчанию:
from typing_extensions import Protocol
class A(Protocol):
value: int
def get_value(self) -> int:
return self.value
Затем это выделит ошибки, если value
не инициализирован должным образом:
class B(A):
pass
B() # error: Cannot instantiate abstract class 'B' with abstract attribute 'value'
Однако преобразование этого в комментарии типа python 2 не может передать mypy. Это дает ту же ошибку с объявлением __init__
или без него.
class A(Protocol):
def __init__(self):
# type: () -> None
self.value = 0 # type: int
def get_value(self):
# type: () -> int
return self.value # error: "A" has no attribute "value"
Есть ли какой-то специальный синтаксис для объявления типов переменных без их инициализации в python 2?
typing_extensions
в 2.7, а неtyping
. - person Quantum7   schedule 11.09.2019