循环通过一堆文件夹内容,这可能本身就是文件夹?

Som*_*DOS 0 python recursion plone

假设我有一个内容类型,文件夹,有4个项目.

+ MyObject
 - Child1
 - Child2
 - Child3
 + Child4
  - Child5
 - Child6
Run Code Online (Sandbox Code Playgroud)

假设我有另一种内容类型(让我们称之为Alias).这Alias主要是对另一个对象的引用,但是文件夹:它可以包含一堆其他别名.我将用于-->在以下树表示中指示此引用.("引用"主要是一个名为"引用"的属性,它从目标对象接收UID).

假设MyAlias现在引用我的MyObject.

+ MyAlias --> MyObject
 - (Nothing)
Run Code Online (Sandbox Code Playgroud)

当引用时MyObject,MyAlias不知道那MyObject是一个Folder,所以内部的MyAlias子元素不存在.我需要遍历每个人,并手动创建一个Alias内部MyAlias,这是一个给MyObject孩子们的参考(具有相同的结构).一棵小树,展示应该发生的事情:

+ MyAlias --> MyObject
 - Alias --> Child1
 - Alias --> Child2
 - Alias --> Child3
 + Alias --> Child4
  - Alias --> Child5
 - Alias --> Child6
Run Code Online (Sandbox Code Playgroud)

我想知道迭代MyObject项目的最佳方法,并使用某种循环并invokeFactory在订阅者中使用,与另一个对象创建相同的结构.最后,我会存在两个树:一个是实际的文件夹和子项,另一个是对同一个文件夹和子项的引用.

(总结:像collective.alias这样的东西,但是以一种非常原始的形式,只是文件夹,因为我不能使用collective.alias.)

Fre*_*Foo 6

最优雅和Pythonic解决方案是编写递归生成器.假设这是一种方法:

def iter_preorder(self):
    yield self
    # check for folderishness here if a non-folderish
    # node may have children as well
    for x in self.children:
        for y in x.iter_preorder():
            yield y
Run Code Online (Sandbox Code Playgroud)

然后

for x in tree.iter_preorder():
    do_action(x)
Run Code Online (Sandbox Code Playgroud)

这样,你实际上不必将你的动作包装成函数/可调用,并且没有控制反转.