【发布时间】:2021-10-09 13:11:39
【问题描述】:
我有点困惑,为什么我会在 Pycharm 中收到关于用属性替换属性的警告。
例如:
from typing import Protocol
class Foo(Protocol):
@property
def x(self) -> int:
pass
class Bar(Foo):
# I get a warning for the line below
# Type of 'x' is incompatible with 'Foo'
x: int
def __init__(self, x: int):
self.x = x
我不明白为什么我会收到警告。在我看来,它看起来像是一个假阳性。据我所知,唯一实际的区别是Bar.x 可以分配给Foo.x 不能分配的位置。但是添加诸如添加方法之类的功能通常不会违反协议。
我在这里缺少什么?用属性替换属性真的与协议或超类不兼容吗?如果是,为什么?
【问题讨论】:
-
请注意,您没有在
Bar.__init__中包含self参数;我认为错误消息告诉您int与Foo本身不兼容,而不是Foo.x和Bar.x之间存在差异。 -
@chepner 哎呀。这就是在不通过代码编辑器的情况下将 SSCCE 键入堆栈溢出的危险。我已经更正了这个问题。
-
property-valued 类属性和实例属性之间仍然存在显着差异,所以我怀疑这是相关的。我想知道mypy是否只是对Bar().x的最终结果做出了比 PyCharm 更多的推断。 -
@chepner 除了在分配给属性时引发异常之外,如果您以其他方式与属性交互,我想不出任何会“行为不端”的交互。违反协议某些行为不得符合,但我正在绞尽脑汁想知道它可能是什么。
-
动态语言中的静态类型提示很难。
标签: python pycharm type-hinting