Python 一个不需要位置参数的可选参数
关于python的argparse,我有一个问题:是否可以有一个不需要位置参数的可选参数 例如:Python 一个不需要位置参数的可选参数,python,argparse,Python,Argparse,关于python的argparse,我有一个问题:是否可以有一个不需要位置参数的可选参数 例如: parser.add_argument('lat', help="latitude") parser.add_argument('lon', help="longitude") parser.add_argument('--method', help="calculation method (default: add)", default="add") parser.add_argument('--
parser.add_argument('lat', help="latitude")
parser.add_argument('lon', help="longitude")
parser.add_argument('--method', help="calculation method (default: add)", default="add")
parser.add_argument('--list-methods', help="list available methods", action="store_true")
正常的命令行是
test.py 47.249-33.282
或test.py 47.249-33.282--method sub
。但是,只要我用test.py--list methods
调用脚本来列出所有可用的方法,我就会得到error:to now arguments
。我如何使用argparse来拥有这个可选的参数(--list方法),而没有位置参数(lat,lon)?您会得到错误:只有很少的参数
,因为lat
和lon
参数是必需的
In [10]: parser.parse_args('--list-methods'.split())
ipython: error: too few arguments
但是
您应该将lat
和lon
参数设置为可选。- 为位置参数设置一个默认值和
nargs='?'
- 当您不在列表方法模式下时,请在代码中手动检查纬度和经度是否都已设置
在这里列出方法 $test.py 4
test.py:错误:参数太少 test.py 4.5
正常脚本执行
从Python 3.3开始,
parse_args
根据所需的操作集检查其seen_操作集,并根据需要发出以下参数是必需的…
错误。之前,它检查了剩余的位置列表
,并发出参数太少
错误消息
因此,对于较新版本,此代码段应满足您的要求:
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
作为参数。您可以将default=None添加到lat和lon中,然后检查代码中是否存在任何参数……因为您没有设置nargs
,看起来很多参数都是必需的。为什么不为可选参数设置navenargs='?'
呢?我对流程和副作用有点不感兴趣,所以我建议使用包装器:``def positional\u discarder(args\u to\u discard):类discardpositioninput(argparse.Action):def\u调用(self,parser,namespace,value,option\u string=None):setattr(namespace,self.dest,values)for args中的arg_to_discard:arg.required=False返回DiscardPositionInput````然后解析器。添加参数('--list methods',help=“list available methods”,action=positional_discarder([lat,long])
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)
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