我喜欢 Pylance (VS Code) 中的类型检查器,但似乎有一种情况我必须在忽略 Pylance 警告和类变量声明的最佳实践之间做出选择。
很多时候,类变量是在类构造函数中使用 None
类型初始化的,然后再设置变量。例如:
class Person:
def __init__(self) -> None:
self.name:str = None
def setName(self, name:str) -> None:
self.name = name
在这种情况下,Pylance 在分配 self.name:str = None
时给出以下错误:
Cannot assign member "name" for type "Person"
Expression of type "None" cannot be assigned to member "name" of class "Person"
Type "None" cannot be assigned to type "str"
有没有什么方法可以在构造函数中声明self.name
,这样就不需要一个值并且 Pylance 很高兴?
编辑:一些人建议使用 typing.Optional
来抑制这个 Pylance 警告。但是,如果创建另一个成员函数以返回 self.name
并保证它返回 str
的实例,则会生成另一个 Pylance 错误。请参阅以下示例:
class Person:
def __init__(self) -> None:
self._name:Optional[str] = None
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, name:str) -> None:
self._name = name
在这种情况下,Pylance 会生成错误:
(variable) _name: str | None
Expression of type "str | None" cannot be assigned to return type "str"
Type "str | None" cannot be assigned to type "str"
Type "None" cannot be assigned to type "str"
理想情况下,有一些方法可以在构造函数中初始“分配”self._name
,使其唯一允许的类型是 str
但未给出任何值(value)。这可能吗?
最佳答案
您需要通过 typing.Optional
将其设为可选:
#!/usr/bin/env python
from typing import Optional
class Person:
def __init__(self) -> None:
self.name: Optional[str] = None
def setName(self, name: str) -> None:
self.name = name
Python 3.10+ 通过 PEP 604 支持更简单的语法的 Union type expressions 1 ,例如:
def __init__(self) -> None:
self.name: str | None = None
关于python - 如何以抑制 Pylance 警告的方式声明没有值的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72383861/