底层函数实际上应该被定义为重载——我建议可能对 pandas 进行补丁
这是类型看起来就像现在:
def fillna(
self: FrameOrSeries,
value=None,
method=None,
axis=None,
inplace: bool_t = False,
limit=None,
downcast=None,
) -> Optional[FrameOrSeries]: ...
实际上,更好的表示方式是使用@overload
-- 函数返回None
when inplace = True
:
@overload
def fillna(
self: FrameOrSeries,
value=None,
method=None,
axis=None,
inplace: Literal[True] = False,
limit=None,
downcast=None,
) -> None: ...
@overload
def fillna(
self: FrameOrSeries,
value=None,
method=None,
axis=None,
inplace: Literal[False] = False,
limit=None,
downcast=None,
) -> FrameOrSeries: ...
def fillna(
self: FrameOrSeries,
value=None,
method=None,
axis=None,
inplace: bool_t = False,
limit=None,
downcast=None,
) -> Optional[FrameOrSeries]:
# actual implementation
但假设您无法更改底层库,您可以采用多种方法来解压联合。我做了关于这个的视频专门针对re.match
但我会在这里重申,因为这基本上是相同的问题(Optional[T]
)
选项 1:指示预期返回类型的断言
断言告诉类型检查器一些它不知道的事情:类型比它知道的要窄。 mypy 将信任此断言,并且类型将被假定为pd.DataFrame
def test_dummy() -> pd.DataFrame:
df = pd.DataFrame()
ret = df.fillna(df)
assert ret is not None
return ret
选项 2:投射
显式告诉类型检查器该类型是您所期望的类型,“抛弃”None
-ness
from typing import cast
def test_dummy() -> pd.DataFrame:
df = pd.DataFrame()
ret = cast(pd.DataFrame, df.fillna(df))
return ret
类型:忽略
(imo)黑客解决方案是告诉类型检查器忽略不兼容性,我不建议这种方法,但它可以作为快速修复很有帮助
def test_dummy() -> pd.DataFrame:
df = pd.DataFrame()
ret = df.fillna(df)
return ret # type: ignore