跳转到主要内容

Flagpole是一个Flag参数解析器,用于构建带有可选键的字典。

项目描述

flagpole

带有可选键的字典构建参数解析器。

Version

Build Status

Coverage Status

Code style: black

安装

pip install flagpole

用法

Flagpole 在 cloudaux 中使用,允许 cloudaux 的用户指定库如何构建项目。

Flagpole 有两个类:FlagsFlagRegistry

Flags

from flagpole import Flags

FLAGS = Flags('BASE', 'LISTENERS', 'RULES')
print(FLAGS)
# OrderedDict([('BASE', 1), ('LISTENERS', 2), ('RULES', 4), ('ALL', 7), ('None', 0), ('NONE', 0)])

print("{0:b}".format(FLAGS.None).zfill(3))
# 000
print("{0:b}".format(FLAGS.ALL).zfill(3))
# 111
print("{0:b}".format(FLAGS.BASE).zfill(3))
# 001
print("{0:b}".format(FLAGS.LISTENERS).zfill(3))
# 010
print("{0:b}".format(FLAGS.RULES).zfill(3))
# 100

# combine multiple flags (100 & 010 = 110):
print("{0:b}".format(FLAGS.RULES | FLAGS.LISTENERS).zfill(3))
# 110

FLAGS.ALLFLAGS.None 是自动添加的。其他所有标志必须在构造函数中添加。

注意:由于我们发现大小写是用户常见的错误,因此提供了 NONENone

FlagRegistry

注册表包含两部分

  • 装饰器 @registry.register(...)
  • 构建方法 registry.build_out(...)

FlagRegistry 专门用于构建具有任意数量可选字段的(Python 字典)数据结构。

FlagRegistry 装饰器

装饰器用于包装方法以指示哪个 标志 会触发方法的调用,是否有任何其他标志是 依赖项,以及返回值应该放在哪个 下。

支持包装具有多个返回值的方法。每个返回值都可以有单独的标志和键。

装饰器具有以下关键字参数

  • 标志:包装的方法只有在用与这里提供的标志匹配的标志调用 build_out 时才会被调用。
    • 可以是标志(如 FLAG.RULES),对于多个返回值,可以是列表或元组。请参阅 源代码 中的示例。
  • :包装函数的返回值将使用提供的键追加到结果字典中。此关键字参数是可选的。如果不提供,则将返回值与结果字典合并(dict.update(other_dict))。
    • 可以是字符串,对于多个返回值,可以是列表或元组。请参阅 源代码 中的示例。
  • depends_on:如果包装的方法必须在另一个包装的方法执行后才调用,您必须在此处放置该方法的 标志此关键字参数是可选的。如果提供,则应将依赖于该方法的函数的结果作为参数传递给此函数。

FlagRegistry build_out

registry.build_out(...) 方法接受以下参数

  • flags:用户提供的 FLAGS 组合。(例如 flags = FLAGS.CORS | FLAGS.WEBSITE
  • pass_datastructure:要将结果字典作为参数传递给每个装饰方法,请设置为 True。否则,只有在检测到依赖项时才会发送。
  • start_with:您可以传递一个字典供 build_out 修改。默认情况下,build_out 将创建一个新字典并返回它。
  • *args:传递给注册在 FlagRegistry 中的方法
  • **kwargs:传递给注册在 FlagRegistry 中的方法
  • 返回结果:通过组合所有执行方法的输出创建的字典。

build_out 方法执行所有具有与 build_out 中传递的标志匹配的标志的注册装饰方法。它将遵循任何依赖链以按正确顺序执行方法。

结合 Flags 和递归跟踪依赖链的能力,在很大程度上是该包的强大之处。该包还会检测任何装饰方法中的循环依赖项,并引发适当的异常。

完整示例

from flagpole import FlagRegistry, Flags
from cloudaux.aws.elbv2 import describe_listeners
from cloudaux.aws.elbv2 import describe_rules

registry = FlagRegistry()
FLAGS = Flags('BASE', 'LISTENERS', 'RULES')

@registry.register(flag=FLAGS.LISTENERS, key='listeners')
def get_listeners(alb, **conn):
    return describe_listeners(load_balancer_arn=alb['Arn'], **conn)

@registry.register(flag=FLAGS.RULES, depends_on=FLAGS.LISTENERS, key='rules')
def get_rules(alb, **conn):
    rules = list()
    for listener in alb['listeners']:
        rules.append(describe_rules(listener_arn=listener['ListenerArn'], **conn))
    return rules

# key is not specified here, so the return value is merged (`dict.update(other_dict)`) with the result dictionary.
@registry.register(flag=FLAGS.BASE)
def get_base(alb, **conn):
    return {
        'region': conn.get('region'),
        '_version': 1
    }

然后您可以像这样调用 registry.build_out()

def get_elbv2(alb_arn, flags=FLAGS.ALL, **conn):
    alb = dict(Arn=alb_arn)
    registry.build_out(flags, start_with=alb, pass_datastructure=True, **conn)
    return result

注意:您可以根据需要构建任何任意组合的标志,例如:flags=FLAGS.RULES | FLAGS.LISTENERS

此示例的返回结果,当使用 FLAGS.ALL 调用时,将是以下结构的字典

{
    'Arn': ...,
    'region': ...,
    'listeners': ['ListenerArn': ...],
    'rules': [...],
    '_version': ...,
}

FlagRegistry 类 完全记录了其使用。

项目详情


下载文件

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

源分布

flagpole-1.1.1.tar.gz (10.7 kB 查看散列值)

上传时间

构建分布

flagpole-1.1.1-py2.py3-none-any.whl (11.1 kB 查看散列值)

上传时间 Python 2 Python 3

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面