【发布时间】:2021-10-20 12:01:58
【问题描述】:
是否可以键入提示类的属性的附加属性?
我有一个类属性Outer.inner,它可以是符合InnerProto协议的类的任何实例。
#### I do not control this code #######
from typing import Protocol
class InnerProto(Protocol):
arg: int
class OuterProto(Protocol):
inner: InnerProto
Inner 类符合InnerProto 协议,但它还有一个附加属性(据我了解,这并不违反协议一致性)
class Outer:
def __init__(self, inner: InnerProto):
self.inner: InnerProto = inner
class Inner:
def __init__(self, arg: int):
self.arg: int = arg # this is part of the protocol
self.arg2: int = arg # this is not
Pycharm (v2021.2) 检查将属性arg2 突出显示为未解析的属性。
def test_type_hint_example():
obj = Outer(Inner(1))
assert obj.inner.arg == 1
assert obj.inner.arg2 == 1 # inspection highlights arg2 as "unresolved attribute"
是否可以输入提示以便检查识别 arg2 是什么?
通常我会倾向于更改Outer.inner 的类型提示,但在这种情况下这是一个错误。 inner 可以是任何符合 InnerProto 的类。
我的第二个想法是覆盖实例属性的类型提示。这种类型的技巧适用于非属性对象,但在这种情况下,它会导致不同的检查错误:“Non-self attribute could not be type hinted”
def test_option1():
obj = Outer(Inner(1))
obj.inner: Inner # fixes inspection for arg2, but "Non-self attribute could not be type hinted" occurs
assert obj.inner.arg == 1
assert obj.inner.arg2 == 1
还有哪些其他选择?
【问题讨论】:
标签: python python-3.x pycharm type-hinting python-typing