python - 如何以抑制 Pylance 警告的方式声明没有值的类变量

标签 python python-typing pylance vscode-python

我喜欢 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/

相关文章:

python - 无效的格式字符串 Tensorboard

python - 理解 LDA/主题建模——主题重叠太多

python - 特定 Enum 值的类型注释

python - Pylance:找不到带有子模块的 native 库的 stub

python - Visual Studio Code Pylance 搜索文件夹

python - 如何将 joblib 并行化与不返回任何内容的类内方法一起使用

javascript - Ajax 类似于 Django 中的按钮

python - 为什么变量的类型提示不作为函数参数的类型提示处理?

python - 如何正确地子类型 dict 以便 MyPy 将其识别为通用?

python - 当我在 Visual Studio Code 上使用 Python 执行 'Run Selected' 时,它突然打开两个 Python 终端,其中一个不运行我的 Python 代码