/usr/share/doc/diveintopython-zh/html/scripts_and_streams/all_together.html is in diveintopython-zh 5.4b-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | <!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>10.7. 全部放在一起</title>
<link rel="stylesheet" href="../diveintopython.css" type="text/css">
<link rev="made" href="mailto:f8dy@diveintopython.org">
<meta name="generator" content="DocBook XSL Stylesheets V1.52.2">
<meta name="keywords" content="Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free">
<meta name="description" content="Python from novice to pro">
<link rel="home" href="../toc/index.html" title="Dive Into Python">
<link rel="up" href="index.html" title="第 10 章 脚本和流">
<link rel="previous" href="command_line_arguments.html" title="10.6. 处理命令行参数">
<link rel="next" href="summary.html" title="10.8. 小结">
</head>
<body>
<table id="Header" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
<tr>
<td id="breadcrumb" colspan="5" align="left" valign="top">导航:<a href="../index.html">起始页</a> > <a href="../toc/index.html">Dive Into Python</a> > <a href="index.html">脚本和流</a> > <span class="thispage">全部放在一起</span></td>
<td id="navigation" align="right" valign="top"> <a href="command_line_arguments.html" title="上一页: “处理命令行参数”"><<</a> <a href="summary.html" title="下一页: “小结”">>></a></td>
</tr>
<tr>
<td colspan="3" id="logocontainer">
<h1 id="logo"><a href="../index.html" accesskey="1">深入 Python :Dive Into Python 中文版</a></h1>
<p id="tagline">Python 从新手到专家 [Dip_5.4b_CPyUG_Release]</p>
</td>
<td colspan="3" align="right">
<form id="search" method="GET" action="http://www.google.com/custom">
<p><label for="q" accesskey="4">Find: </label><input type="text" id="q" name="q" size="20" maxlength="255" value=""> <input type="submit" value="搜索"><input type="hidden" name="domains" value="woodpecker.org.cn"><input type="hidden" name="sitesearch" value="www.woodpecker.org.cn/diveintopython"></p>
</form>
</td>
</tr>
</table>
<!--#include virtual="/inc/ads" -->
<div class="section" lang="zh_cn">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="kgp.alltogether"></a>10.7. 全部放在一起
</h2>
</div>
</div>
<div></div>
</div>
<div class="abstract">
<p>你已经了解很多基础的东西。让我们回来看看所有片段是如何整合到一起的。</p>
</div>
<p>作为开始,这里是一个<a href="command_line_arguments.html" title="10.6. 处理命令行参数">接收命令行参数</a>的脚本,它使用 <tt class="filename">getopt</tt> 模块。
</p>
<div class="informalexample"><pre class="programlisting"><span class='pykeyword'>
def</span> main(argv):
...
<span class='pykeyword'>try</span>:
opts, args = getopt.getopt(argv, <span class='pystring'>"hg:d"</span>, [<span class='pystring'>"help"</span>, <span class='pystring'>"grammar="</span>])
<span class='pykeyword'>except</span> getopt.GetoptError:
...
<span class='pykeyword'>for</span> opt, arg <span class='pykeyword'>in</span> opts:
...</pre></div>
<p>创建 <tt class="classname">KantGenerator</tt> 类的一个实例,然后将语法文件和源文件传给它,可能在命令行没有指定。
</p>
<div class="informalexample"><pre class="programlisting">
k = KantGenerator(grammar, source)</pre></div>
<p><tt class="classname">KantGenerator</tt> 实例自动加载语法,它是一个 <span class="acronym">XML</span> 文件。你使用自定义的 <tt class="function">openAnything</tt> 函数打开这个文件 (<a href="index.html#kgp.openanything" title="10.1. 抽象输入源">可能保存在一个本地文件中或者一个远程服务器上</a>),然后使用内置的 <tt class="filename">minidom</tt> 解析函数<a href="../xml_processing/parsing_xml.html" title="9.3. XML 解析">将 <span class="acronym">XML</span> 解析为一棵 <span class="application">Python</span> 对象树</a>。
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> _load</span>(self, source):
sock = toolbox.openAnything(source)
xmldoc = minidom.parse(sock).documentElement
sock.close()</pre></div>
<p>哦,根据这种方式,你将使用到 <span class="acronym">XML</span> 文档结构的知识<a href="caching.html" title="10.3. 查询缓冲节点">建立一个引用的小缓冲</a>,这些引用都只是 <span class="acronym">XML</span> 文档中的元素。
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> loadGrammar</span>(self, grammar):
<span class='pykeyword'>for</span> ref <span class='pykeyword'>in</span> self.grammar.getElementsByTagName(<span class='pystring'>"ref"</span>):
self.refs[ref.attributes[<span class='pystring'>"id"</span>].value] = ref </pre></div>
<p>如果你在命令行中指定了某些源材料,你可以使用它;否则你将打开语法文件查找“顶层”引用 (没有被其它的东西引用) 并把它作为开始点。</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> getDefaultSource</span>(self):
xrefs = {}
<span class='pykeyword'>for</span> xref <span class='pykeyword'>in</span> self.grammar.getElementsByTagName(<span class='pystring'>"xref"</span>):
xrefs[xref.attributes[<span class='pystring'>"id"</span>].value] = 1
xrefs = xrefs.keys()
standaloneXrefs = [e <span class='pykeyword'>for</span> e <span class='pykeyword'>in</span> self.refs.keys() <span class='pykeyword'>if</span> e <span class='pykeyword'>not</span> <span class='pykeyword'>in</span> xrefs]
<span class='pykeyword'>return</span> <span class='pystring'>'<xref id="%s"/>'</span> % random.choice(standaloneXrefs)</pre></div>
<p>现在你打开了了源材料。它是一个 <span class="acronym">XML</span>,你每次解析一个节点。为了让代码分离并具备更高的可维护性,你可以使用<a href="handlers_by_node_type.html" title="10.5. 根据节点类型创建不同的处理器">针对每个节点类型的独立处理方法</a>。
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> parse_Element</span>(self, node):
handlerMethod = getattr(self, <span class='pystring'>"do_%s"</span> % node.tagName)
handlerMethod(node)</pre></div>
<p>你在语法里面跳来跳去,解析每一个 <tt class="sgmltag-element">p</tt> 元素的<a href="child_nodes.html" title="10.4. 查找节点的直接子节点">所有孩子</a>,
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> do_p</span>(self, node):
...
<span class='pykeyword'>if</span> doit:
<span class='pykeyword'>for</span> child <span class='pykeyword'>in</span> node.childNodes: self.parse(child)</pre></div>
<p>用任意一个孩子替换 <tt class="sgmltag-element">choice</tt> 元素,
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> do_choice</span>(self, node):
self.parse(self.randomChildElement(node))</pre></div>
<p>并用对应 <tt class="sgmltag-element">ref</tt> 元素的任意孩子替换 <tt class="sgmltag-element">xref</tt>,前面你已经进行了缓冲。
</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> do_xref</span>(self, node):
id = node.attributes[<span class='pystring'>"id"</span>].value
self.parse(self.randomChildElement(self.refs[id]))</pre></div>
<p>就这样一直解析,最后得到普通文本。</p>
<div class="informalexample"><pre class="programlisting">
<span class='pykeyword'>def</span><span class='pyclass'> parse_Text</span>(self, node):
text = node.data
...
self.pieces.append(text)</pre></div>
<p>把结果打印出来。</p>
<div class="informalexample"><pre class="programlisting"><span class='pykeyword'>
def</span> main(argv):
...
k = KantGenerator(grammar, source)
<span class='pykeyword'>print</span> k.output()</pre></div>
</div>
<table class="Footer" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
<tr>
<td width="35%" align="left"><br><a class="NavigationArrow" href="command_line_arguments.html"><< 处理命令行参数</a></td>
<td width="30%" align="center"><br> <span class="divider">|</span> <a href="index.html#kgp.openanything" title="10.1. 抽象输入源">1</a> <span class="divider">|</span> <a href="stdin_stdout_stderr.html" title="10.2. 标准输入、输出和错误">2</a> <span class="divider">|</span> <a href="caching.html" title="10.3. 查询缓冲节点">3</a> <span class="divider">|</span> <a href="child_nodes.html" title="10.4. 查找节点的直接子节点">4</a> <span class="divider">|</span> <a href="handlers_by_node_type.html" title="10.5. 根据节点类型创建不同的处理器">5</a> <span class="divider">|</span> <a href="command_line_arguments.html" title="10.6. 处理命令行参数">6</a> <span class="divider">|</span> <span class="thispage">7</span> <span class="divider">|</span> <a href="summary.html" title="10.8. 小结">8</a> <span class="divider">|</span>
</td>
<td width="35%" align="right"><br><a class="NavigationArrow" href="summary.html">小结 >></a></td>
</tr>
<tr>
<td colspan="3"><br></td>
</tr>
</table>
<div class="Footer">
<p class="copyright">Copyright © 2000, 2001, 2002, 2003, 2004 <a href="mailto:mark@diveintopython.org">Mark Pilgrim</a></p>
<p class="copyright">Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007 <a href="mailto:python-cn@googlegroups.com">CPyUG (邮件列表)</a></p>
</div>
</body>
</html>
|