リスト式を使用して、リンクされたリストのような階層構造をトラバースする方法を考えてみましたが、うまくいくと思われるものは何も思いつきませんでした。
基本的に、このコードを変換したい:
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)