一个可选参数,不需要位置参数

时间:2011-07-30 00:03:25

标签: 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('--list-methods', help="list available methods", action="store_true")

正常的命令行是test.py 47.249 -33.282test.py 47.249 -33.282 --method sub。但是,只要我使用test.py --list-methods调用脚本列出所有可用方法,我就会得到error: to few arguments。如何使用argparse来获得这个可选参数(--list-methods)而不需要位置参数(lat,lon)?

3 个答案:

答案 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)

通常latlon是必需的定位,但如果采取--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,因为需要latlon个参数。

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')

您应该latlon个参数可选。