Return a generator representing the lineage of the resource object implied by the resource argument. The generator first returns resource unconditionally. Then, if resource supplies a __parent__ attribute, return the resource represented by resource.__parent__. If that resource has a __parent__ attribute, return that resource’s parent, and so on, until the resource being inspected either has no __parent__ attribute or which has a __parent__ attribute of None. For example, if the resource tree is:
thing1 = Thing()
thing2 = Thing()
thing2.__parent__ = thing1
Calling lineage(thing2) will return a generator. When we turn it into a list, we will get:
list(lineage(thing2))
[ <Thing object at thing2>, <Thing object at thing1> ]