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

argparse required argument list competes with optional argument list

我有一个带有 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

要解决歧义,您必须要求为每个 STRING 使用 -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)