Вы получаете это AttributeError
, потому что вы рекурсивно вызываете функцию hierarch
для каждого значения 'children'.Это справедливо для таких ключей, как «employee-1», поскольку рекурсивный вызов зацикливается на связанном dict, но не завершается на «name», так как нет связанного dict, только строка имени.
Таким образом, вам нужно протестировать каждый элемент, чтобы убедиться в его правильности.Для этого вы можете использовать функцию type
, но рекомендуется использовать более универсальную функцию isinstance
.
Вместо того, чтобы печатать нужные имена, мы можем сделать функцию более гибкой, превратив ее в генератор.Таким образом, мы можем перебрать сгенерированные результаты, распечатать их по ходу или выполнить какую-то другую обработку.Или мы можем легко собрать их в список или новый плоский словарь.
partners = {
'manager-1': {
'name': 'Manager 1',
'children': {
'manager-2': {
'name': 'Manager 2',
'children': {
'employee-1': {
'name': 'Employee 1',
'children': {
'employee-7': {
'name': 'Employee 7',
},
'employee-8': {
'name': 'Employee 8',
}
}
},
'employee-2': {
'name': 'Employee 2',
},
'employee-3': {
'name': 'Employee 3',
},
},
},
'manager-3': {
'name': 'Manager 3',
'children': {
'employee-4': {
'name': 'Employee 4',
},
'employee-5': {
'name': 'Employee 5',
},
'employee-6': {
'name': 'Employee 6',
},
},
},
'manager-4': {
'name': 'Manager 4',
},
'manager-5': {
'name': 'Manager 5',
}
}
}
}
def show(obj, depth=0):
depth += 1
for v in obj.values():
if isinstance(v, dict):
yield from show(v, depth)
else:
yield v, depth
for v, depth in show(partners):
print('-' * depth + v)
output
--Manager 1
----Manager 2
------Employee 1
--------Employee 7
--------Employee 8
------Employee 2
------Employee 3
----Manager 3
------Employee 4
------Employee 5
------Employee 6
----Manager 4
----Manager 5