为什么不能将"parent"和"tag"参数作为kwargs传递给xml.etree.ElementTree的SubElement工厂函数?



我使用的是Python 3.6.5。工作原理:

from xml.etree.ElementTree import Element, SubElement
root = Element("root")
SubElement(root, "sub")

什么没有:

from xml.etree.ElementTree import Element, SubElement
root = Element("root")
SubElement(parent=root, tag="sub")

因此,唯一的区别是将parenttag作为关键字参数传递(请注意,使用适当的关键字(。另请查看堆栈跟踪:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: SubElement() takes at least 2 arguments (0 given)

为什么会有0个论点

看看SubElement的来源:第443:459行,我并没有发现任何启示。正如您所看到的,SubElement的两个位置参数实际上被命名为parenttag

我们是否应该重新思考Raymond Hettinger这条建议的有效性?

该行为的原因可以在ElementTree.py:的末尾找到

# Import the C accelerators
try:
# Element is going to be shadowed by the C implementation. We need to keep
# the Python version of it accessible for some "creative" by external code
# (see tests)
_Element_Py = Element
# Element, SubElement, ParseError, TreeBuilder, XMLParser
from _elementtree import *
except ImportError:
pass

当您从自己的代码中调用SubElement()时,您可以读取的Python代码(def SubElement(parent, tag, attrib={}, **extra)(不是将要使用的代码。相反,将使用一个更高效的版本,用C编写并为您的操作系统编译。这确保了库的更好性能。

因此,Python中通常可用的一些语法糖(在命名参数或位置参数之间进行选择的能力(可能不可用。

最新更新