PyCharm说"财产无法阅读"在有效的代码上

时间:2017-03-27 06:21:05

标签: python pycharm typing

让我们看一下以下代码:

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个属性:xy。两者都应该没有任何问题,两者应该具有相同的行为。 接下来,代码如下:

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>

...所以xy几乎相同。

为什么PyCharm这么说?我做错了什么或者它有什么错误?如何修复它(没有禁用此类警告)?

2 个答案:

答案 0 :(得分:0)

我不确定为什么PyCharm需要这个,但明确给出__init__的返回类型会使警告消失:

def __init__(self, d: dict) -> object:

答案 1 :(得分:0)

将其设置为 __init__(self, d: dict) -> None似乎现在可以使用。