我有一个关于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('--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 few arguments
。如何使用argparse来获得这个可选参数(--list-methods)而不需要位置参数(lat,lon)?
答案 0 :(得分:3)
nargs='?'
在您的代码中手动检查当您不在 list-methods 模式时,纬度和经度已设置
parser = argparse.ArgumentParser()
parser.add_argument('lat', help="latitude",default=None, nargs='?')
parser.add_argument('lon', help="longitude",default=None, nargs='?')
parser.add_argument('--method', help="calculation method (default: add)", default="add")
parser.add_argument('--list-methods', help="list available methods", action="store_true")
args = vars(parser.parse_args())
if not args['list_methods'] and (args['lat'] == None or args['lon'] == None):
print '%s: error: too few arguments' % sys.argv[0]
exit(0)
if args['list_methods']:
print 'list methods here'
else :
print 'normal script execution'
给出:
$ test.py --list-methods
列出方法$ test.py 4
test.py:错误:参数太少test.py 4 5
正常的脚本执行
答案 1 :(得分:1)
从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...
操作,则不再需要这些操作,如果丢失则不会引发错误消息。< / p>
自定义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
响应help命令。 parse_known_args
解析可能的内容,并将其余内容返回到列表中。 parser2
也可以写为rest, args
作为参数。
答案 2 :(得分:-1)
得到error: to few arguments
,因为需要lat
和lon
个参数。
In [10]: parser.parse_args('--list-methods'.split())
ipython: error: too few arguments
但
In [11]: parser.parse_args('--list-methods 10 20'.split())
Out[11]: Namespace(lat='10', list_methods=True, lon='20', method='add')
您应该lat
和lon
个参数可选。