如何让Typer子命令继承并接受父级命令的参数?
在Typer中让子命令共享公共参数的解决方案
方法1:用装饰器复用公共参数
适合需要在子命令级别直接接收参数的场景(支持python main.py write something --some-input foo这类调用方式)。通过自定义装饰器封装公共选项,批量给子命令添加相同参数,避免重复代码。
示例代码:
import typer # 封装公共参数的装饰器 def common_options(func): func = typer.Option(None, "--some-input", help="公共输入参数1")(func) func = typer.Option(0, "--other-input", help="公共输入参数2")(func) return func # 主程序入口 app = typer.Typer() # 创建write命令组 write_app = typer.Typer() app.add_typer(write_app, name="write") # write组下的子命令,通过装饰器注入公共参数 @write_app.command() @common_options def something(some_input: str, other_input: int): typer.echo(f"执行write something: some_input={some_input}, other_input={other_input}") # 创建get命令组 get_app = typer.Typer() app.add_typer(get_app, name="get") # get组下的子命令,复用相同的公共参数 @get_app.command() @common_options def something(some_input: str, other_input: int): typer.echo(f"执行get something: some_input={some_input}, other_input={other_input}") if __name__ == "__main__": app()
测试调用:
python main.py write something --some-input foo --other-input 123
输出结果:
执行write something: some_input=foo, other_input=123
方法2:通过上下文传递父级参数
如果希望公共参数仅在顶级命令设置,子命令通过上下文读取参数值,可以使用这种方式。参数需要放在命令组之前,比如python main.py --some-input foo write something。
示例代码:
import typer app = typer.Typer() # 顶级回调定义公共参数,并存入上下文对象 @app.callback() def common_params( ctx: typer.Context, some_input: str = typer.Option(None, "--some-input", help="公共输入参数1"), other_input: int = typer.Option(0, "--other-input", help="公共输入参数2") ): ctx.obj = { "some_input": some_input, "other_input": other_input } # write命令组 write_app = typer.Typer() app.add_typer(write_app, name="write") @write_app.command() def something(ctx: typer.Context): # 从上下文获取公共参数 params = ctx.obj typer.echo(f"执行write something: some_input={params['some_input']}, other_input={params['other_input']}") # get命令组 get_app = typer.Typer() app.add_typer(get_app, name="get") @get_app.command() def something(ctx: typer.Context): params = ctx.obj typer.echo(f"执行get something: some_input={params['some_input']}, other_input={params['other_input']}") if __name__ == "__main__": app()
测试调用:
python main.py --some-input bar --other-input 456 get something
输出结果:
执行get something: some_input=bar, other_input=456
选择建议
- 若需要用户在子命令后直接指定参数(匹配你的使用需求),优先使用方法1。
- 若希望参数全局统一配置,无需在子命令重复指定,选择方法2。
内容的提问来源于stack exchange,提问作者WhatAmIDoing
相关产品推荐
相关产品推荐

