我喜欢 Pylance 类型检查。
但是,如果我有一个 variable var: Union[None, T]
,其中T
implements foo
,pylance 将在以下位置引发错误:
var.foo()
因为 typeNone
没有实现foo
.
有没有办法解决这个问题?一种告诉 Pylance 的方法“这个变量None
有时是,但在这种情况下,我 100% 确定它会被分配
我喜欢 Pylance 类型检查。
但是,如果我有一个 variable var: Union[None, T]
,其中T
implements foo
,pylance 将在以下位置引发错误:
var.foo()
因为 typeNone
没有实现foo
.
有没有办法解决这个问题?一种告诉 Pylance 的方法“这个变量None
有时是,但在这种情况下,我 100% 确定它会被分配
有很多方法可以强制类型检查器接受这一点。
使用assert
:
from typing import Union
def do_something(var: Union[T, None]):
assert var is not None
var.foo()
引发其他一些异常:
from typing import Union
def do_something(var: Union[T, None]):
if var is None:
raise RuntimeError("NO")
var.foo()
使用if
声明:
from typing import Union
def do_something(var: Union[T, None]):
if var is not None:
var.foo()
使用typing.cast
,一个在运行时什么都不做但强制类型检查器接受变量是某种类型的函数:
from typing import Union, cast
def do_something(var: Union[T, None]):
var = cast(T, var)
var.foo()
关闭该行的类型检查器:
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
.