从配置文件读取的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
相当于--verbose。verbose:或verbose都可以, 但是(小心!)verbose: a-value与verbose没有任何不同。
从一些命令行参数中写入配置文件
包中包含一个实用程序,用于生成以下配置文件 规则,来自给定的命令行参数集。使用它的简单方法是 让它向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以保持最新。还有一些未解决的问题:
- 如何处理多值参数?(此内置的配置文件库不支持它们。)
- “给我写一个配置文件”的支持是有争议的。我们能做得更好吗?