嵌套self .__ parent __.__ parent__的Pythonic快捷方式(语法糖)

时间:2014-09-12 08:59:19

标签: python pyramid

我在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天时间进行搜索,所以决定在这里问。

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在他的回答中提供的代码是另一种通过索引获取祖先的好方法。