从 Python 3.3 开始,parse_args 会根据所需的操作集检查其 seen_actions 集,并根据需要发出 the following arguments are required... 错误。之前它检查了剩余的positionals 列表并引发了too few arguments 错误消息。
所以对于较新的版本,这个 sn-p 应该做你想做的:
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 作为参数。