出现错误我不太确定如何解决,有一个嵌套字典,其中最后一项不包含询问的get并给出错误,不确定如何修复它。
非常基本的代码呼叫
for keys in interfaces:
counters = interfaces[keys].get(u'interfaceCounters', {})
print keys, "inOctets:", counters.get(u'inOctets', {}), "outOctets:", counters.get(u'outOctets', {})
这是输出:
Management1 inOctets: 0 outOctets: 0
Ethernet2 inOctets: 561926946 outOctets: 49932066
Ethernet3 inOctets: 561926408 outOctets: 49932764
Ethernet1 inOctets: 319314970 outOctets: 264840242
Ethernet6 inOctets: 561897402 outOctets: 49930884
Ethernet7 inOctets: 561678430 outOctets: 50180896
Ethernet4 inOctets: 561927603 outOctets: 49931337
Ethernet5 inOctets: 561926383 outOctets: 49932935
Vlan1 inOctets:
Traceback (most recent call last):
File "ex1.py", line 36, in <module>
print keys, "inOctets:", counters.get(u'inOctets', '0'), "outOctets:", counters.get(u'outOctets', '0')
AttributeError: 'str' object has no attribute 'get'
接下来是接口的尾端:
u'Management1': {u'autoNegotiate': u'off',
u'bandwidth': 1000000000,
u'burnedInAddress': u'52:54:00:01:02:d3',
u'description': u'',
u'duplex': u'duplexFull',
u'forwardingModel': u'routed',
u'hardware': u'ethernet',
u'interfaceAddress': [],
u'interfaceCounters': {u'inBroadcastPkts': 0,
u'inDiscards': 0,
u'inMulticastPkts': 0,
u'inOctets': 0,
u'inUcastPkts': 0,
u'inputErrorsDetail': {u'alignmentErrors': 0,
u'fcsErrors': 0,
u'giantFrames': 0,
u'runtFrames': 0,
u'rxPause': 0,
u'symbolErrors': 0},
u'linkStatusChanges': 2,
u'outBroadcastPkts': 0,
u'outDiscards': 0,
u'outMulticastPkts': 0,
u'outOctets': 0,
u'outUcastPkts': 0,
u'outputErrorsDetail': {u'collisions': 0,
u'deferredTransmissions': 0,
u'lateCollisions': 0,
u'txPause': 0},
u'totalInErrors': 0,
u'totalOutErrors': 0},
u'interfaceStatistics': {u'inBitsRate': 0.0,
u'inPktsRate': 0.0,
u'outBitsRate': 0.0,
u'outPktsRate': 0.0,
u'updateInterval': 300.0},
u'interfaceStatus': u'disabled',
u'lastStatusChangeTimestamp': 1245724638.6762877,
u'lineProtocolStatus': u'down',
u'mtu': 1500,
u'name': u'Management1',
u'physicalAddress': u'52:54:00:01:02:d3'},
u'Vlan1': {u'bandwidth': 0,
u'burnedInAddress': u'52:54:00:01:37:37',
u'description': u'',
u'forwardingModel': u'routed',
u'hardware': u'vlan',
u'interfaceAddress': [{u'broadcastAddress': u'255.255.255.255',
u'primaryIp': {u'address': u'10.220.88.31',
u'maskLen': 24},
u'secondaryIps': {}}],
u'interfaceStatus': u'connected',
u'lastStatusChangeTimestamp': 1250568992.891673,
u'lineProtocolStatus': u'up',
u'mtu': 1500,
u'name': u'Vlan1',
u'physicalAddress': u'52:54:00:01:37:37'}}
答案 0 :(得分:2)
如果某些的interfaceCounters
键引用字符串而不是嵌套字典,只需使用异常处理来忽略这些:
for keys in interfaces:
counters = interfaces[keys].get(u'interfaceCounters', {})
try:
print keys, "inOctets:", counters.get(u'inOctets', {}), "outOctets:", counters.get(u'outOctets', {})
except AttributeError:
# counters is not a dictionary, ignore and move on
pass
这是 ask forgiveness 原则;如果你的大多数条目都有.get()
方法,那么这比你跳过原则之前的看起来要快,在那里测试方法是否可用。
答案 1 :(得分:1)
如何简单地检查您的字典值是否确实提供了您需要的方法/属性?
for keys in interfaces:
counters = interfaces[keys].get(u'interfaceCounters', {})
if hasattr(counters, 'get'):
# Only print if counters supports `get`
print keys, "inOctets:", counters.get(u'inOctets', {}), "outOctets:", counters.get(u'outOctets', {})