4

我有一个关于 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.282or test.py 47.249 -33.282 --method sub。但是,一旦我调用脚本test.py --list-methods来列出所有可用的方法,我就会得到error: to few arguments. 如何在没有位置参数(lat、lon)的情况下使用 argparse 来拥有这个可选参数(--list-methods)?

4

3 回答 3

4
  • 设置默认值并nargs='?'为您的位置参数
  • 当您不在列表方法模式下时,在您的代码中手动检查纬度经度是否已设置

    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
正常脚本执行

于 2011-09-20T12:59:59.370 回答
2

从 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...采取行动,则不再需要这些行动,并且如果它们缺失,则不会引发错误消息。


自定义 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作为论据。

于 2013-07-27T07:06:16.450 回答
-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参数可选。

于 2011-07-30T14:19:14.337 回答