从 Python 3.3 开始,根据所需的操作集parse_args
检查其集合seen_actions
,并根据需要发出the following arguments are required...
错误。以前它会检查其剩余列表positionals
并引发too few arguments
错误消息。
所以对于较新的版本,这个片段应该做你想要的:
parser = argparse.ArgumentParser()
lat=parser.add_argument('lat', help="latitude")
lon=parser.add_argument('lon', help="longitude")
parser.add_argument('--method', help="calculation method (default: add)", default="add")
class MyAction(argparse._StoreTrueAction):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, self.const)
lat.required = False
lon.required = False
parser.add_argument('--list-methods', help="list available methods", action=MyAction)
通常lat
和lon
是必需的位置,但如果--list...
采取行动,则不再需要这些行动,并且如果它们缺失,则不会引发错误消息。
自定义 argparse 的另一种方法是使用多个解析器。在这种情况下,您可以使用一个解析器来检查--list-methods
选项,并根据它获得的内容,调用另一个查找位置的解析器。
parser1 = argparse.ArgumentParser(add_help=False)
parser1.add_argument('--list-methods', help="list available methods", action='store_true')
parser2 = argparse.ArgumentParser()
parser2.add_argument('lat', help="latitude")
parser2.add_argument('lon', help="longitude")
parser2.add_argument('--method', help="calculation method (default: add)", default="add")
parser2.add_argument('--list-methods', help="list available methods", action='store_true')
def foo(argv):
args,rest = parser1.parse_known_args(argv)
if not args.list_methods:
args = parser2.parse_args(argv)
return args
parser2
响应帮助命令。 parse_known_args
解析它可以解析的内容,并在列表中返回其余部分。 parser2
也可以写成rest, args
作为论据。