Я пытался придумать способ обойти иерархическую структуру, например, связанный список, используя выражение списка, но не нашел ничего, что могло бы работать.
В основном, я хочу преобразовать этот код:
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
в одну строку, как:
print ".".join( [o.name for o in <???>] )
Я не уверен, как сделать обход в части ???
, хотя, в общем виде (если это вообще возможно). У меня есть несколько структур с похожими атрибутами типа .parent
, и я не хочу, чтобы для каждого была написана функция выдачи.
Edit:
Я не могу использовать методы __iter__
самого объекта, потому что он уже используется для перебора значений, содержащихся в самом объекте. Большинство других ответов, кроме liori, жестко задают имя атрибута, чего я хочу избежать.
Вот моя адаптация, основанная на ответе Лиори:
import operator
def walk(attr, start):
if callable(attr):
getter = attr
else:
getter = operator.attrgetter(attr)
o = getter(start)
while o:
yield o
o = getter(o)