如何使用argparse解析带前导减号(负数)的位置参数



我想解析一个必需的位置参数,该参数包含一个逗号分隔的整数列表。如果第一个整数包含前导减号('-'),argparse会抱怨:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-t', '--test', action='store_true')
opts = parser.parse_args()
print opts
$ python example.py --test 1,2,3,4
Namespace(positional='1,2,3,4', test=True)
$ python example.py --test -1,2,3,4
usage: example.py [-h] [-t] positional
example.py: error: too few arguments
$ python example.py --test "-1,2,3,4"
usage: example.py [-h] [-t] positional
example.py: error: too few arguments

我看到有人建议使用除-之外的其他字符作为标志字符,但我不愿意这样做。是否有其他方法可以配置argparse以允许--test-1,2,3,4都作为有效参数?

您需要在命令行参数中插入一个--

$ python example.py --test -- -1,2,3,4
Namespace(positional='-1,2,3,4', test=True)

双破折号停止argparse查找更多可选开关;这是命令行工具处理这个用例的实际标准方式。

来自文档:

parse_args()方法尝试在用户显然犯了一个错误,但有些情况本质上是模棱两可的。例如,命令行参数-1可以是一个尝试指定一个选项或尝试提供一个位置参数。parse_args()方法在这里很谨慎:位置参数可能只从-如果它们看起来像负数,并且没有语法分析器中看起来像负数的选项:

由于-1,2,3,4看起来不像负数,所以必须像大多数*nix系统中那样用--"转义"它。

另一种解决方案是使用nargs作为位置,并以空格分隔的形式传递数字:

#test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional', nargs='*') #'+' for one or more numbers
print parser.parse_args()

输出:

$ python test.py -1 2 3 -4 5 6
Namespace(positional=['-1', '2', '3', '-4', '5', '6'])

获得所需内容的第三种方法是使用parse_known_args而不是parse_args。您不将位置参数添加到解析器中,而是手动解析:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--test', action='store_true')
parsed, args = parser.parse_known_args()
print parsed
print args

结果:

$ python test.py  --test -1,2,3,4                                            
Namespace(test=True)
['-1,2,3,4']    

这样做的缺点是帮助文本的信息量较小。

我在另一篇文章中找到了这个,我想下次搜索如何解决这个问题时会更新它。

$ python example.py --test=-1,2,3,4

理论上应该有效,它对我来说是有效的,只需通过一个像这样的条目

$ python example.py --test=-1

相关内容

  • 没有找到相关文章

最新更新