首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接从python @click创建结构化数据?

直接从python @click创建结构化数据?
EN

Stack Overflow用户
提问于 2022-02-15 11:45:43
回答 1查看 254关注 0票数 0

正如讨论过的,one may reuse python click decorators很容易从几个脚本中获得。然而,随着越来越多的参数

主要函数参数列表变得拥挤,空too-many-arguments

  • the代码处理这些许多参数,如果有几个使用这些参数的脚本,即使是多个类似代码的位置,也必须维护

因此,是否有一种方法可以直接在装饰器中创建类对象来分组参数?

因此,从这样的装饰功能:

代码语言:javascript
复制
def common_options(mydefault=True):
    def inner_func(function):
        function = click.option('--unique-flag-1', is_flag=True)(function)
        function = click.option('--bar', is_flag=True)(function)
        function = click.option('--foo', is_flag=True, default=mydefault)(function)
        return function
    return inner_func

直接发出这样的类:

代码语言:javascript
复制
class CommonOptions:
    def __init__(unique_flag_1, bar, foo):
        self.unique_flag_1 = .... 

可以直接发射到

代码语言:javascript
复制
@click.command
@common_options()
def main(common_options: CommonOptions):
  ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 20:04:11

您可以在一个**kwargs命令中使用click,这样您就可以编写如下内容:

代码语言:javascript
复制
import click
from dataclasses import dataclass


@dataclass
class CommonOptions:
    unique_flag_1: bool
    bar: bool
    foo: bool


def common_options(mydefault=True):
    def inner_func(function):
        function = click.option("--unique-flag-1", is_flag=True)(function)
        function = click.option("--bar", is_flag=True)(function)
        function = click.option("--foo", is_flag=True, default=mydefault)(function)
        return function

    return inner_func


@click.command()
@common_options()
def main(**kwargs):
    options = CommonOptions(**kwargs)
    print(options)


if __name__ == "__main__":
    main()

W/r/t对于您的评论,如果我们借用here的一个想法,我们可以编写这样的代码,这样我们就可以有多个选项组,但是对于每个组,我们只是传递所有的**kwargs并让接收方整理:

代码语言:javascript
复制
import click

from dataclasses import dataclass


class OptionGroup:
    @classmethod
    def from_dict(cls, **options):
        return cls(
            **{k: v for k, v in options.items() if k in cls.__dataclass_fields__}
        )


@dataclass
class OptionGroup1(OptionGroup):
    unique_flag_1: bool
    bar: bool
    foo: bool


@dataclass
class OptionGroup2(OptionGroup):
    count: int
    size: int


def option_group_1(mydefault=True):
    def _(function):
        function = click.option("--unique-flag-1", is_flag=True)(function)
        function = click.option("--bar", is_flag=True)(function)
        function = click.option("--foo", is_flag=True, default=mydefault)(function)
        return function

    return _


def option_group_2():
    def _(function):
        function = click.option("--count", type=int)(function)
        function = click.option("--size", type=int)(function)
        return function

    return _


@click.command()
@option_group_2()
@option_group_1()
def main(**kwargs):
    o1 = OptionGroup1.from_dict(**kwargs)
    o2 = OptionGroup2.from_dict(**kwargs)
    print("group1:", o1)
    print("group2:", o2)


if __name__ == "__main__":
    main()

一些示例输出:

代码语言:javascript
复制
$ python example.py
group1: OptionGroup1(unique_flag_1=False, bar=False, foo=True)
group2: OptionGroup2(count=None, size=None)
$ python example.py --count=3 --bar
group1: OptionGroup1(unique_flag_1=False, bar=True, foo=True)
group2: OptionGroup2(count=3, size=None)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71125871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档