Argparse 传递常量和变量

Argparse passing constants and variables

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

我 运行 遇到的问题是试图让常量和变量通过 add_argument()

示例:

./SNMP.py -j 10 20 -l

-j 将存储 str ".1.5.5.8" 之后的参数将绕过 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()
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:[=25=,则在解析后自行添加默认值]

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