如何解析位置参数与主要使用argparse减号(负数)(How to parse positiona

2019-07-19 06:13发布

我想解析包含逗号分隔的整数列表所需的,位置参数。 如果第一个整数包含前导减号(“ - ”)的标志,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为有效参数?

Answer 1:

你需要插入--到您的命令行参数:

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

双破折号停止argparse寻找更多的可选开关; 这正好为处理命令行工具,该用例的事实标准方式。



Answer 2:

从文档 :

该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']    

这样做的缺点是帮助文本会少一些信息。



文章来源: How to parse positional arguments with leading minus sign (negative numbers) using argparse