You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:04:59