Dive into Python: XML Processing -
这里我指的是kgp.py
的一部分程序-
def getDefaultSource(self):
xrefs = {}
for xref in self.grammar.getElementsByTagName("xref"):
xrefs[xref.attributes["id"].value] = 1
xrefs = xrefs.keys()
standaloneXrefs = [e for e in self.refs.keys() if e not in xrefs]
if not standaloneXrefs:
raise NoSourceError, "can't guess source, and no source specified"
return '<xref id="%s"/>' % random.choice(standaloneXrefs)
self.grammar:
已解析 XML
代表 ( using xml.dom.minidom
) -
<?xml version="1.0" ?>
<grammar>
<ref id="bit">
<p>0</p>
<p>1</p>
</ref>
<ref id="byte">
<p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
<xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
</ref>
</grammar>
self.refs:
是所有 refs
的缓存以上XML
由他们的 id
键入
我对这段代码有两个疑问:
疑问一:
for xref in self.grammar.getElementsByTagName("xref"):
xrefs[xref.attributes["id"].value] = 1
xrefs = xrefs.keys()
最终xrefs
将 id 值保存在列表中。难道我们不能简单地通过 -
xrefs = [xref.attributes["id"].value
for xref in self.grammar.getElementsByTagName("xref")]
疑点二:
standaloneXrefs = [e for e in self.refs.keys() if e not in xrefs]
...
return '<xref id="%s"/>' % random.choice(standaloneXrefs)
在这里,我们正在保存 ref
来自 self.refs
我们在计算中看不到 xrefs
.但接下来不是创建 <ref>
元素,我们正在创建一个 <xref>
使用相同的 ID。这让我们倒退了一步,因为稍后我们无论如何都要为这个计算出的 <xref>
找到交叉引用。并最终到达 <ref>
.我们本可以从这个 <ref>
开始首先。
免责声明
我绝不试图对这本书发表评论。我连那个资格都没有。
我喜欢阅读这本书的每一刻。我意识到几章不见了outdated ,但我爱Mark Pilgrim's写作风格,我无法停止阅读。
最佳答案
Dive Into Python现在已经七岁了(2004 年出版),并不总是包含最现代的代码。所以你需要放轻松:Dive Into Python 3可能是更好的选择。
你对疑问 1 的建议改变了代码的含义:将 id 放入字典的键中,然后再次将它们取出来消除重复项,而你的列表理解包括重复项。现代方法是使用集合理解:
xrefs = {xref.attributes["id"].value
for xref in self.grammar.getElementsByTagName("xref")}
但这在 2004 年还不可用。
关于你的疑问 2,我不完全确定我看到了问题。是的,在某种意义上这是一种浪费,但另一方面,代码已经有一个处理 xref
情况的处理程序,因此重新使用该处理程序而不是添加一个额外的特殊情况是有意义的.
该示例中还有其他几段代码可以进行现代化改造。例如,
source and source or self.getDefaultSource()
现在将是 source 或 self.getDefaultSource()
。和线
standaloneXrefs = [e for e in self.refs.keys() if e not in xrefs]
最好表示为集合差分操作,例如:
standaloneXrefs = set(self.refs) - set(xrefs)
但这就是随着语言变得更具表现力而发生的事情:旧代码开始看起来相当不优雅。
关于python - dive into python书中关于kgp.py程序的具体疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889235/