python - dive into python书中关于kgp.py程序的具体疑惑

标签 python xml

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/

相关文章:

java - 使用 ModelDriven 时如何执行 XML 验证?

python - 从 python 中的消息字符串发送电子邮件

php - 读取 xml 文件中的特定标签,而不使用任何类型的 php 库或扩展

java - 选择一个联系人并将其填写到EditText中

java - 无法获取 org.hibernate.persister.entity.SingleTableEntityPersister 错误的构造函数

python - 在python中创建XML文件节点丢失

c++ - gdbinit、 pretty-print 和相关目录?

python - 为什么 Python 的 .decode ('cp037' ) 不适用于特定的二进制数组?

python结构解压长度错误

python - tensorflow + 作业库 : limited to 8 processes?