yaml配置文件->命令行界面

quickargs的Python项目详细描述


快速参数

获取一个yaml配置文件并为命令行参数构建一个解析器 在它周围。这允许您通过 向程序传递命令行参数。支持嵌套 参数和自动强制参数类型。

此配置文件…

input_dir:datalogging:file:output.loglevel:4

…连同这个main.py…

importyamlimportquickargswithopen("config.yaml")asf:config=yaml.load(f,Loader=quickargs.YAMLArgsLoader)

…将给您这个命令行界面

usage: main.py [-h] [--input_dir INPUT_DIR] [--logging.file LOGGING.FILE]
               [--logging.level LOGGING.LEVEL]

optional arguments:
  -h, --help            show this help message and exit
  --input_dir INPUT_DIR
                        default: data
  --logging.file LOGGING.FILE
                        default: output.log
  --logging.level LOGGING.LEVEL
                        default: 4

使用命令行覆盖设置

python main.py --logging.file=other_log.txt

您可以在一个方便的字典中获得合并的yaml+命令行参数

# exact same output format as normal yaml.load would produce
{'input_dir': 'data', 'logging': {'file': 'other_log.txt', 'level': 4}}

yaml文件中使用的类型将自动强制执行

将日志级别设置为字符串而不是int:python main.py --logging.level=WARNING

usage: main.py [-h] [--input_dir INPUT_DIR] [--logging.file LOGGING.FILE]
               [--logging.level LOGGING.LEVEL]
main.py: error: argument --logging.level: invalid int value: 'WARNING'

将日志级别设置为正确的类型:python main.py --logging.level=0

{'input_dir': 'data', 'logging': {'file': 'output.log', 'level': 0}}

安装

pip install quickargs

用法

加载yaml config并分析命令行参数

main.py

importyamlimportquickargswithopen("config.yaml")asf:config=yaml.load(f,Loader=quickargs.YAMLArgsLoader)

深度嵌套的参数没有问题

配置yaml

key1:key2:key3:key4:value

使用点符号重写嵌套参数:python main.py --key1.key2.key3.key4=other_value

{'key1': {'key2': {'key3': {'key4': 'other_value'}}}}

当然,不需要任何命令行参数就可以调用程序

满意配置文件中的默认值:python main.py

{'key1': {'key2': {'key3': {'key4': 'value'}}}}

支持大多数yaml类型,包括序列

配置yaml

thresholds:[0.2,0.4,0.6,0.8,1.0]

覆盖阈值:python main.py --thresholds='[0.0, 0.5, 1.0]'

(如果命令行参数包含 空格)

{'thresholds': [0.0, 0.5, 1.0]}

但是,序列中的类型不强制

配置yaml

thresholds:[0.2,0.4,0.6,0.8,1.0]

字符串列表而不是浮动列表不会给出错误:python main.py --thresholds=[a,b,c]

{'thresholds': ['a', 'b', 'c']}

您甚至可以将引用传递给函数或类(您自己的或内置的)

配置yaml

function_to_call:!!python/name:yaml.dump

引用内置zip函数重写:python main.py --function_to_call=zip

{'function_to_call': <built-in function zip>}

所有支持类型的示例

配置yaml

an_int:3a_float:3.0a_bool:Truea_complex_number:37-880ja_date:2016-12-11sequences:a_list:[a,b,c]# for tuples you need to use square [] brackeds in the yaml and on the command line# they will still be proper tuples in the resulta_tuple:!!python/tuple[a,b]python:a_function:!!python/name:yaml.loada_class:!!python/name:yaml.loader.Loadera_module:!!python/module:contextlib# can be overwritten with any typea_none:!!python/none

覆盖配置文件中的每个参数

python main.py --an_int=4 --a_float=2.0 --a_bool=False --a_complex_number=42-111j --a_date=2017-01-01 \
               --sequences.a_list=[c,b,c] --sequences.a_tuple=[b,a] --python.a_function=zip \
               --python.a_class=yaml.parser.Parser --python.a_module=yaml --python.a_none=1234
{'a_bool': False,
 'a_complex_number': '42-111j',
 'a_date': datetime.date(2017, 1, 1),
 'a_float': 2.0,
 'an_int': 4,
 'python': {'a_class': <class 'yaml.parser.Parser'>,
            'a_function': <built-in function zip>,
            'a_module': <module 'yaml' from ...>,
            'a_none': None},
 'sequences': {'a_list': ['c', 'b', 'c'], 'a_tuple': ('b', 'a')}}

当前不支持

类型

完全不支持以下类型:

  • 啊!!python/dict(因为它看起来与yaml文件的其余部分一样)
  • 啊!!对

以下类型未被强制/对象将不会被实例化:

  • 啊!!python/对象
  • 啊!!python/object/new
  • 啊!!python/object/apply

多文档加载

如果yaml文件包含多个文档,则只有第一个文档 将被考虑。yaml.load_all功能不是 支持。

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

推荐PyPI第三方库


热门话题
如何在不使用java安装outlook的情况下以编程方式创建pst文件?   如何在java中比较泛型方法中的数组?   JavaFXHTML节点元素   java H2数据库要降低的连接设置无效(2019)   安卓 hilt中的java依赖循环   java这个结构什么时候有意义?   带有模式和匹配器的Java正则表达式   来自类变量的java JNI jstring?   尝试从socket读取时发生java非法阻止模式异常   绑定中使用Moxy的java接口映射。xml不能使用多个接口?   java如何仅静音来电铃声而不静音短信   下载时,java无法获取音频进度条   java SavedIntanceState。getBoolean()使我的应用程序崩溃(我想)   java图像的永久位置?   mysql Java:将多个独立脚本重构为一个脚本   在Windows上以Java访问iTunes歌词数据   java改进BaseUrl和API   为什么有必要在OSGi security中为java security manager授予所有权限