ConfigArgParse是否忽略缩写选项?

时间:2018-12-19 09:34:46

标签: python configuration argparse

我的config.ini:

banana=original_banana

如果我使用完整的参数名称运行,则会得到预期的结果:

python test_configargparse.py --banana new_banana
new_banana

如果我使用缩写参数名称(--ban而不是--banana)运行,则会出现意外行为:

python test_configargparse.py --ban new_banana 
original_banana

test_configargparse.py的代码

import os, configargparse as ap
parser = ap.ArgumentParser(default_config_files=["config.ini"])
parser.add_argument('--banana',dest='banana')
options = parser.parse_args()
print(options.banana)

版本= ConfigArgParse==0.13.0Python 2.7.10

这是一个错误还是我缺少明显的东西?这是一个非常完善的模块中的一项非常基本的功能...

注意:此功能已明确记录在https://docs.python.org/3/library/argparse.html

  

如果缩写是明确的(前缀与唯一选项匹配),则允许将长选项缩写为前缀。

1 个答案:

答案 0 :(得分:1)

这似乎是ConfigArgParse中的错误。从配置文件加载选项时,它会丢弃任何already on the command line的选项。

discard_this_key = already_on_command_line(
    args, action.option_strings)

错误是already_on_command_line()仅检查完整的参数名称,而不检查前缀。

def already_on_command_line(existing_args_list, potential_command_line_args):
    """Utility method for checking if any of the potential_command_line_args is
    already present in existing_args.
    """
    return any(potential_arg in existing_args_list
               for potential_arg in potential_command_line_args)

这会将参数的两个副本留在列表中,配置文件的值第二个。 ArgumentParser取第二个值。