python - 在所有其他部分完全运行后是否可以运行变形器部分?

标签 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()

这是个好主意吗?

最佳答案

是的,创建一个 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()

关于python - 在所有其他部分完全运行后是否可以运行变形器部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570498/

相关文章:

python - 如何让 Django 模板引擎在内存模板中呈现?

python - 更改 matplotlib 中轴线的长度

python - 从此表中获取数据 html python

plone - 如何在 Zope 和 Plone 中获取和设置 cookie?

templates - 如何制作插入其他较小内容项 View 的平面 View ?

python - 使用exit函数疑似代码解析错误

python - 使用生成器生成排列

c++ - 使用迭代器数组读取稀疏信息

c# - foreach 循环中奇怪的 IEnumerable 行为

session - 如何关闭除当前 session 之外的用户打开的所有( Plone ) session ?