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

How do I get Pylance to ignore the possibility of None?

我喜欢 Pylance 类型检查。

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

var.foo() 因为类型 None 没有实现 foo.

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

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



  1. 使用assert:

    from typing import Union
    
    def do_something(var: Union[T, None]):
        assert var is not None
        var.foo()
    

  2. 引发其他异常:

    from typing import Union
    
    def do_something(var: Union[T, None]):
        if var is None:
            raise RuntimeError("NO")
        var.foo()
    

  3. 使用 if 语句:

    from typing import Union
    
    def do_something(var: Union[T, None]):
        if var is not None:
            var.foo()
    

  4. 使用typing.cast,一个在运行时不做任何事情但强制类型检查器接受变量是特定类型的函数:

    from typing import Union, cast
    
    def do_something(var: Union[T, None]):
        var = cast(T, var)
        var.foo()
    

  5. 关闭该行的类型检查器:

    from typing import Union
    
    def do_something(var: Union[T, None]):
        var.foo()  # type: ignore
    


另请注意,虽然类型检查器如何解释您的类型注释没有区别(两者在语义上是相同的),但您也可以将 typing.Union[T, None] 写成 typing.Optional[T],这可以说是稍微好一点的语法。 In Python >=3.10 (or earlier if you have from __future__ import annotations 在代码的顶部),您甚至可以使用 | 运算符编写 Union 类型,即 T | None.