AttributeError:“ dict_values”对象没有属性“ get”

时间:2019-06-28 00:21:42

标签: python-3.x recursion

我有一个编码递归问题,在这里我试图编写一个递归函数,在这种情况下,该函数仅返回PscPowerCableConnected。如果有人有更干净的工作代码,请与我分享。

python3代码

def find_intresting_events(processed_events):
    INTERESTED_EVENTS = [
    'PscPowerCableDisconnected',
    'PscPowerCableConnected'
    ]
    for event in INTERESTED_EVENTS:
        if type(processed_events) == list:
            find_intresting_events(processed_events[0])
        else:
            print(processed_events)
            if processed_events.get(event):
                return event
            else:
                find_intresting_events(processed_events.values())
    return None

输入

path = [{'allEvents': [{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], 'id': '5d154ec80df300000006', 'timestamp': 1561677512101, 'ms_since_boot': 10821695}]

错误

>>> find_intresting_events(path)
{'allEvents': [{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], 'id': '5d154ec80df300000006', 'timestamp': 1561677512101, 'ms_since_boot': 10821695}
dict_values([[{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], '5d154ec80df300000006', 1561677512101, 10821695])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in find_intresting_events
  File "<stdin>", line 14, in find_intresting_events
  File "<stdin>", line 11, in find_intresting_events
AttributeError: 'dict_values' object has no attribute 'get'

2 个答案:

答案 0 :(得分:1)

之所以发生这种情况是因为您尝试在字符串上使用 .get ,因此if statement仅检查您的数据类型是否为列表,您for loop中的 event 变量是字符串,因此,选中if statement后,它会转到else并尝试对字符串使用get方法。 如果仅将print(type(event))放入循环的第一行,就会注意到问题。

def find_intresting_events(processed_events):
INTERESTED_EVENTS = [
    'PscPowerCableDisconnected',
    'PscPowerCableConnected'
]
for event in INTERESTED_EVENTS:
    if type(processed_events) == list:
        find_intresting_events(processed_events[0])
    else:
        print(type(event))
return None


find_intresting_events(path)

输出为:

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>

如果您需要其他帮助,我们将很乐意为您提供帮助。

答案 1 :(得分:0)

我能够提出一个解决方案,但是看起来很难看。我敢肯定,如果您能想到一种更好的方法,可以有更好的方法来实现,请与我分享。

def find_intresting_events(processed_events):
        INTERESTED_EVENTS = [
        'PscPowerCableDisconnected',
        'PscPowerCableConnected'
        ]
        for event in INTERESTED_EVENTS:
            if type(processed_events) == list:
                return find_intresting_events(processed_events[0])
            elif type(processed_events) == dict:
                for k,v in processed_events.items():
                    if type(v) == list:
                        return find_intresting_events(v[0])
                if processed_events.get(event):
                    return event
        return