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.)
最优雅和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)
这样,你实际上不必将你的动作包装成函数/可调用,并且没有控制反转.
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |