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 必需参数列表与可选参数列表竞争的主要内容,如果未能解决你的问题,请参考以下文章
argparse:如何允许带有 nargs="*" 和选项的空列表