【发布时间】:2020-01-13 01:05:20
【问题描述】:
我正在尝试使用 PEP 484 的 python 2 syntax 指定实例变量的类型。但是,在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 类型 cmets 无法通过 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 中初始化它们?
【问题讨论】:
-
我猜这就是为什么 Protocol 在 2.7 中位于
typing_extensions而不是typing。 -
@BoarGules 这是一个非常无益的评论,因为它暗示这是在 mypy 中做出的明确决定。它看起来更像是一个错误。
标签: python python-2.7 mypy type-hinting