【发布时间】:2022-01-24 18:14:52
【问题描述】:
我正在使用click 构建命令行应用程序。我正在使用mypy 进行类型检查。
但是,使用 @pass_context 将上下文传递给函数按预期工作,但 mypy 失败并出现错误:
error: Argument 1 to "print_or_exit" has incompatible type "str"; expected "Context"
我不明白为什么。以下是重现此 mypy 错误的 MWE:
import click
from typing import Optional
@click.pass_context
def print_or_exit(ctx: click.Context, some_txt: Optional[str] = "") -> None:
if ctx.params.get("exit_", False):
exit(1)
print(some_txt)
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@click.option("--exit","-e", "exit_", is_flag=True, help="exit")
@click.pass_context
def main(ctx: click.Context, exit_: bool) -> None:
print_or_exit("bla")
if __name__ == "__main__":
main()
使用参数-e运行脚本,则脚本存在,不打印到终端;当省略 -e 时,脚本会打印到终端,因此一切都按预期工作。
那么,为什么 mypy 会失败?
【问题讨论】:
-
Did
ctxarg intprint_or_exit是str或click.Context吗? -
您的 mypy 是否可以访问
click模块的存根库?如果不是,则无法知道@click.passcontext通过更改其参数来修改以下函数。 -
@FrankYellin 是的,据我所知,我使用的是 click 版本 > 8,它具有内置存根