1. ホーム
  2. python

[解決済み] AttributeError: 'str' オブジェクトには 'get' 属性がありません。

2022-02-01 07:22:21

質問

解決方法がよくわからないエラーが発生しました。ネストされた辞書の最後のアイテムが尋ねられた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'}}

解決方法は?

もし 一部 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

これは 許しを請う 原則; あなたのエントリーのほとんどが .get() メソッドよりも単純に速いです。 よく見て という原則があり、そのメソッドが利用可能かどうかをテストすることになります。