如何输入最初为 None 但保证获得值的提示变量

Kri*_*kar 7 python type-hinting python-typing

我有一个类变量,如下所示:

class MyClass:
    def __init__(self):
        self.value: MyOtherClass | None = None
        self.initialize_value()

    def initialize_value(self):
        self.value = MyOtherClass()

    def use_value(self):
        return self.value.used
Run Code Online (Sandbox Code Playgroud)

self.valueMyOtherClass保证在使用之前被初始化为 的实例self.use_value();然而,它必须保持为None在构造函数中。这里的困境是如何正确地提示这种情况。

  • 如果我选择如上所示输入提示,我会得到一个error: Item "None" of "Optional[MyOtherClass]" has no attribute "used" [union-attr]
  • 如果我从构造函数中删除变量定义并将类型提示移至self.initialize_value(),我会得到一个Instance attribute value defined outside __init__从 Pylint 收到错误

解决这个问题的最佳方法是什么?多谢!

Dan*_*erg 6

为了避免重复,当这样的属性在整个类的多个方法中使用时,对我来说,一个常见的模式是保护它并定义一个引发错误的属性(如果未设置其背后的属性):

class MyClass:
    def __init__(self):
        self._value: MyOtherClass | None = None
        self.initialize_value()

    @property
    def value(self) -> MyOtherClass:
        if self._value is None:
            raise AttributeError("...")
        return self._value

    def initialize_value(self):
        self._value = MyOtherClass()

    def use_value(self):
        return self.value.used
Run Code Online (Sandbox Code Playgroud)

这也消除了类型检查器的歧义,因为属性的返回类型始终 MyOtherClass是。