我想以各种方式传递参数,例如:
python abc.py 1 2
python abc.py -d 3
python abc.py -c 6
我尝试过使用子解析器,但我可以用
python abc.py def 1 2
python abc.py spec -d 3
python abc.py spec -c 6
这可能吗?
我认为你不需要子解析器。像这样的东西应该没问题:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-d', type=int, nargs='?')
parser.add_argument('-c', type=int, nargs='?')
parser.add_argument('args', type=int, nargs='*')
print(parser.parse_args())
这导致:
$python3 test_argparse.py 1 2
Namespace(args=[1, 2], c=None, d=None)
$python3 test_argparse.py -d 3
Namespace(args=[], c=None, d=3)
$python3 test_argparse.py -c 6
Namespace(args=[], c=6, d=None)
如果希望选项互斥,argparse
提供一个互斥组。不幸的是,位置始终被认为是必需的,因此如果您不希望用户在指定给定选项时使用它们,则必须手动检查它们(但是我相信在这种情况下,您的命令界面不好)。
在argparse.add_argument
中,您可以提供参数文本,而不是字符串,而是字符串列表,因此具有相同参数的多种形式。仔细浏览 argparse 文档 - 这个模块可以做你需要的一切。
一个具有两个类型为 int
的optionals
的解析器,以及一个带有 nargs='*‘
的positional
,将接受您的 3 个输入。您对输入还有其他限制吗?