为 click.options() 创建包装装饰器

问题描述 投票:0回答:1

我正在尝试为点击装饰器创建一个包装装饰器

@click.options('--foo', required=True)

import click

def foo_option(func):
    orig_decorator = click.option('--foo', required=True)(func)
    def decorator(*args, **kwargs):
        orig_decorator(*args, **kwargs)
    return decorator

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

if __name__ == '__main__':
    bar1()

这是行不通的。当我像

script.py --foo=1
一样运行它时,我收到错误:

Usage: script.py [OPTIONS]
Try 'script.py --help' for help.

Error: No such option: --foo

预期输出应该是:

bar1: 1

我错过了什么? 请参阅重构 @click.option() 参数了解背景信息。

python python-decorators python-click
1个回答
0
投票

您需要将您创建的函数包装在装饰器中,因为这是您调用的函数

import click

def foo_option(func):
    @click.option('--foo', required=True)
    def decorator(*args, **kwargs):
        orig_decorator(*args, **kwargs)
    return decorator

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

if __name__ == '__main__':
    bar1()
© www.soinside.com 2019 - 2024. All rights reserved.