可选参数列表之后的位置参数

时间:2019-06-27 18:02:54

标签: python arguments argparse

我对使用argparse有点陌生,并且由于使用可选参数(任意长的文件列表)和位置参数(单个文件)而遇到问题。这是一个演示此问题的简单程序:

parser = argparse.ArgumentParser()
parser.add_argument("pos_file", help="Input file")
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-l", "--optional_list", help="file list", nargs="+")
args = parser.parse_args()

当我使用以下命令调用该程序时:

python test_arg_parse.py -l file1.txt file2.txt pos_file.txt

Argparse失败,提到参数太少。我知道为什么会发生这种情况-argparse假定pos_file.txt是可选列表的一部分,因此找不到位置参数-但我不明白为什么argparse并不总是将最后一个参数视为位置参数。这可以通过将详细参数放在可选列表和位置参数之间来解决:

python test_arg_parse.py -l file1.txt file2.txt -v pos_file.txt

哪个argparse愉快地处理。但是,我不想强​​制执行这种严格的参数排序,并且我希望保留列表的可选位置和单个文件的位置。我已经研究过使用append功能,但是考虑到列表可以任意长,这似乎并不合理。

是否有一种很好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

解析是由命令行中的值顺序决定的,首先确定哪些字符串看起来像标志(可选),哪些只是参数。

python test_arg_parse.py -l file1.txt file2.txt pos_file.txt

它首先检查列表的开头是否有位置参数-无。然后对于标志-它找到'-l'。这需要'+',因此它会赋予所有内容,直到下一个标志(或末尾)为止。现在,“ pos_file”列表上没有任何内容了。

有一个关于此的错误/问题,我提出了一个补丁,该补丁可以检查位置,并保留所有可选内容。但这需要过多地摆弄核心解析代码,并且在批准过程中还没有走得很远。

因此,目前,在无限制参数(可选或位置)之后使用像这样的位置

python test_arg_parse.py pos_file.txt -l file1.txt file2.txt

应该工作。但是,如果您想要更多控制权,请将pos_file定义为带标记的参数,而不是位置参数。