Mar*_*ers 3 python python-typing vscode-python pylance
我喜欢 Pylance 中的类型检查器(VS Code),但似乎有一种情况我必须在忽略 Pylance 警告和类变量声明的最佳实践之间进行选择。很多时候,类变量是使用None类构造函数中的类型来初始化的,然后再设置该变量。例如:
class Person:
def __init__(self) -> None:
self.name:str = None
def setName(self, name:str) -> None:
self.name = name
Run Code Online (Sandbox Code Playgroud)
在这种情况下,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"
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,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"
Run Code Online (Sandbox Code Playgroud)
理想情况下,有某种方法可以self._name在构造函数中最初“分配”,其唯一允许的类型是str但不给定任何值。这可能吗?
您需要通过以下方式将其设为可选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
Run Code Online (Sandbox Code Playgroud)
Python 3.10+ 通过PEP 604的Union 类型表达式1支持更简单的语法,例如:
def __init__(self) -> None:
self.name: str | None = None
Run Code Online (Sandbox Code Playgroud)