我需要objectify.SubElement的polyfill

2 投票
1 回答
525 浏览
提问于 2025-04-18 13:00

我正在尝试在Google App Engine上使用pptx-python来创建一个PowerPoint文件。我不需要图片,所以我把对Pillow的依赖注释掉了。这样做后,基本上可以运行,但我遇到了版本问题。GAE中的lxml版本是2.3,而显然SubElement这个方法是在2.3.2版本中才添加的。

pptx的代码很好地封装了lxml的调用,所以看起来我可以通过在应用层重写SubElement来解决这个问题。不幸的是,我对怎么做完全没有头绪。而且lxml的代码似乎只是用Python封装了一些用C写的东西。所以在我花几天时间去学习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 个回答

2

在GitHub上,python-pptx的开发分支已经去掉了SubElement和所有的lxml.objectify,改用了lxml.etree库的调用。简单来说,使用objectify在大规模应用时麻烦多于好处。

所以,如果你能从开发分支安装,这个问题可能就会消失。开发分支和主分支一样稳定,目前都有大约1000个单元测试和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

撰写回答