没有初始值的变量的类型注释

Not*_*ame 10 python type-annotation

我一直在阅读 PEP484 和 526,但仍然无法找出对没有初始值的变量进行类型注释的更好方法。

假设您有一个类,并且__init__要在类中声明一个变量,但不提供初始值(稍后在代码中进行赋值)。通常我通常会做的是:

from typing import Optional, List

class SomeClass:

    def __init__(self) -> None:
        self.some_value: Optional[int] = None
        self.other_var: Optional[List] = None

    def _some_method(self) -> None:
        self.some_value = 42
Run Code Online (Sandbox Code Playgroud)

这是可行的,但我觉得使用Optional会变得__init__过于忙碌并且难以阅读。相反,我能做的是:

from typing import List

class SomeClass:

    def __init__(self) -> None:
        self.some_value: int
        self.other_var: List

    def _some_method(self) -> None:
        self.some_value = 42
Run Code Online (Sandbox Code Playgroud)

显然,这会使变量未初始化,但只要在引用之前正确分配它们,一切都会正常工作,并且如果我在__init__.

使用第二种方法时,未初始化变量是否会出现任何具体问题?

Gij*_*ben 2

使用第二种方法时,未初始化变量是否会出现任何具体问题?

是的。添加类型注释而不设置值仅适用于类型检查器。您实际上不会创建该变量。只需看一下第二个示例中抛出的错误:

from typing import List


class SomeClass:
    def __init__(self) -> None:
        self.some_value: int
        self.other_var: List

    def _some_method(self) -> None:
        self.some_value = 42


sc = SomeClass()
print(sc.some_value)
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
  File ".../test.py", line 14, in <module>
    print(sc.some_value)
          ^^^^^^^^^^^^^
AttributeError: 'SomeClass' object has no attribute 'some_value'
Run Code Online (Sandbox Code Playgroud)

请注意,错误是“没有属性”。换句话说,根本没有创建该属性。

从 Python 3.10 开始,语法变得更加清晰,因此您不再需要 import from typing,也不再需要了Optional。这就是我输入你的班级的方式:

class SomeClass:
    def __init__(self) -> None:
        self.some_value: int | None = None
        self.other_var: list[int] | None = None

    def _some_method(self) -> None:
        self.some_value = 42
Run Code Online (Sandbox Code Playgroud)