我的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.0
,Python 2.7.10
这是一个错误还是我缺少明显的东西?这是一个非常完善的模块中的一项非常基本的功能...
注意:此功能已明确记录在https://docs.python.org/3/library/argparse.html
中如果缩写是明确的(前缀与唯一选项匹配),则允许将长选项缩写为前缀。
答案 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
取第二个值。