Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pylint为可调用的对象属性提供不可调用错误_Python_Pylint_Typehints - Fatal编程技术网

Python pylint为可调用的对象属性提供不可调用错误

Python pylint为可调用的对象属性提供不可调用错误,python,pylint,typehints,Python,Pylint,Typehints,不确定我是否做错了什么,或者这是pylint的问题。在下面的代码中,我得到一个linting错误,self.type不可调用E1102 虽然我可以忽略它并继续工作,但似乎这种事情应该很容易解决。。。只是想不出如何修复它 from typing import Callable class Thing: def __init__(self, thing_type: Callable): self._type = thing_type self._value

不确定我是否做错了什么,或者这是
pylint
的问题。在下面的代码中,我得到一个linting错误,
self.type
不可调用
E1102

虽然我可以忽略它并继续工作,但似乎这种事情应该很容易解决。。。只是想不出如何修复它

from typing import Callable


class Thing:
    def __init__(self, thing_type: Callable):
        self._type = thing_type
        self._value = None

    @property
    def type(self) -> Callable:
        return self._type

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = self.type(value)

这个答案会有一段时间不被接受,但我确实发现它与@property decorator的使用有关。在创建新对象属性的过程中,类型提示信息将丢失给pylint,并且VSCode intellisense似乎无法工作。使用旧式属性语法,我得到了适当的linting和类型暗示(参见下图)

看起来有点遗憾,但我希望有人能想出更好的答案


如果
self.\u type
是一个类(而不是一个实例),您可能需要用
type
来注释它<代码>类型是python中的默认值

pylint应该更好地处理这个问题——它知道可以调用类来创建实例

class Thing:
    def __init__(self, thing_type: type):
        self._type: type = thing_type
        self._value = None

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = self._type(value)
注意,我还包括了一个变量注释,其中需要python 3.6

还请注意,如果您没有在任何地方包含type.setter,python将自行得出无法设置类型的结论。如果您随后在构造函数中引用_type(您现在正在这样做),那么您已经绕过了不可设置的类型

编辑: 我将value.setter改为使用self.\u类型。因为它是实例的一个私有变量,所以使用起来非常方便。这将阻止pylint E1102出现


删除type属性将删除E0601。这是因为您的属性在类名称空间中隐藏了名为
type
的全局变量。如果定义了该属性,pylint认为您打算使用该属性(此时,该属性是
属性
类的实例,而不是类上的属性)

不知道为什么,但pylint现在在第5行给出了一个错误:赋值前引用的E0601变量类型。此外,这并不能解决问题中提到的问题(通过3.6和3.7进行检查),也不能设置带有@type.setterEdited位的属性setter,这与E1102有关。至于E0601,我会四处看看,然后再打给你。在我看来,这似乎是pylint中的一个错误,它无法识别正在使用的类型。我将看看是否可以提交一份关于pylint在这种情况下的奇怪行为的错误报告。消息应该是关于隐藏builtin.github问题的消息:。请注意,您还可以通过将注释括在引号中来避免此警告,在3.7中,引号应具有与的相同效果,但PEP还注意到,它不应该是必需的。