flagpole是一个flag-arg解析器,用于构建具有可选键的字典。

flagpole的Python项目详细描述


旗杆

标记arg parser以生成具有可选键的字典。

Version

Build Status

Coverage Status

Code style: black

安装:

pip install flagpole

用法:

flagpole在cloudaux中用于允许cloudaux用户指定库如何构建项。

旗杆有两类:FlagsFlagRegistry

标志

fromflagpoleimportFlagsFLAGS=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))# 000print("{0:b}".format(FLAGS.ALL).zfill(3))# 111print("{0:b}".format(FLAGS.BASE).zfill(3))# 001print("{0:b}".format(FLAGS.LISTENERS).zfill(3))# 010print("{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

标志注册表

注册表有两部分:

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

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

标记注册表装饰符:

decorator用于包装方法,以指示哪个flag将导致调用该方法,是否有任何其他标志是dependency,以及返回值应放在哪个key下。

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

decorator具有以下关键字参数:

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

标记注册表生成:

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

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

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

Flags加上递归跟踪依赖链的能力,在很大程度上是这个包的优点。此包还将检测修饰方法中的任何循环depenency,并引发适当的异常。

完整示例:

fromflagpoleimportFlagRegistry,Flagsfromcloudaux.aws.elbv2importdescribe_listenersfromcloudaux.aws.elbv2importdescribe_rulesregistry=FlagRegistry()FLAGS=Flags('BASE','LISTENERS','RULES')@registry.register(flag=FLAGS.LISTENERS,key='listeners')defget_listeners(alb,**conn):returndescribe_listeners(load_balancer_arn=alb['Arn'],**conn)@registry.register(flag=FLAGS.RULES,depends_on=FLAGS.LISTENERS,key='rules')defget_rules(alb,**conn):rules=list()forlistenerinalb['listeners']:rules.append(describe_rules(listener_arn=listener['ListenerArn'],**conn))returnrules# key is not specified here, so the return value is merged (`dict.update(other_dict)`) with the result dictionary.@registry.register(flag=FLAGS.BASE)defget_base(alb,**conn):return{'region':conn.get('region'),'_version':1}

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

defget_elbv2(alb_arn,flags=FLAGS.ALL,**conn):alb=dict(Arn=alb_arn)registry.build_out(flags,start_with=alb,pass_datastructure=True,**conn)returnresult

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

对于这个例子,当使用FLAGS.ALL调用时,结果将是结构如下的词典:

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

FlagRegistry class完全记录了它的使用。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如果SQL server执行计划是流式传输数据,那么调用next()时Java ResultSet对象将如何反应?   java为什么水平滚动条永远不会出现在JTable上?   java如何在Android项目中添加SDK模块   绿脚:爪哇。lang.ClassCastException:无法将障碍物投射到球投射物   xslt需要在Java1.4.2中使用SaxonB(版本9.1.0.8)方面的帮助   java Apache HTTP客户端下载SOAP响应的一部分   为Java 9计划的“过滤传入序列化数据”解决了数据反序列化安全漏洞吗?   java如何使用drools对列表中的元素进行分组   java从匿名类到lambda表达式   Java中是否有不可变的单链表实现?   java动态添加按钮以滚动查看安卓   java GAE:无法为模块http请求设置管理员登录凭据   java如何在Hibernate 5 CriteriaBuilder中使用条件条件获取计数   java如何将JSON+HAL响应解析为POJO   java如何获取计算器程序,对两个以上的数字进行加、减、乘、除   java Thymeleaf+静态资源+@ResponseBody