我需要一个用于objectify.SubElement的polyfill

时间:2014-07-11 19:58:11

标签: python google-app-engine lxml

我正在尝试在Google App Engine上使用pptx-python(创建一个powerpoint文件)。我不需要图像,所以我只是注释了Pillow上的依赖关系。除了我有版本问题外,这给我留下了几乎可以工作的东西。 GAE中的lxml版本为2.3,显然在版本2.3.2中添加了SubElement方法。

pptx代码很好地包装了lxml调用,所以看起来我可以通过在应用程序级别重新编写SubElement来解决这个问题。不幸的是,我真的没有第一个线索如何做到这一点。并且lxml代码似乎只是用C语言编写的python包装器。所以在我花了几天时间来加速lxml之前,我希望你们中的一个天才可以帮助我。

这是pptx / oxml / shared.py中的代码:

def SubElement(parent, nsptag_str, **extra):
    """
    Return an lxml element having *nsptag_str*, newly added as a direct child
    of *parent*. The new element is appended to the sequence of children, so
    this method is not suitable if the child element must be inserted at a
    different position in the sequence. The class of the returned element is
    the custom element class for its tag, if one is defined. Additional
    named parameters defined on lxml ``makeelement()`` are accepted, such as
    attrib=attr_dct and e.g. ``visible='1'``.
    """
    nsptag = NamespacePrefixedTag(nsptag_str)
    return objectify.SubElement(
        parent, nsptag.clark_name, nsmap=nsptag.nsmap, **extra
    )

有人可以告诉我如何重写该函数,使其不依赖于objectify.SubElement,而只使用lxml 2.3中可用的方法吗?

1 个答案:

答案 0 :(得分:2)

GitHub上的python-pptx的develop分支有SubElement,实际上所有lxml.objectify都被删除了,有利于lxml.etree库调用。很长一段时间,但短版本是客观化的,比大规模使用时更麻烦。

因此,如果您可以从开发分支安装,则此问题可能会消失。开发分支与master一样稳定,此时它们都支持大约1,000个单元测试和175个集成/验收测试。

这就是我开始的地方。让我们知道你如何去:)

实际上,现在我想起来了,虽然我更喜欢上面的方法,因为这意味着你不必固定你的python-pptx版本,这可能就是这个诀窍:

def SubElement(parent, nsptag_str, **extra):
    nsptag = NamespacePrefixedTag(nsptag_str)
    nsmap = nsptag.nsmap
    element = oxml_parser.makeelement(nsptag.clark_name, nsmap=nsmap, **extra)
    parent.append(element)
    return element