我在Python中有这种情况(使用Pyramid框架),我正在尝试检查条件。 这是代码:
if some_condition:
value = self.__parent__.__parent__.__parent__.method()
else:
value = self.__parent__.__parent__.method()
问题是,是否有更多pythonic方式(语法糖快捷方式)动态表示__parent__.__parent__...
?
我知道有这样的Python语法:
value1, value2, value3 = (None,) * 3
我的情况是否有类似和动态的东西? 我在谷歌,Python文档,Reddit源代码,Open Stack源代码中搜索,我花了2天时间进行搜索,所以决定在这里问。
答案 0 :(得分:3)
如果您不喜欢父链,您总是可以编写一个辅助方法来获取给定深度的节点。虽然这可能不太清晰。
例如
def get_parent(item, depth):
original_depth = depth
try:
while depth:
item = item.__parent__
depth -= 1
return item
except AttributeError:
raise AttributeError("No parent node found at depth {}".format(
original_depth-depth))
用法:
get_parent(self, 3).method()
答案 1 :(得分:1)
据我所知,python中没有这样的语法。
但是,您确实可以实现自定义方法来获取父资源列表:
def find_ancestors(resource):
ancestors = [resource]
while hasattr(ancestors[-1], '__parent__'):
ancestors.append(ancestors[-1].__parent__)
return ancestors
或者迭代它们的方法:
def iter_ancestors(resource):
yield resource
while hasattr(resource, '__parent__'):
resource = resource.__parent__
yield resource
另外,我不确定这种方式是否合适。我认为你应该看看find_interface(..)方法,并以某种方式设法为你的资源定义适当的接口来定位它们。这样做你的代码看起来像:
value = find_interface(self, ResourceA if some_condition else ResourceB).method()
更新: @Dunes在他的回答中提供的代码是另一种通过索引获取祖先的好方法。