问题描述
我喜欢 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