我们来看看以下代码:
import typing
def make_getter(field: str) -> typing.Callable[['A'], int]:
def getter(self: 'A') -> int:
return int(self.dict[field])
return getter
def make_setter(field: str) -> typing.Callable[['A', int], None]:
def setter(self: 'A', value: int):
self.dict[field] = str(value)
return setter
class A:
def __init__(self, d: dict):
super().__init__()
self.dict = d
get_x = make_getter('foo')
set_x = make_setter('foo')
x = property(get_x, set_x)
def get_y(self) -> int:
return int(self.dict['bar'])
def set_y(self, value: int):
self.dict['bar'] = str(value)
y = property(get_y, set_y)
我定义了2个属性:x
和y
。两者都应该没有任何问题,两者应该具有相同的行为。接下来,代码如下:
a = A(dict())
a.x = 10
print(a.x)
a.y = 20
print(a.y)
PyCharm编辑说:“a.x
上的”财产无法阅读“。但是这个代码执行得很好,没有任何问题。
第一个想法是PyCharm错误推断类型。 But look at this short video I recorded.我看不出任何类型的问题。
也:
print(repr(a.get_x), repr(a.get_y))
print(repr(A.get_x), repr(A.get_y))
print(repr(A.x), repr(A.y))
它的输出:
<bound method make_getter.<locals>.getter of <__main__.A object at 0x7f7d25145f28>> <bound method A.get_y of <__main__.A object at 0x7f7d25145f28>>
<function make_getter.<locals>.getter at 0x7f7d25132e18> <function A.get_y at 0x7f7d25132f28>
<property object at 0x7f7d25143c78> <property object at 0x7f7d25143cc8>
...所以x
和y
几乎相同。
PyCharm为什么这么说?我做错了什么或者它是一种错误?如何修复它(没有禁用此类警告)?
我不确定为什么PyCharm需要这个,但明确给出__init__
的返回类型使警告消失:
def __init__(self, d: dict) -> object:
设置为__init__(self, d: dict) -> None
似乎现在工作。