Flagpole是一个Flag参数解析器,用于构建带有可选键的字典。
项目描述
flagpole
带有可选键的字典构建参数解析器。
安装
pip install flagpole
用法
Flagpole 在 cloudaux 中使用,允许 cloudaux 的用户指定库如何构建项目。
Flagpole 有两个类:Flags
和 FlagRegistry
。
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.ALL
和 FLAGS.None
是自动添加的。其他所有标志必须在构造函数中添加。
注意:由于我们发现大小写是用户常见的错误,因此提供了 NONE
和 None
。
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 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 637e93e09b812aae4ebd42f563bd520f9681cb1baec2a47bc64cd968be4f981d |
|
MD5 | 35d3faf2c45e7fd65c69bd010fbcc34f |
|
BLAKE2b-256 | d0b828558abde18268f099d182ff87cfc8ad3481391bb82477ca02031a78d831 |
flagpole-1.1.1-py2.py3-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | e9f393f496b91380de6a23ddd7cc3993e3855da0bc5aa31fc12c427dc3f97f47 |
|
MD5 | ee7bbcebce45a3b42f96e4ed9f2072ff |
|
BLAKE2b-256 | 74d8d1eb419808c4f4582304ee03f3101834c208187e2771c8cf0a4eb3e86d8f |