我如何让 Pylance 忽略 None 的可能性?

Geo*_*rge 2 python-3.x visual-studio-code vscode-settings python-typing pylance

我喜欢 Pylance 类型检查。

但是,如果我有一个变量var: Union[None, T],在那里T实现foo,pylance 将在以下位置抛出错误:

var.foo()因为 typeNone没有实现foo.

有没有办法解决这个问题?一种告诉 Pylance 的方法“这个变量None有时是,但在这种情况下,我 100% 确定它会被分配

Shi*_*hah 9

请不要使用毯子# type: ignore。相反,请具体说明您想要忽略的 linting 错误:

myOptionalVar.foo()         # pyright: ignore[reportOptionalMemberAccess]
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于 VSCode 默认 linter Pylance,它使用 Pyright。


Ale*_*ood 5

有很多方法可以强制类型检查器接受这一点。

(1) 用途assert

from typing import Union

def do_something(var: Union[T, None]):
    assert var is not None
    var.foo()
Run Code Online (Sandbox Code Playgroud)

(2) 引发其他一些异常:

from typing import Union

def do_something(var: Union[T, None]):
    if var is None:
        raise RuntimeError("NO")
    var.foo()
Run Code Online (Sandbox Code Playgroud)

(3) 使用if语句

from typing import Union

def do_something(var: Union[T, None]):
    if var is not None:
        var.foo()
Run Code Online (Sandbox Code Playgroud)

(4) Use typing.cast,一个在运行时什么都不做但强制类型检查器接受变量是某种类型的函数:

from typing import Union, cast

def do_something(var: Union[T, None]):
    var = cast(T, var)
    var.foo()
Run Code Online (Sandbox Code Playgroud)

(5) 关闭该行的类型检查器

from typing import Union

def do_something(var: Union[T, None]):
    var.foo()  # type: ignore
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找这样的答案。很高兴看到强制类型检查器的不同选项。有点希望这是在文档中 [关于 None/Optional 类型的 mypy 错误](https://mypy.readthedocs.io/en/stable/common_issues.html#unexpected-errors-about-none-and-or-optional -类型) (2认同)