首页 > 解决方案 > ConfigArgParse 忽略缩写选项?

问题描述

我的 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

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

标签: pythonconfigurationargparse

解决方案


它看起来像ConfigArgParse. 当它从配置文件加载选项时,它会丢弃命令行中已经存在的任何选项。

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取第二个值。


推荐阅读