argparse 必需参数列表与可选参数列表竞争

Posted

技术标签:

【中文标题】argparse 必需参数列表与可选参数列表竞争【英文标题】:argparse required argument list competes with optional argument list 【发布时间】:2022-01-09 22:42:15 【问题描述】:

我有一个带有 argparse 的 Python 程序。必需参数是文件名列表,可选参数是要从所有文件中删除的字符串列表。

import argparse

parser = argparse.ArgumentParser("File formatter")
parser.add_argument("filename", type=str, nargs="+")

parser.add_argument("-r", "--remove", metavar="STRING", nargs="+")

args = parser.parse_args()
print(args.filename)
print(args.remove)

以上给出

usage: filefmt [-h] [-r STRING [STRING ...]] filename [filename ...]

问题:在类似的电话中

filefmt -r str1x gg24 a.txt b.dat

程序无法知道哪些参数是删除STRING,哪些是filename。我必须这样称呼它

filefmt a.txt b.dat -r str1x gg24

但有时,环境要求我将文件名放在最后。

知道如何解决这个问题吗?我想避免在文件名前加上选项字符串,这是默认用法:

filefmt a.txt b.txt

【问题讨论】:

每个字符串都需要 -r 【参考方案1】:

要解决歧义,您必须要求每个字符串都使用 -r 选项

例如:

import argparse

parser = argparse.ArgumentParser("File formatter")
parser.add_argument("filename", type=str, nargs="+")

parser.add_argument("-r", "--remove", metavar="STRING", default=[], action='append', help='string to remove (repeat this option for each string)')

args = parser.parse_args()
print(args.filename)
print(args.remove)

像这样运行:

args1.py -r a -r b qwe asd zcx

输出:

['qwe', 'asd', 'zcx']
['a', 'b']

用法没有显示您可以重复 -r,所以我在 -r 的帮助中添加了这一点:

usage: File formatter [-h] [-r STRING] filename [filename ...]

positional arguments:
  filename

optional arguments:
  -h, --help            show this help message and exit
  -r STRING, --remove STRING
                        string to remove (repeat this option for each string)

【讨论】:

以上是关于argparse 必需参数列表与可选参数列表竞争的主要内容,如果未能解决你的问题,请参考以下文章

Dart 知识点:可选参数必需参数

使用不需要指定输出文件名的可选参数运行 argparse

Argparse:制作所需的标志

argparse:如何允许带有 nargs="*" 和选项的空列表

如何让 argparse 识别跟随可变长度可选参数的位置参数?

Python 2.7 argparse:如何正确嵌套可选的互斥参数?