8

我喜欢 Pylance 类型检查。

但是,如果我有一个 variable var: Union[None, T],其中Timplements foo,pylance 将在以下位置引发错误:

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

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

4

1 回答 1

11

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



  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]as typing.Optional[T],这可以说是稍微好一点的语法。在 Python >=3.10(或更早版本,如果您from __future__ import annotations在代码顶部有),您甚至可以Union使用运算符编写类型|,即T | None.

于 2021-07-21T11:37:38.273 回答