Changeset 860
- Timestamp:
- Sun Mar 12 18:12:08 2006
- Files:
-
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/kgp.xml (modified) (diff)
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/soap.xml (modified) (diff)
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/plural.xml (modified) (diff)
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/openanything.xml (modified) (diff)
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/re.xml (modified) (diff)
- zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/apihelper.xml (modified) (diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/kgp.xml
r858 r860 5 5 <titleabbrev id="kgp.numberonly">第 9 章</titleabbrev> 6 6 <section id="kgp.divein"> 7 <title>� ��触</title>7 <title>���览</title> 7 7 <para>下面两章是关于 &python; 中 &xml; 处理的。如果你已经知道一个 &xml; 文档的样子,比如它是由结构化标记构成的,这些标记形成了层次模型的元素,等等这些知识都是有帮助的。如果你不明白这些,这里有 <ulink url="&url_xmltutorial;">很多 &xml; 教程</ulink> 能够解释这些基础知识。</para> 8 8 <para>如果你对XML不是很感兴趣,你还是应该读一下这些章节,它们涵盖了不少重要的主题比如 &python; 包,Unicode,命令行参数以及如何使用 &getattr; 进行方法分发。</para> -
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/soap.xml
r858 r860 6 6 <abstract> 7 7 <para><xref linkend="oa" endterm="oa.numberonly"/> 关注 HTTP 上面向文档的web 服务。 <quote>输入参数</quote> 是 &url;, <quote>返回值</quote> 是需要你来解析的一个实际的 XML 文档。</para> 8 <para>本章将关注更加结构化地 &soap; web 服务。 &soap; 允许你模拟返回自有数据类型的函数调用,而不仅仅是直接地[todo]矗立 HTTP 请求和 XML 文档。 正像你将要看到的,这个描述恰如其份;你可以使用标准 &python; 调用语法通过 &soap; 库去调用一个函数,这个函数也自然会返回 &python; 对象和值。 但解开这层面纱, &soap; 库实际上扮演了一个多 XML 文档和远程服务器参与的复杂处理过程。</para>8 <para>本章将关注更加结构化地 &soap; web 服务。 &soap; 不需要你直接与 HTTP 请求和 XML 文档打交道,而是允许你模拟返回原始数据类型的函数调用。 正像你将要看到的,这个描述恰如其份;你可以使用标准 &python; 调用语法通过 &soap; 库去调用一个函数,这个函数也自然会返回 &python; 对象和值。 但解开这层面纱, &soap; 库实际上扮演了一个多 XML 文档和远程服务器参与的复杂处理过程。</para> 8 8 <para>&soap; 的贴切定义很复杂,不要误认为 &soap; 就是用于调用远程函数。有些人觉得应该补充上: &soap; 还允许单向异步的信息通过,并且是面向文档的 Web 服务。 有这样想法的人是正确的,&soap; 的确是这样,但却不止于此。但这一章的重点在于所谓的 <quote>RPC-style</quote> &soap; —— 调用远程函数获得返回结果。</para> 9 9 </abstract> … … 185 185 <callout arearefs="soap.firststeps.1.2"> 186 186 <para>每个 &soap; 服务都有一个 &url; 用以处理所有请求。 相同的 &url; 可以用于所有的函数请求。每个特定服务则只有一个函数。但稍后你将看到的 Google &api; 却有多个函数。这个服务的 &url; 提供给所有函数分享。</para> 187 <para>每个 &soap; 服务都有一个命名空间(namespace),这个命名空间是由服务器任意命名的。这不过是为了调用 &soap; 方法而设置的。 [todo]它使得服务器为多个不相关的服务提供服务 &url;共享成为可能。这与 &python; 中模块到 <link linkend="kgp.packages">packages</link> 的关系类似。</para>187 <para>每个 &soap; 服务都有一个命名空间(namespace),这个命名空间是由服务器任意命名的。这不过是为了调用 &soap; 方法而设置的。它使得服务器为多个不相关的服务提供服务 &url; 和路径请求共享成为可能。这与 &python; 中模块到 <link linkend="kgp.packages">packages</link> 的关系类似。</para> 187 187 </callout> 188 188 <callout arearefs="soap.firststeps.1.3"> … … 377 377 </callout> 378 378 <callout arearefs="soap.introspection.2.3"> 379 <para>每个 <classname>ParameterInfo</classname> 对象包含一个 <varname>name</varname> 属性,这便是参数名。 [todo]再通过 你不需要 &soap; 调用函数时不需要知道参数名,但 &soap; 却支持在调用函数时使用参数名的情形(类似于 &python; )。如果使用参数名, <classname>WSDL.Proxy</classname> 将会正确地把这些参数关联到远程函数。</para>379 <para>每个 <classname>ParameterInfo</classname> 对象包含一个 <varname>name</varname> 属性,这便是参数名。再通过 &soap; 调用函数时,你不需要知道参数名,但 &soap; 却支持在调用函数时使用参数名的情形(类似于 &python; )。如果使用参数名, <classname>WSDL.Proxy</classname> 将会正确地把这些参数关联到远程函数。</para> 379 379 </callout> 380 380 <callout arearefs="soap.introspection.2.4"> … … 456 456 </callout> 457 457 <callout arearefs="soap.introspection.4.3"> 458 <para>你可以通过 <varname>server.soapproxy</varname> 访问 <classname>WSDL.Proxy</classname> 的 <classname>SOAPProxy</classname>。这对于打开查错模式很重要,这样一来当你通过 &wsdl; proxy 调用函数时,它的 <classname>SOAPProxy</classname> 将会把线路上来往的 XML 文档 [todo]丢下来。</para>458 <para>你可以通过 <varname>server.soapproxy</varname> 访问 <classname>WSDL.Proxy</classname> 的 <classname>SOAPProxy</classname>。这对于打开查错模式很重要,这样一来当你通过 &wsdl; proxy 调用函数时,它的 <classname>SOAPProxy</classname> 将会把线路上来往的 XML 文档甩下来。</para> 458 458 </callout> 459 459 </calloutlist> 602 602 <para>下面的这些例子是我在使用 &soap; 网络服务时犯过的一些常见错误以及所产生的错误信息。</para> 603 603 <example> 604 <title> [todo]以错误的设置调用 Proxy 方法</title>604 <title>以错误的设置调用 Proxy 方法</title> 604 604 <screen> 605 605 &prompt;<userinput>from SOAPpy import SOAPProxy</userinput> -
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/plural.xml
r858 r860 11 11 </abstract> 12 12 <para>如果你还没有看 <xref linkend="re"/>,现在是个绝佳的机会。 这章中假定你已理解了正则表达式的基础内容并迅速深入更高级的应用。</para> 13 <para>英语是一个吸收很多外来语而另人疯掉的语言,把单数名词变成复数的规则则是复杂而又多变的。 有规则,有例外, [todo]更有例的例外。</para>13 <para>英语是一个吸收很多外来语而另人疯掉的语言,把单数名词变成复数的规则则是复杂而又多变的。 有规则,有例外,更有例外的例外。</para> 13 13 <para>如果你在英语国家长大或是在正规学校学习了英语,你可能对下面的基本规则很熟悉:</para> 14 14 <orderedlist> … … 19 19 <listitem><para>如果一切规则都不适用,就只添加 S 并祈祷不会错。</para></listitem> 20 20 </orderedlist> 21 <para>(我知道有很多例外情况, 比如: <quote>Man</quote> 变成 <quote>men</quote>, <quote>woman</quote> 变成 <quote>women</quote>,但是, <quote>human</quote> 却变成 <quote>humans</quote>。 <quote>Mouse</quote> 变成 <quote>mice</quote>, <quote>louse</quote> 变成 <quote>lice</quote>, 但是, <quote>house</quote> 却变成 <quote>houses</quote>。 <quote>Knife</quote> 变成 <quote>knives</quote>, <quote>wife</quote> 变成 <quote>wives</quote>,但是 <quote>lowlife</quote> 却变成 <quote>lowlifes</quote>。 [todo]更不要说那些复数就是本身的词,比如 <quote>sheep</quote>, <quote>deer</quote>, and <quote>haiku</quote>。)</para>21 <para>(我知道有很多例外情况, 比如: <quote>Man</quote> 变成 <quote>men</quote>, <quote>woman</quote> 变成 <quote>women</quote>,但是, <quote>human</quote> 却变成 <quote>humans</quote>。 <quote>Mouse</quote> 变成 <quote>mice</quote>, <quote>louse</quote> 变成 <quote>lice</quote>, 但是, <quote>house</quote> 却变成 <quote>houses</quote>。 <quote>Knife</quote> 变成 <quote>knives</quote>, <quote>wife</quote> 变成 <quote>wives</quote>,但是 <quote>lowlife</quote> 却变成 <quote>lowlifes</quote>。 更不要说那些复数不需要变化的词了,比如 <quote>sheep</quote>, <quote>deer</quote>, and <quote>haiku</quote>。)</para> 21 21 <para>其他的语言当然完全不同。</para> 22 22 <para>让我们来设计一个复数化名词的模块吧! 从英语名词开始,仅考虑上面的四种规则,但是记得你将来需要不断添加规则,更可能最后添加进更多的语言。</para> … … 47 47 <calloutlist> 48 48 <callout arearefs="plural.stage1.1.1"> 49 <para>好啦,这是一个正则表达式,但是它使用了你在 <xref linkend="re"/> 中未曾见过的语法。 方括号的意思是 <quote> [todo]匹配完全匹配这些字符中的一个</quote>。 也就是说,<literal>[sxz]</literal> 意味着 <quote><literal>s</literal>,或者 <literal>x</literal>,再或者 <literal>z</literal></quote>, 但只是其中的一个。 <literal>$</literal> 应该不陌生,它意味着匹配字符串的结尾。 也就是说,检查 <varname>noun</varname> 是否以 <literal>s</literal>,<literal>x</literal>,或者 <literal>z</literal> 结尾。</para>49 <para>好啦,这是一个正则表达式,但是它使用了你在 <xref linkend="re"/> 中未曾见过的语法。 方括号的意思是 <quote>完全匹配这些字符中的一个</quote>。 也就是说,<literal>[sxz]</literal> 意味着 <quote><literal>s</literal>,或者 <literal>x</literal>,再或者 <literal>z</literal></quote>, 但只是其中的一个。 <literal>$</literal> 应该不陌生,它意味着匹配字符串的结尾。 也就是说,检查 <varname>noun</varname> 是否以 <literal>s</literal>,<literal>x</literal>,或者 <literal>z</literal> 结尾。</para> 49 49 </callout> 50 50 <callout arearefs="plural.stage1.1.2"> … … 149 149 </callout> 150 150 <callout arearefs="plural.stage1.5.2"> 151 <para>顺便提一下,可以将两个正则表达式(一个确定规则适用与否,一个应用规则)合并在一起成为一个正则表达式。 [todo]这便是合并的样子。 它的大部分已经很熟悉:你应用的是在 <xref linkend="re.phone"/> 学过的记忆组(remembered group)记住 <literal>y</literal> 之前的字符。然后在替换字符串,你使用一个新的语法 <literal>\1</literal>,这意味着: <quote>嘿!记得前面的第一个组吗? 把它放这儿</quote>。 就此而言,记住了 <literal>y</literal> 之前的 <literal>c</literal> ,然后你做替换工作,你将 <literal>c</literal> 替换到 <literal>c</literal> 的位置,并将 <literal>ies</literal> 替换到 <literal>y</literal> 的位置。 (如果你有不只一个组则可以使用 <literal>\2</literal> 或者 <literal>\3</literal> 等等。)</para>151 <para>顺便提一下,可以将两个正则表达式(一个确定规则适用与否,一个应用规则)合并在一起成为一个正则表达式。 这便是合并后的样子。 它的大部分已经很熟悉:你应用的是在 <xref linkend="re.phone"/> 学过的记忆组(remembered group)记住 <literal>y</literal> 之前的字符。然后在替换字符串,你使用一个新的语法 <literal>\1</literal>,这意味着: <quote>嘿!记得前面的第一个组吗? 把它放这儿</quote>。 就此而言,记住了 <literal>y</literal> 之前的 <literal>c</literal> ,然后你做替换工作,你将 <literal>c</literal> 替换到 <literal>c</literal> 的位置,并将 <literal>ies</literal> 替换到 <literal>y</literal> 的位置。 (如果你有不只一个组则可以使用 <literal>\2</literal> 或者 <literal>\3</literal> 等等。)</para> 151 151 </callout> 152 152 </calloutlist> 161 161 <abstract> 162 162 <title/> 163 <para>现在你将增加一个抽象过程。 你从定义一个规则列表开始:如果这样, [todo]就做那个,否则判断下一规则。 让我们暂时将程序一部分复杂化以便使另一部分简单化。</para>163 <para>现在你将增加一个抽象过程。 你从定义一个规则列表开始:如果这样,就做那个,否则判断下一规则。 让我们暂时将程序一部分复杂化以便使另一部分简单化。</para> 163 163 </abstract> 164 164 <example> -
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/openanything.xml
r858 r860 383 383 <callout arearefs="oa.etags.1.1"> 384 384 <para>还记得当调试标记设置为开启时所有那些你看到的 HTTP 头信息打印输出吗? 385 [todo]This is how you can get access to them programmatically:385 这里便是你如何以编程方式访问它们: 385 385 386 386 <varname>firstdatastream.headers</varname> 是 <link linkend="fileinfo.userdict">一个类似 dictionary 行为的对象</link> 并且 允许你获得任何个别的从 HTTP 服务器返回的头信息。</para> … … 410 410 <callout arearefs="oa.etags.2.1"> 411 411 <para>&urllib2; 是围绕 URL 头信息而设计的。 每一个头信息就是一个能定义任意数量方法的类。 当某事件发生 -- 比如一个 HTTP 错误, 412 以至一个 <literal>304</literal> 代码 -- &urllib2; 审视用于处理它的 一系列已定义的处理器方法。你使用了一个与 <xref linkend="kgp"/> 类似的自省为不同节点类型定义了一些处理器,但是 &urllib2; 是很灵活的, [todo]and introspects over as many handlers as are defined for the current request.412 以至一个 <literal>304</literal> 代码 -- &urllib2; 审视用于处理它的 一系列已定义的处理器方法。你使用了一个与 <xref linkend="kgp"/> 类似的自省为不同节点类型定义了一些处理器,但是 &urllib2; 是很灵活的,还可以内省为当前请求所定义的所有处理器。 412 412 </para> 413 413 </callout> … … 440 440 </callout> 441 441 <callout arearefs="oa.etags.3.2"> 442 <para>这是关键所在: 既然已经定义了你的自定义 URL 头信息, 你需要告诉 &urllib2; 来使用它。 还记得我怎么说的吗, &urllib2; 将一个 HTTP 资源的访问过程分解为三个步骤, 443 [todo]and for good reason? This is why building the URL opener is its own step, 因为你能用你自定义的 URL 操作覆盖 &urllib2; 的默认行为来创建它。</para> 442 <para>[todo]这是关键所在: 既然已经定义了你的自定义 URL 头信息, 你需要告诉 &urllib2; 来使用它。 还记得我怎么说 &urllib2; 将一个 HTTP 资源的访问过程分解为三个步骤的正当理由吗? 443 这便是为什么构建 HTTP 开启器就是它自身的步骤,因为你能用你自定义的 URL 操作覆盖 &urllib2; 的默认行为来创建它。</para> 444 444 </callout> 445 445 <callout arearefs="oa.etags.3.3"> … … 817 817 </callout> 818 818 <callout arearefs="oa.gzip.2.4"> 819 <para>这是做所有工作的一行: 从 <classname>GzipFile</classname> 中 <quote>读取</quote> 将会解压缩数据。 感到奇妙吗? 是的, 它确实解压缩了数据。 <varname>gzipper</varname> 是一个类似文件的对象, 它代表一个 gzip 压缩文件。 尽管这个 <quote>file</quote> 并非一个磁盘上的真实文件; 但 <varname>gzipper</varname> 还是真正的从你用 &stringio_modulename; 包装了压缩数据所创建的类似文件的对象中 <quote>读取</quote> 数据, 它仅仅是内存中的变量 <varname>compresseddata</varname>。 压缩的数据来自哪呢? 你通常从远程 HTTP 服务器下载, 然后从你用 <function>urllib2.build_opener</function> 创建的类似文件的对象中 <quote>读取</quote>。 令人吃惊吧, 这就是所有的步骤。 [todo]Every step in the chain has no idea that the previous step is faking it.</para>819 <para>这是做所有工作的一行: 从 <classname>GzipFile</classname> 中 <quote>读取</quote> 将会解压缩数据。 感到奇妙吗? 是的, 它确实解压缩了数据。 <varname>gzipper</varname> 是一个类似文件的对象, 它代表一个 gzip 压缩文件。 尽管这个 <quote>file</quote> 并非一个磁盘上的真实文件; 但 <varname>gzipper</varname> 还是真正的从你用 &stringio_modulename; 包装了压缩数据所创建的类似文件的对象中 <quote>读取</quote> 数据, 它仅仅是内存中的变量 <varname>compresseddata</varname>。 压缩的数据来自哪呢? 你通常从远程 HTTP 服务器下载, 然后从你用 <function>urllib2.build_opener</function> 创建的类似文件的对象中 <quote>读取</quote>。 令人吃惊吧, 这就是所有的步骤。 链条上的每一步都完全不知道上一步在造假。</para> 819 819 </callout> 820 820 <callout arearefs="oa.gzip.2.5"> 848 848 </callout> 849 849 <callout arearefs="oa.gzip.3.3"> 850 <para>从 <methodname>opener.open</methodname> 返回了一个类似文件的对象, 并且阅读头信息你可以获知, 你将获得 gzip 压缩数据, 为什么不简单地通过那个类似文件的对象直接访问 <classname>GzipFile</classname> 呢? 因为你从 <classname>GzipFile</classname> 实例 <quote>读取</quote> , 他将从远程 HTTP 服务器 <quote>读取</quote> 被压缩的数据并且立即解压缩。 这是个好主意, 但是不行的是它无法工作。 因为 gzip 压缩的工作方式所致, <classname>GzipFile</classname> [todo]needs to save its position and move forwards and backwards through the compressed file. 当 <quote>file</quote> 是来自远程服务器的字节流时无法工作; 你能用它做的所有工作就是一次返回一个字节流, [todo]not move back and forth through the data stream.所以使用 &stringio_modulename; 这种看上去不雅的手段是最好的解决方案: 下载压缩的数据, 除此之外用 &stringio_modulename; 创建一个类似文件的对象, 并从中解压缩数据。</para>850 <para>从 <methodname>opener.open</methodname> 返回了一个类似文件的对象, 并且阅读头信息你可以获知, 你将获得 gzip 压缩数据, 为什么不简单地通过那个类似文件的对象直接访问 <classname>GzipFile</classname> 呢? 因为你从 <classname>GzipFile</classname> 实例 <quote>读取</quote> , 他将从远程 HTTP 服务器 <quote>读取</quote> 被压缩的数据并且立即解压缩。 这是个好主意, 但是不行的是它无法工作。 由 gzip 压缩的工作方式所致, <classname>GzipFile</classname> 需要存储其位置并在压缩文件上往返游走。当 <quote>file</quote> 是来自远程服务器的字节流时无法工作; 你能用它做的所有工作就是一次返回一个字节流, 而不是在字节流上往返。 所以使用 &stringio_modulename; 这种看上去不雅的手段是最好的解决方案: 下载压缩的数据, 除此之外用 &stringio_modulename; 创建一个类似文件的对象, 并从中解压缩数据。</para> 850 850 </callout> 851 851 </calloutlist> -
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/re.xml
r858 r860 9 9 </abstract> 10 10 <section id="re.intro"> 11 <title>� ��入</title>11 <title>���览</title> 11 11 <para>字符串也有很多方法,可以进行搜索(<function>index</function>, <function>find</function>, 和 <function>count</function>), 替换(<function>replace</function>)和解析 (<function>split</function>), 但他们仅限于处理最简单的情况。搜索方法查找单个和固定编码的子串,并且他们总是大小写敏感的。对一个字符串<varname>s</varname>, 如果要进行大小写不敏感的搜索,则你必须调用 <function>s.lower()</function> 或 <function>s.upper()</function> 将s转换成全小写或者全大写,然后确保搜索串有着相匹配的大小写。<function>replace</function> 和 <function>split</function>方法有着类似的限制。</para> 12 12 <abstract> -
zh-translations/branches/diveintopython-zh-5.4/zh-cn/xml/apihelper.xml
r238 r860 9 9 </abstract> 10 10 <section id="apihelper.divein"> 11 <title>� ��触</title>11 <title>���览</title> 11 11 <abstract> 12 12 <title/>