从配置文件读取的argparse命令行args的默认值。

argparse_config的Python项目详细描述


argparse_config实用程序从 配置文件。最可爱的是,它能计算出预期的配置选项 基于您的argparse命令行参数定义。

假设我正在重新实现Mercurial命令行客户端。我指定 使用argparse处理命令行参数,当然:

>>> arg_parser = ArgumentParser('hg')
>>> arg_parser.add_argument('--repository')
>>> sub_parsers = arg_parser.add_subparsers()
>>>
>>> merge_parser = sub_parsers.add_parser('merge')
>>> merge_parser.add_argument('--tool')
>>> merge_parser.add_argument('--force', action='store_true', default=False)
>>>
>>> commit_parser = sub_parsers.add_parser('commit')
>>> commit_parser.add_argument('--user')
>>> commit_parser.add_argument('--message')

但是,当我要使用这个客户机时,我必须继续指定我的--user 每次提交,每次合并--tool。太糟糕了!我想要的是 要让我的客户了解简单的配置文件格式:

[merge]
tool: meld

[commit]
user: Tikitu de Jager <tikitu@logophile.org>

显然,当我向我的客户机添加更多的参数和子命令时,它应该 允许我在配置文件中添加默认值,而不必编写更多代码。

这就是argparse_config给你的。与Mercurial客户机一起使用 arg_parser以上:

>>> import argparse_config
>>> argparse_config.read_config_file(arg_parser, '/home/tikitu/.my_hg.cfg')

…就这样。调用arg_parser.parse_args()将一如既往地解析参数, 但是default值将从配置文件中获取,如果给定 那里:

>>> parsed_args = arg_parser.parse_args(['merge'])
>>> parsed_args.tool
'meld'

我可以在配置文件中放入什么?

在引擎盖下argparse_config使用标准库ConfigParser。 不用于子命令的参数进入[default]部分。这个 从命令行参数中删除名称,删除前导破折号和 将内部虚线转换为下划线(例如--log-level变为 log_level:)。

如果存在标志(即不带参数的命令行参数),则会打开 在配置中,就像命令行一样:

[default]
verbose

相当于--verboseverbose:verbose都可以, 但是(小心!)verbose: a-valueverbose没有任何不同。

从一些命令行参数中写入配置文件

包中包含一个实用程序,用于生成以下配置文件 规则,来自给定的命令行参数集。使用它的简单方法是 让它向args解析添加一个命令:

>>> config_parser = get_config_parser('/home/tikitu/.my_hg.cfg')
>>> add_config_block_subcommand(arg_parser, sub_parsers, config_parser=config_parser)

在命令行中使用它:

$ hg.py config default --repository ssh://hg@bitbucket.org/tikitu/argparse_config > new_config.rc
$ hg.py config commit --username 'Tikitu de Jager <tikitu@logophile.org>' >> new_config.rc
$ cat new_config.rc
[default]
repository: ssh://hg@bitbucket.org/tikitu/argparse_config
[commit]
username: Tikitu de Jager <tikitu@logophile.org>

如果你喜欢的话,你也可以用编程的方式使用它。看起来是这样:

>>> parsed_args = arg_parser.parse_args(['--repository', 'https://bitbucket.org/tikitu/argparse_config', 'merge'])
>>> print argparse_config.generate_config(arg_parser, parsed_args, section='default', only_non_defaults=True)
[default]
repository: https://bitbucket.org/tikitu/argparse_config

不幸的是,一些复杂的情况使这一功能变得不那么有用:

  • 如果使用子命令,则一次只能解析其中一个子命令的参数 (使用section参数指定哪个,或者不使用它来获取 [default]节)。
  • 我们无法区分用代码编写的默认值之间的差异(应该 不添加到配置文件)并写入以前读取的配置文件 (应该)。这就是为什么存在{TT20}$的原因。

它是如何工作的?

argparse的私有内部徘徊。是的,那不是 很漂亮。

有问题

配置文件中存在的任何必需参数都将显示为可选参数, 不需要,在--help输出中。(这是一个设计缺陷,因为 对如何做得更好有任何聪明的想法。)这可能有助于说明 你自己,“命令行上不需要,因为我在 配置文件“”(如果我 找出如何更整洁地处理所需参数。)

黑客攻击

BitBucket上。尽情玩耍吧。它附带一个方便的zc.buildout 包装纸也是,虽然这显然是过度杀戮。

待办事项

目前它是“alpha软件”;可能是bug,很多东西都不是 还没有。检查issues list以保持最新。还有一些未解决的问题:

  • 如何处理多值参数?(此内置的配置文件库不支持它们。)
  • “给我写一个配置文件”的支持是有争议的。我们能做得更好吗?

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

推荐PyPI第三方库


热门话题
java生成缺少的Bpmn图元素   Java为什么这段代码会重复?非接触性异常?   java如何在OpenIMAJ中使用自定义字体   java我可以使用process builder合并两个不同的进程吗?   java Lwjgl 3D多维数据集透明度问题   java通过JSP显示BLOB(图像)   java如何更改JTextArea中的文本颜色?   当HTML标记与JButton/JLabel一起使用时,java会丢失字体   JavaHK2:使用立即作用域绑定到接口的实现   java如何在struts2中从底层bean生成表单显示数据?   为REST控制器调用两次java Spring安全自定义筛选器   java为什么netty有自己的ConcurrentHashMap?   java ImageMagick:转换管道图像   java我的选择算法有什么问题?   java聚合要列出的HQL结果   java将几个单独的文件导入eclipse项目   java Load Unpacket扩展在developer中被禁用