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

如何优雅复用Click库中重复的@click.option()参数?

解决Click命令重复选项的优雅方式

可以用以下几种简洁的方式避免重复定义--foo选项:

方式一:用functools.partial封装重复选项

直接把click.option的固定参数(包括关键字参数)预先绑定,生成可复用的装饰器,完全不需要拆分args和kwargs:

import click
from functools import partial

# 封装带required=True的--foo选项
required_foo_option = partial(click.option, '--foo', required=True)

@click.command()
@required_foo_option()
def bar1(foo: str) -> None:
    print(f"bar1: {foo}")

@click.command()
@required_foo_option()
def bar2(foo: str) -> None:
    print(f"bar2: {foo}")

if __name__ == '__main__':
    bar1()
    # bar2()

方式二:自定义装饰器函数

如果觉得partial不够直观,自己写个简单的装饰器,用法更简洁:

import click

def required_foo_option(func):
    return click.option('--foo', required=True)(func)

@click.command()
@required_foo_option
def bar1(foo: str) -> None:
    print(f"bar1: {foo}")

@click.command()
@required_foo_option
def bar2(foo: str) -> None:
    print(f"bar2: {foo}")

方式三:组合多个重复选项(扩展场景)

如果有多个重复选项,可以把它们组合成一个装饰器链,一次性应用到所有命令:

import click
from functools import partial, compose

# 定义多个重复选项
required_foo = partial(click.option, '--foo', required=True)
optional_bar = partial(click.option, '--bar', default='default')

# 组合成一个通用装饰器
common_options = compose(required_foo(), optional_bar())

@click.command()
@common_options
def bar1(foo: str, bar: str) -> None:
    print(f"bar1: {foo}, {bar}")

@click.command()
@common_options
def bar2(foo: str, bar: str) -> None:
    print(f"bar2: {foo}, {bar}")

内容的提问来源于stack exchange,提问作者Håkon Hægland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:12