Python AttributeError: 'str' 对象没有属性 'get'

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28807935/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 03:46:54  来源:igfitidea点击:

AttributeError: 'str' object has no attribute 'get'

python

提问by Wilken

Having an error I'm not quite sure how to solve, have a nested dictionary where the last item does not contain the asked get and gives an error, Not sure how to fix it.

有一个错误我不太确定如何解决,有一个嵌套字典,其中最后一项不包含所要求的 get 并给出错误,不知道如何修复它。

Very basic code calling on

非常基本的代码调用

  for keys in interfaces:
      counters = interfaces[keys].get(u'interfaceCounters', {})
      print keys, "inOctets:", counters.get(u'inOctets', {}), "outOctets:", counters.get(u'outOctets',  {})

Here is the output:

这是输出:

  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'

Heres a tail end of interfaces:

这是接口的尾端:

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'}}

采纳答案by Martijn Pieters

If someof your interfaceCounterskeys reference a string instead of a nested dictionary, just use exception handling to ignore those:

如果您的某些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

This is the ask forgivenessprinciple; if most of your entries do have the .get()method this is simply faster than the look before you leapprinciple, where you test if the method is available.

这就是请求宽恕的原则;如果您的大多数条目确实具有该.get()方法,则这比跳跃前先看原理要快,在那里您测试该方法是否可用。

回答by SmCaterpillar

How about simply checking if your dictionary value does provide the method/attribute you need?

简单地检查您的字典值是否确实提供了您需要的方法/属性怎么样?

  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',  {})