python-3.x 当输出来自没有类型提示/存根的库时,删除返回类型

vh0rcniy  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(80)

当导入一个缺少存根的库(没有类型提示)时,mypy将其标记为没有存根的模块。一个简单的修复方法是在导入后添加# type: ignore,但是,所有返回类型都变成了Any。现在,如果我定义一个函数,返回来自这个库的东西,似乎我也需要将返回类型定义为Any
这看起来非常通用,我想知道是否有一种更明确的方法来定义返回类型,而不是在库没有存根时使用Any
下面是一个非常简单的使用Plotly的例子:

import plotly.express as px # type: ignore
from plotly import graph_objects as go
from pandas import DataFrame

def plot_df(df: DataFrame) -> go.Figure:
    return px.bar(data_frame=df)

这会触发以下mypy错误:“* 错误:由于未遵循的导入[no-any-unimported]*,返回类型变为“Any”。"用Any替换go.Figure可以解决这个问题,但是我想知道是否有更好的方法来解决这个问题。
我使用的是Python 3.9.16,下面是我的pyproject.toml文件中mypy的配置:

[tool.mypy]
disallow_untyped_defs = true
disallow_any_unimported = true
no_implicit_optional = true
check_untyped_defs = true
warn_return_any = true
warn_unused_ignores = true
show_error_codes = true

非常感谢你的帮助。

yfjy0ee7

yfjy0ee71#

你可以对未标记函数的返回值使用typing.Cast:这将告诉未检测的代码返回的值的类型,因为它到达你的,工具将能够从那里遵循。
有一件事要 * 始终 * 记住的是,类型在Python中没有运行时效果,静态类型工具本质上是在执行的同时“看到代码结构”-而typing.cast本身没有运行时效果(尽管它没有“优化”运行代码:进行函数调用,即使在Python 3.11和更高版本中,这应该足够优化)

from typing import cast

...

def plot_df(df: DataFrame) -> go.Figure:
    return cast(go.Figure, px.bar(data_frame=df))

相关问题