当导入一个缺少存根的库(没有类型提示)时,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
非常感谢你的帮助。
1条答案
按热度按时间yfjy0ee71#
你可以对未标记函数的返回值使用
typing.Cast
:这将告诉未检测的代码返回的值的类型,因为它到达你的,工具将能够从那里遵循。有一件事要 * 始终 * 记住的是,类型在Python中没有运行时效果,静态类型工具本质上是在执行的同时“看到代码结构”-而
typing.cast
本身没有运行时效果(尽管它没有“优化”运行代码:进行函数调用,即使在Python 3.11和更高版本中,这应该足够优化)