如何注释仅在__init__
之后可用的实例变量的类型?我想按照POLS列出__init__
内的所有实例属性。
MWE:
class MyClass(object):
def __init__(self):
self.foo :Union[CustomClass, None] = None
def set_foo(self):
self.foo = CustomClass()
def use_foo(self):
self.foo.do_something()
在__init__
内,如果我仅将foo注释为self.foo: CustomClass = None
,Pylint将抱怨:
T484:分配中的类型不兼容(表达式的类型为None,变量的类型为“ CustomClass”)。
但是,如果我将foo
注释为self.foo: Union[CustomClass, None] = None
(如上面的MWE),则PyLint会在use_foo
函数内部进行投诉:
T484:“无”没有属性“ do_something”。
如何使PyLint开心? (不禁用T484)
答案 0 :(得分:1)
我想到的最简单的方法是将self.foo
初始化为""
而不是None
。
这意味着self.foo.upper()
将可用,因此pylint将没有理由抱怨。
如果在调用use_foo
(最好将其称为get_foo
之前不希望set_foo
可用,则可以检查以确保{{1} },或者保留一个布尔值字段,说明它是否曾经运行过。
如果您的类比字符串复杂一点,则必须在使用self.foo
之前进行快速检查。
self.foo
这不是一个很干净的解决方案-我认为我们可以做得更好。
让我们尝试将此支票外包给装饰商;
def use_foo(self):
if self.foo is None:
raise EnvironmentError("You haven't called get_foo!")
self.foo.upper()
我还没有亲自使用pylint进行过尝试-但是如果pylint足够聪明以解决正在发生的事情,将def ensure_foo(func):
def inner_func(self, *args, **kwargs):
if self.foo is None:
raise EnvironmentError("You haven't called get_foo!")
func(self, *args, **kwargs)
return inner_func
打在您的类方法上将比在任何地方都没有None检查要干净得多...