跳转到主要内容

将额外元数据集成到 attr.ib()

项目描述

PyPI version supported Python versions Travis build status source on GitHub

将额外元数据集成到 attr.ib()

示例

希望以后能提供更好的示例,但现在,这里有一样东西。

一个在 #python 中的开发者对通过 click 构建attrs定义的配置对象感兴趣。这是针对此问题的一个基本解决方案,其中click选项通过自定义exttr关键字参数click=在attrs类的属性中定义。

import collections
import sys

import attr
import click
import exttr


exttr.register_keywords(
    exttr.Keyword(name='click'),
)


@attr.s
class Configuration:
    foo = exttr.ib(click=click.option('--red'))


def main(configuration):
    print(configuration)

def clicked_fields(cls):
    fields = collections.OrderedDict()

    for field in attr.fields(cls):
        decorator = exttr.get(cls, field.name, 'click')

        if decorator is None:
            continue

        fields[field.name] = decorator

    return fields


def build_click(f, cls, command_or_group):
    fields = clicked_fields(cls)

    def cli(*args, **kwargs):
        configuration = cls(*args, **kwargs)

        return f(configuration)

    for name, decorator in reversed(fields.items()):
        before = getattr(cli, '__click_params__', [])

        cli = decorator(cli)

        after = getattr(cli, '__click_params__', [])
        new = after[len(before):]

        if len(new) == 1:
            new, = new
            new.name = name

    return command_or_group(cli)


click_main = build_click(
    f=main,
    cls=Configuration,
    command_or_group=click.command(),
)


sys.argv[1:] = ['--red', 'burgundy']
try:
    click_main()
except SystemExit:
    pass

输出

Configuration(foo='burgundy')

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

exttr-2019.2.2.tar.gz (20.7 kB 查看散列)

上传于 源代码

构建发行版

exttr-2019.2.2-py3-none-any.whl (6.6 kB 查看哈希值)

上传于 Python 3

由以下支持