__init__中的Python输入注释

时间:2018-08-14 06:04:54

标签: python typing

如何注释仅在__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)

1 个答案:

答案 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检查要干净得多...