我一直在想一种方法来遍历层次结构,如链表,使用列表表达式,但没有想出任何似乎可行的方法。
基本上,我想转换这段代码:
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
变成像这样的单线:
print ".".join( [o.name for o in <???>] )
不过,我不确定如何以通用方式(如果可能的话)在???
零件中进行遍历。我有几个具有相似类型属性的结构,并且不想为每个结构编写一个屈服函数。.parent
编辑:
我不能使用__iter__
对象本身的方法,因为它已经用于迭代对象本身包含的值。大多数其他答案,除了 liori 的,硬编码属性名称,这是我想要避免的。
这是我根据 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)