为什么不能将 'parent' 和 'tag' 参数作为 kwargs 传递给 xml.etree.ElementTree 的 SubElement 工厂函数?
Why one can't pass 'parent' and 'tag' arguments as kwargs to SubElement factory function of xml.etree.ElementTree?
我正在使用 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")
所以唯一的区别是将 parent
和 tag
作为关键字参数传递(请注意,使用正确的关键字)。另请查看堆栈跟踪:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: SubElement() takes at least 2 arguments (0 given)
地球上怎么会有 0 个参数?
查看 SubElement
的来源:lines 443:459 并没有给我任何启发。如您所见,SubElement
的两个位置参数确实命名为 parent
和 tag
.
我们是否要重新考虑 this particular 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
您可以阅读的 Python 代码 (def SubElement(parent, tag, attrib={}, **extra)
) 不是您从自己的代码调用 SubElement()
时将使用的代码。相反,将使用一个更高效的版本,用 C 编写并为您的 OS 编译。这确保了库的更好性能。
因此,Python 中通常可用的一些语法糖(在命名参数或位置参数之间进行选择的能力)可能不可用。
我正在使用 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")
所以唯一的区别是将 parent
和 tag
作为关键字参数传递(请注意,使用正确的关键字)。另请查看堆栈跟踪:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: SubElement() takes at least 2 arguments (0 given)
地球上怎么会有 0 个参数?
查看 SubElement
的来源:lines 443:459 并没有给我任何启发。如您所见,SubElement
的两个位置参数确实命名为 parent
和 tag
.
我们是否要重新考虑 this particular 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
您可以阅读的 Python 代码 (def SubElement(parent, tag, attrib={}, **extra)
) 不是您从自己的代码调用 SubElement()
时将使用的代码。相反,将使用一个更高效的版本,用 C 编写并为您的 OS 编译。这确保了库的更好性能。
因此,Python 中通常可用的一些语法糖(在命名参数或位置参数之间进行选择的能力)可能不可用。