传递常量和变量的{Argparse

时间:2017-01-11 15:57:19

标签: argparse

我正在尝试将argparse用于SNMP(Nagios)的可扩展解决方案。

我遇到的问题是尝试让常量和变量通过add_argument()传递

示例:

./ SNMP.py -j 10 20 -l <​​/ p>

-j会存储str&#34; .1.5.5.8&#34; 后面的参数将设置警告整数级别和绕过parser.add_argument()中设置的默认值的关键整数级别

-l将存储不同的OID str,但会使用存储在parser.add_argument()

中的默认警告和关键级别

谢谢!

简而言之,我必须解决这个难题:

parser = argparse.ArgumentParser(description = "This is used to parse latency, jitter, and packet loss on an HDX")

parser.add_argument("-j", action = 'append', dest = 'jitter',
 default = [".2.51.5.9.4","20 40"])

args = parser.parse_args()

warn, crit = args.jitter[-1].split()

1 个答案:

答案 0 :(得分:0)

In [16]: parser=argparse.ArgumentParser()
In [17]: parser.add_argument("-j", action = 'append', dest = 'jitter',
    ...:  default = [".2.51.5.9.4","20 40"])
Out[17]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=None, const=None, default=['.2.51.5.9.4', '20 40'], type=None, choices=None, help=None, metavar=None)

In [18]: parser.parse_args([])
Out[18]: Namespace(jitter=['.2.51.5.9.4', '20 40'])
In [19]: parser.parse_args(['-j','1'])
Out[19]: Namespace(jitter=['.2.51.5.9.4', '20 40', '1'])

因此append操作会将default放入命名空间,并将-j提供的任何值附加到该列表中。此外,还可以重复-j,添加更多值。

有些人认为这是一个错误,并且值应该附加到[],并且默认情况下只应显示-j根本不会使用。当前行为简单且可预测。

另一种方法是将默认设置保留为None[],并在解析args.jitterNone后自己添加默认值:

In [22]: parser.add_argument("-j", action = 'append', dest = 'jitter', nargs=2)
Out[22]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [23]: parser.parse_args([])
Out[23]: Namespace(jitter=None)
In [24]: parser.parse_args(['-j','20','40'])
Out[24]: Namespace(jitter=[['20', '40']])

所以测试会是这样的:

if args.jitter is None:
   args.jitter= [...]

我添加了nargs以显示附加的内容是一个子列表。

有关使用默认值附加的更多讨论,请参阅http://bugs.python.org/issue16399