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__.
使用第二种方法时,未初始化变量是否会出现任何具体问题?
使用第二种方法时,未初始化变量是否会出现任何具体问题?
是的。添加类型注释而不设置值仅适用于类型检查器。您实际上不会创建该变量。只需看一下第二个示例中抛出的错误:
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)
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |