所有其他部分完全运行后,可以运行变形器部分吗?

时间:2015-07-22 17:52:45

标签: python iterator plone data-migration transmogrifier

我正在使用transmogrifier管道将内容导入Plone,为了修复图像,链接和相关内容等各个方面,我需要在创建所有内容并编制索引后立即运行我的部分。

我需要这个,因为我想使用目录工具来按路径搜索内容并使用其UUID引用它。

是否可以使用transmogrifier,或者最好使用其他任何可用的技术,例如简单的升级步骤?

我正在考虑使用类似于源部分的模式:

from collective.transmogrifier.interfaces import ISection
from collective.transmogrifier.interfaces import ISectionBlueprint

class DoSomethingAtTheVeryEndSection(object):

    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous

    def __iter__(self):
        for item in self.previous:
            yield item

        for item in self.previous:
            do_something()

这是个好主意吗?

1 个答案:

答案 0 :(得分:1)

是的,制作PostProcess部分是一个好主意,唯一的问题是self.previous生成器不能以这种方式被调用2次。

解决方法是使用itertools.tee复制生成器,这样你可以走两次进入生成器:

from collective.transmogrifier.interfaces import ISection
from collective.transmogrifier.interfaces import ISectionBlueprint

import itertools


class DoSomethingAtTheVeryEndSection(object):

    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous

    def __iter__(self):
        self.previous, self.postprocess = itertools.tee(self.previous)
        for item in self.previous:
            yield item

        for item in self.postprocess:
            do_something()