不确定我做错了什么还是pylint
是否有问题。在下面的代码中,我得到了一个错误提示: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)
答案 0 :(得分:1)
暂时不会回答这个问题,但是我确实弄清楚了它与@property装饰器的使用有关。在创建新对象属性的过程中,类型提示信息将丢失给pylint,并且VSCode intellisense似乎不起作用。使用旧样式的属性语法,我可以得到适当的整理和类型提示(请参见下图)
似乎有点可耻,但我希望有人能给出更好的答案
答案 1 :(得分:0)
如果self._type
是一个类(而不是实例),则可能要用type
对其进行注释。 type
是python中的默认metaclass。
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._type。由于它是实例的私有变量,因此使用起来非常好。这将阻止pylint E1102出现。
删除type属性将删除E0601。这是因为您的属性在类名称空间中隐藏了名为type
的全局变量。如果已定义,则pylint认为您打算使用该属性(此时,该属性是property
类的实例,而不是类的属性)。