Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个不需要位置参数的可选参数_Python_Argparse - Fatal编程技术网

Python 一个不需要位置参数的可选参数

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

关于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 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--列出方法
在这里列出方法

$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
,看起来很多参数都是必需的。为什么不为可选参数设置nave
nargs='?'
呢?我对流程和副作用有点不感兴趣,所以我建议使用包装器:``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