mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
121 lines
81 KiB
HTML
121 lines
81 KiB
HTML
<div class="body" role="main"><div class="section" id="module-string"><h1><span class="yiyi-st" id="yiyi-10">6.1. <a class="reference internal" href="#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal"><span class="pre">string</span></code></a> - 常用字符串操作</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/string.py">Lib/string.py</a></span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-12">也可以看看</span></p><p><span class="yiyi-st" id="yiyi-13"><a class="reference internal" href="stdtypes.html#textseq"><span>文本序列类型 - str</span></a></span></p><p class="last"><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="stdtypes.html#string-methods"><span>String Methods</span></a></span></p></div><div class="section" id="string-constants"><h2><span class="yiyi-st" id="yiyi-15">6.1.1.</span><span class="yiyi-st" id="yiyi-16">字符串常量</span></h2><p><span class="yiyi-st" id="yiyi-17">在这个模块中定义的常量如下:</span></p><dl class="data"><dt id="string.ascii_letters"><span class="yiyi-st" id="yiyi-18"><code class="descclassname">string.</code><code class="descname">ascii_letters</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-19">与此级联(即包含)的 <a class="reference internal" href="#string.ascii_lowercase" title="string.ascii_lowercase"><code class="xref py py-const docutils literal"><span class="pre">ascii_lowercase</span></code></a> 和 <a class="reference internal" href="#string.ascii_uppercase" title="string.ascii_uppercase"><code class="xref py py-const docutils literal"><span class="pre">ascii_uppercase</span></code></a> 描述见下文。</span><span class="yiyi-st" id="yiyi-20">该值不依赖于本地设置。</span></p></dd></dl><dl class="data"><dt id="string.ascii_lowercase"><span class="yiyi-st" id="yiyi-21"><code class="descclassname">string.</code><code class="descname">ascii_lowercase</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">小写字母 <code class="docutils literal"><span class="pre">'abcdefghijklmnopqrstuvwxyz'</span></code>.</span><span class="yiyi-st" id="yiyi-23">该值不依赖于本地设置以及不会被修改。</span></p></dd></dl><dl class="data"><dt id="string.ascii_uppercase"><span class="yiyi-st" id="yiyi-24"><code class="descclassname">string.</code><code class="descname">ascii_uppercase</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-25">大写字母 <code class="docutils literal"><span class="pre">'ABCDEFGHIJKLMNOPQRSTUVWXYZ'</span></code>.</span><span class="yiyi-st" id="yiyi-26">该值不依赖于本地设置以及不会被修改。</span></p></dd></dl><dl class="data"><dt id="string.digits"><span class="yiyi-st" id="yiyi-27"><code class="descclassname">string.</code><code class="descname">digits</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-28">字符串 <code class="docutils literal"><span class="pre">'0123456789'</span></code>.</span></p></dd></dl><dl class="data"><dt id="string.hexdigits"><span class="yiyi-st" id="yiyi-29"><code class="descclassname">string.</code><code class="descname">hexdigits</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-30">字符串 <code class="docutils literal"><span class="pre">'0123456789abcdefABCDEF'</span></code>.</span></p></dd></dl><dl class="data"><dt id="string.octdigits"><span class="yiyi-st" id="yiyi-31"><code class="descclassname">string.</code><code class="descname">octdigits</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">字符串<code class="docutils literal"><span class="pre">'01234567'</span></code>.</span></p></dd></dl><dl class="data"><dt id="string.punctuation"><span class="yiyi-st" id="yiyi-33"><code class="descclassname">string.</code><code class="descname">punctuation</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">在 <code class="docutils literal"><span class="pre">C语言</span></code> 中被定义为ASCII 字符的字符集合而成的字符串</span></p></dd></dl><dl class="data"><dt id="string.printable"><span class="yiyi-st" id="yiyi-35"><code class="descclassname">string.</code><code class="descname">printable</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-36">被定义为printable的ASCII 字符集合而成的字符串,</span><span class="yiyi-st" id="yiyi-37">这是一个包含了 <a class="reference internal" href="#string.digits" title="string.digits"><code class="xref py py-const docutils literal"><span class="pre">位数</span></code></a>, <a class="reference internal" href="#string.ascii_letters" title="string.ascii_letters"><code class="xref py py-const docutils literal"><span class="pre">ascii字符</span></code></a>, <a class="reference internal" href="#string.punctuation" title="string.punctuation"><code class="xref py py-const docutils literal"><span class="pre">标点符号</span></code></a>, 和<a class="reference internal" href="#string.whitespace" title="string.whitespace"><code class="xref py py-const docutils literal"><span class="pre">空格</span></code></a>.的组合</span></p></dd></dl><dl class="data"><dt id="string.whitespace"><span class="yiyi-st" id="yiyi-38"><code class="descclassname">string.</code><code class="descname">whitespace</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">包含所有ASCII中可当作空白的字符集合而成的字符串。</span><span class="yiyi-st" id="yiyi-40">这包括字符间的空间、 tab、 换行符、 return、 换页符和垂直制表符(vertical tab)。</span></p></dd></dl></div><div class="section" id="custom-string-formatting"><h2><span class="yiyi-st" id="yiyi-41">6.1.2.</span><span class="yiyi-st" id="yiyi-42">自定义字符串格式</span></h2><p><span class="yiyi-st" id="yiyi-43">内建的string类通过<a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal"><span class="pre">format()</span></code></a> 提供了处理复杂变量替换以及值格式化的能力 ,参见<span class="target" id="index-0"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-3101"><strong>PEP 3101</strong></a>.</span><span class="yiyi-st" id="yiyi-44">在<a class="reference internal" href="#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal"><span class="pre">string</span></code></a> 模块中的<a class="reference internal" href="#string.Formatter" title="string.Formatter"><code class="xref py py-class docutils literal"><span class="pre">Formatter</span></code></a>类允许您创建和自定义您自己的字符串格式行为作为内置 <a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal"><span class="pre">format()</span></code></a> 方法使用相同的实现。</span></p><dl class="class"><dt id="string.Formatter"><span class="yiyi-st" id="yiyi-45"><em class="property">class </em><code class="descclassname">string.</code><code class="descname">Formatter</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-46"><a class="reference internal" href="#string.Formatter" title="string.Formatter"><code class="xref py py-class docutils literal"><span class="pre">Formatter</span></code></a> 类具有下列的公共方法:</span></p><dl class="method"><dt id="string.Formatter.format"><span class="yiyi-st" id="yiyi-47"><code class="descname">format</code><span class="sig-paren">(</span><em>format_string</em>, <em>*args</em>, <em>**kwargs</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-48">主要的 API 方法。</span><span class="yiyi-st" id="yiyi-49">该方法需要一个格式化字符串(format string)和任意一组由位置和关键字组成的参数。</span><span class="yiyi-st" id="yiyi-50">这个方法只是 <a class="reference internal" href="#string.Formatter.vformat" title="string.Formatter.vformat"><code class="xref py py-meth docutils literal"><span class="pre">vformat()</span></code></a>方法的一个封装而已.</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-51"><span class="versionmodified">3.5 版弃用︰</span>将格式字符串作为关键字参数 <em>format_string</em> 传递已被弃用。</span></p></div></dd></dl><dl class="method"><dt id="string.Formatter.vformat"><span class="yiyi-st" id="yiyi-52"><code class="descname">vformat</code><span class="sig-paren">(</span><em>format_string</em>, <em>args</em>, <em>kwargs</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">此函数负责实际格式化的工作。</span><span class="yiyi-st" id="yiyi-54">如果你想传递一个预定义的参数字典,而不是使用<code class="docutils literal"><span class="pre">*args</span></code>和<code class="docutils literal"><span class="pre">**kwargs</span></code></span><span class="yiyi-st" id="yiyi-55"><a class="reference internal" href="#string.Formatter.vformat" title="string.Formatter.vformat"><code class="xref py py-meth docutils literal"><span class="pre">vformat()</span></code></a>执行将格式字符串分解为字符数据和替换字段的工作。</span><span class="yiyi-st" id="yiyi-56">它调用下面描述的各种方法。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-57">此外,<a class="reference internal" href="#string.Formatter" title="string.Formatter"><code class="xref py py-class docutils literal"><span class="pre">Formatter</span></code></a>定义了许多要由子类替换的方法:</span></p><dl class="method"><dt id="string.Formatter.parse"><span class="yiyi-st" id="yiyi-58"><code class="descname">parse</code><span class="sig-paren">(</span><em>format_string</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-59">对 format_string 进行循环,并返回可迭代的元组 (<em>literal_text</em>、<em>字段名</em>、 <em>format_spec</em>、<em>转换</em>)。</span><span class="yiyi-st" id="yiyi-60">这由<a class="reference internal" href="#string.Formatter.vformat" title="string.Formatter.vformat"><code class="xref py py-meth docutils literal"><span class="pre">vformat()</span></code></a>使用以将字符串拆分为文本文本或替换字段。</span></p><p><span class="yiyi-st" id="yiyi-61">中元组的值在概念上表示其后更换单个字段的文本范围。</span><span class="yiyi-st" id="yiyi-62">如果没有文本 (有可能发生,如果两个替换领域相继发生),那么<em>literal_text</em>将一个零长度的字符串。</span><span class="yiyi-st" id="yiyi-63">如果没有替换字段,则<em>field_name</em>,<em>format_spec</em>和<em>转换</em>的值将为<code class="docutils literal"><span class="pre">None</span></code>。</span></p></dd></dl><dl class="method"><dt id="string.Formatter.get_field"><span class="yiyi-st" id="yiyi-64"><code class="descname">get_field</code><span class="sig-paren">(</span><em>field_name</em>, <em>args</em>, <em>kwargs</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">给定由<a class="reference internal" href="#string.Formatter.parse" title="string.Formatter.parse"><code class="xref py py-meth docutils literal"><span class="pre">parse()</span></code></a>(见上文)返回的<em>field_name</em>,将其转换为要格式化的对象。</span><span class="yiyi-st" id="yiyi-66">返回一个元组 (obj,used_key)。</span><span class="yiyi-st" id="yiyi-67">默认版本采用<span class="target" id="index-1"></span> <a class="pep reference external" href="https://www.python.org/dev/peps/pep-3101"><strong>PEP 3101</strong></a>中定义的格式的字符串,例如“0 [name]”或“label.title”。</span><span class="yiyi-st" id="yiyi-68"><em>args</em>和<em>kwargs</em>传递到<a class="reference internal" href="#string.Formatter.vformat" title="string.Formatter.vformat"><code class="xref py py-meth docutils literal"><span class="pre">vformat()</span></code></a>。</span><span class="yiyi-st" id="yiyi-69">返回值<em>used_key</em>与<em>键</em>参数和<a class="reference internal" href="#string.Formatter.get_value" title="string.Formatter.get_value"><code class="xref py py-meth docutils literal"><span class="pre">get_value()</span></code></a>具有相同的含义。</span></p></dd></dl><dl class="method"><dt id="string.Formatter.get_value"><span class="yiyi-st" id="yiyi-70"><code class="descname">get_value</code><span class="sig-paren">(</span><em>key</em>, <em>args</em>, <em>kwargs</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-71">检索一个给定的字段值。</span><span class="yiyi-st" id="yiyi-72"><em>Key</em> 参数可以是一个整数或一个字符串。</span><span class="yiyi-st" id="yiyi-73">如果它是一个整数,它表示在 <em>args</em>; 位置参数的索引位置;如果它是一个字符串,那么它表示在 <em>kwags</em> 里的一个命名的参数。</span></p><p><span class="yiyi-st" id="yiyi-74"><em>args</em>参数设置为<a class="reference internal" href="#string.Formatter.vformat" title="string.Formatter.vformat"><code class="xref py py-meth docutils literal"><span class="pre">vformat()</span></code></a>的位置参数列表,<em>kwargs</em>参数设置为关键字参数的字典。</span></p><p><span class="yiyi-st" id="yiyi-75">对于复合字段名称,仅对字段名称的第一个组件调用这些函数;后续组件通过正常的属性和索引操作来处理。</span></p><p><span class="yiyi-st" id="yiyi-76">因此,例如,字段表达式“0.name”将导致<a class="reference internal" href="#string.Formatter.get_value" title="string.Formatter.get_value"><code class="xref py py-meth docutils literal"><span class="pre">get_value()</span></code></a>以<em>键</em>参数0调用。</span><span class="yiyi-st" id="yiyi-77">通过调用内置的<a class="reference internal" href="functions.html#getattr" title="getattr"><code class="xref py py-func docutils literal"><span class="pre">getattr()</span></code></a>函数,<a class="reference internal" href="#string.Formatter.get_value" title="string.Formatter.get_value"><code class="xref py py-meth docutils literal"><span class="pre">get_value()</span></code></a>返回后,将查找<code class="docutils literal"><span class="pre">name</span></code>属性。</span></p><p><span class="yiyi-st" id="yiyi-78">如果索引或关键字引用了不存在的项目,则应引发<a class="reference internal" href="exceptions.html#IndexError" title="IndexError"><code class="xref py py-exc docutils literal"><span class="pre">IndexError</span></code></a>或<a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>。</span></p></dd></dl><dl class="method"><dt id="string.Formatter.check_unused_args"><span class="yiyi-st" id="yiyi-79"><code class="descname">check_unused_args</code><span class="sig-paren">(</span><em>used_args</em>, <em>args</em>, <em>kwargs</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-80">执行检查未使用的参数,如果需要。</span><span class="yiyi-st" id="yiyi-81">对此函数的参数是在格式字符串 (整数位置参数) 和命名参数的字符串,并且对<em>参数</em>和<em>调用</em>传递给 vformat 的引用实际上提到的所有参数键的集合。</span><span class="yiyi-st" id="yiyi-82">从这些参数,可以计算的未使用的参数集。</span><span class="yiyi-st" id="yiyi-83"><a class="reference internal" href="#string.Formatter.check_unused_args" title="string.Formatter.check_unused_args"><code class="xref py py-meth docutils literal"><span class="pre">check_unused_args()</span></code></a>假定在检查失败时引发异常。</span></p></dd></dl><dl class="method"><dt id="string.Formatter.format_field"><span class="yiyi-st" id="yiyi-84"><code class="descname">format_field</code><span class="sig-paren">(</span><em>value</em>, <em>format_spec</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-85"><a class="reference internal" href="#string.Formatter.format_field" title="string.Formatter.format_field"><code class="xref py py-meth docutils literal"><span class="pre">format_field()</span></code></a>只是调用内置的全局<a class="reference internal" href="functions.html#format" title="format"><code class="xref py py-func docutils literal"><span class="pre">format()</span></code></a>。</span><span class="yiyi-st" id="yiyi-86">该方法提供,以便子类可以重写它。</span></p></dd></dl><dl class="method"><dt id="string.Formatter.convert_field"><span class="yiyi-st" id="yiyi-87"><code class="descname">convert_field</code><span class="sig-paren">(</span><em>value</em>, <em>conversion</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">转换给定转换类型的值(由<a class="reference internal" href="#string.Formatter.get_field" title="string.Formatter.get_field"><code class="xref py py-meth docutils literal"><span class="pre">get_field()</span></code></a>返回)(如<a class="reference internal" href="#string.Formatter.parse" title="string.Formatter.parse"><code class="xref py py-meth docutils literal"><span class="pre">parse()</span></code></a>方法返回的元组)。</span><span class="yiyi-st" id="yiyi-89">默认版本理解的 ' (str),'r' (代表) 和 'a' (ascii) 类型转换。</span></p></dd></dl></dd></dl></div><div class="section" id="format-string-syntax"><h2><span class="yiyi-st" id="yiyi-90">6.1.3.</span><span class="yiyi-st" id="yiyi-91">格式字符串语法 </span></h2><p><span class="yiyi-st" id="yiyi-92"><a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal"><span class="pre">str.format()</span></code></a>方法和<a class="reference internal" href="#string.Formatter" title="string.Formatter"><code class="xref py py-class docutils literal"><span class="pre">Formatter</span></code></a> 类在格式化字符串时使用的是相同的语法(<a class="reference internal" href="#string.Formatter" title="string.Formatter"><code class="xref py py-class docutils literal"><span class="pre">Formatter</span></code></a>的子类能够定义它自己的格式字符串的语法)。</span></p><p><span class="yiyi-st" id="yiyi-93">格式字符串包含了被大括号括起来的“替代字段” <code class="docutils literal"><span class="pre">{}</span></code>。</span><span class="yiyi-st" id="yiyi-94">所有括号外的内容均被视作文本,不做任何改变直接按原样输出。</span><span class="yiyi-st" id="yiyi-95">如果你需要在文本中写大括号(此大括号不是语法中使用的,是要输出的文本中本来就有的),要用两个大括号括起来。例如:<code class="docutils literal"><span class="pre">{{</span></code> and <code class="docutils literal"><span class="pre">}}</span></code>.</span></p><p><span class="yiyi-st" id="yiyi-96">替换字段的语法如下所示:</span></p><span class="yiyi-st" id="yiyi-185"> <blockquote> <div><pre> <strong id="grammar-token-replacement_field">replacement_field</strong> ::= "{" [<a class="reference internal" href="#grammar-token-field_name"><code class="xref docutils literal"><span class="pre">field_name</span></code></a>] ["!" <a class="reference internal" href="#grammar-token-conversion"><code class="xref docutils literal"><span class="pre">conversion</span></code></a>] [":" <a class="reference internal" href="#grammar-token-format_spec"><code class="xref docutils literal"><span class="pre">format_spec</span></code></a>] "}" <strong id="grammar-token-field_name">field_name </strong> ::= arg_name ("." <a class="reference internal" href="#grammar-token-attribute_name"><code class="xref docutils literal"><span class="pre">attribute_name</span></code></a> | "[" <a class="reference internal" href="#grammar-token-element_index"><code class="xref docutils literal"><span class="pre">element_index</span></code></a> "]")* <strong id="grammar-token-arg_name">arg_name </strong> ::= [<a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-identifier"><code class="xref docutils literal"><span class="pre">identifier</span></code></a> | <a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a>] <strong id="grammar-token-attribute_name">attribute_name </strong> ::= <a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-identifier"><code class="xref docutils literal"><span class="pre">identifier</span></code></a> <strong id="grammar-token-element_index">element_index </strong> ::= <a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a> | <a class="reference internal" href="#grammar-token-index_string"><code class="xref docutils literal"><span class="pre">index_string</span></code></a> <strong id="grammar-token-index_string">index_string </strong> ::= <any source character except "]"> + <strong id="grammar-token-conversion">conversion </strong> ::= "r" | "s" | "a" <strong id="grammar-token-format_spec">format_spec </strong> ::= <described in the next section> </pre> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-97">用不正式的术语来说,替换字段可以用<em>field_name</em>开始,它指定值要进行格式化并插入到的输出以代替替换字段的对象。</span><span class="yiyi-st" id="yiyi-98"><em>field_name</em>之后可以跟随一个以感叹号<code class="docutils literal"><span class="pre">'!'</span></code>开始的<em>conversion</em>字段,和一个以<code class="docutils literal"><span class="pre">':'</span></code>开始的<em>format_spec</em>。</span><span class="yiyi-st" id="yiyi-99">它们指定替换值的非默认的格式。</span></p><p><span class="yiyi-st" id="yiyi-100">另请参阅<a class="reference internal" href="#formatspec"><span>格式规范迷你语言</span></a>部分。</span></p><p><span class="yiyi-st" id="yiyi-101"><em>field_name</em>的参数<em>arg_name</em>要么是一个数字,要么是一个键。</span><span class="yiyi-st" id="yiyi-102">如果它是一个数字,它是指一个位置参数,而如果它是一个键,它指命名的关键字参数。</span><span class="yiyi-st" id="yiyi-103">如果序列字符串中的数字参数arg_names是像0,1,2,...这样的序列,那它们可以全部省略 (不只是部分),并且此序列0,1,2,......将按那个顺序被自动插入。</span><span class="yiyi-st" id="yiyi-104">因为<em>arg_name</em>不是引号分隔的,所以在格式化字符串中不可能指定任意字典键(例如,字符串<code class="docutils literal"><span class="pre">'10'</span></code>或<code class="docutils literal"><span class="pre">':-]'</span></code>)。</span><span class="yiyi-st" id="yiyi-105"><em>arg_name</em>的后面可以跟随任意数量的索引或属性表达式。</span><span class="yiyi-st" id="yiyi-106">形式<code class="docutils literal"><span class="pre">'.name'</span></code>的表达式使用<a class="reference internal" href="functions.html#getattr" title="getattr"><code class="xref py py-func docutils literal"><span class="pre">getattr()</span></code></a>选择命名属性,而形式<code class="docutils literal"><span class="pre">'[index]'</span></code>使用<a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-func docutils literal"><span class="pre">__getitem__()</span></code></a>进行索引查找。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-107"><span class="versionmodified">在版本3.1中更改:</span>位置参数说明符可以省略,因此<code class="docutils literal"><span class="pre">'{}</span> <span class="pre">{}'</span></code> 等同于<code class="docutils literal"><span class="pre">'{0}</span> <span class="pre">{1}'</span></code>。</span></p></div><p><span class="yiyi-st" id="yiyi-108">一些简单的格式字符串的示例:</span></p><pre><code class="language-python"><span></span><span class="s2">"First, thou shalt count to </span><span class="si">{0}</span><span class="s2">"</span> <span class="c1"># References first positional argument</span>
|
||
<span class="s2">"Bring me a </span><span class="si">{}</span><span class="s2">"</span> <span class="c1"># Implicitly references the first positional argument</span>
|
||
<span class="s2">"From </span><span class="si">{}</span><span class="s2"> to </span><span class="si">{}</span><span class="s2">"</span> <span class="c1"># Same as "From {0} to {1}"</span>
|
||
<span class="s2">"My quest is </span><span class="si">{name}</span><span class="s2">"</span> <span class="c1"># References keyword argument 'name'</span>
|
||
<span class="s2">"Weight in tons </span><span class="si">{0.weight}</span><span class="s2">"</span> <span class="c1"># 'weight' attribute of first positional arg</span>
|
||
<span class="s2">"Units destroyed: </span><span class="si">{players[0]}</span><span class="s2">"</span> <span class="c1"># First element of keyword argument 'players'.</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-109"><em>conversion</em>字段导致格式化前进行类型转换。</span><span class="yiyi-st" id="yiyi-110">通常,格式化值的工作是通过值本身的<a class="reference internal" href="../reference/datamodel.html#object.__format__" title="object.__format__"><code class="xref py py-meth docutils literal"><span class="pre">__format__()</span></code></a>方法完成的。</span><span class="yiyi-st" id="yiyi-111">然而,在某些情况下是需要强制使一个类型格式化为字符串,重写其自己定义的格式。</span><span class="yiyi-st" id="yiyi-112">通过在调用<a class="reference internal" href="../reference/datamodel.html#object.__format__" title="object.__format__"><code class="xref py py-meth docutils literal"><span class="pre">__format__()</span></code></a>之前将该值转换为字符串,将绕过正常的格式化逻辑。</span></p><p><span class="yiyi-st" id="yiyi-113">目前支持三个转换标志:<code class="docutils literal"><span class="pre">'!s'</span></code>调用值的<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal"><span class="pre">str()</span></code></a>,<code class="docutils literal"><span class="pre">'!r'</span></code>调用<a class="reference internal" href="functions.html#repr" title="repr"><code class="xref py py-func docutils literal"><span class="pre">repr()</span></code></a>,<code class="docutils literal"><span class="pre">'!a'</span></code>调用<a class="reference internal" href="functions.html#ascii" title="ascii"><code class="xref py py-func docutils literal"><span class="pre">ascii()</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-114">一些例子︰</span></p><pre><code class="language-python"><span></span><span class="s2">"Harold's a clever </span><span class="si">{0!s}</span><span class="s2">"</span> <span class="c1"># Calls str() on the argument first</span>
|
||
<span class="s2">"Bring out the holy </span><span class="si">{name!r}</span><span class="s2">"</span> <span class="c1"># Calls repr() on the argument first</span>
|
||
<span class="s2">"More </span><span class="si">{!a}</span><span class="s2">"</span> <span class="c1"># Calls ascii() on the argument first</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-115"><em>format_spec</em>字段包含值如何展现的说明,包括这些细节如字段宽度、对齐、 填充、 小数精度等。</span><span class="yiyi-st" id="yiyi-116">每个值类型可以定义它自己的"格式设置迷你语言"或<em>format_spec</em>的解释。</span></p><p><span class="yiyi-st" id="yiyi-117">大多数内置类型支持一种共同的格式设置迷你语言下, 一节所述。</span></p><p><span class="yiyi-st" id="yiyi-118"><em>format_spec</em>字段内部还可以包含嵌套的替换字段。</span><span class="yiyi-st" id="yiyi-119">这些嵌套替换字段可能包含字段名称,转换标志和格式规范,但不允许更深的嵌套。</span><span class="yiyi-st" id="yiyi-120">在 format_spec 内的替换字段替换之前的<em>format_spec</em>字符串被解释。</span><span class="yiyi-st" id="yiyi-121">这将允许动态地指定的值的格式。</span></p><p><span class="yiyi-st" id="yiyi-122">有关示例,请参阅<a class="reference internal" href="#formatexamples"><span>Format examples</span></a>部分。</span></p><div class="section" id="format-specification-mini-language"><h3><span class="yiyi-st" id="yiyi-123">6.1.3.1.</span><span class="yiyi-st" id="yiyi-124">格式规范迷你语言</span></h3><p><span class="yiyi-st" id="yiyi-125">"格式化规范"中用于替换字段包含在一个格式字符串来定义如何个别值给出了使用 (请参见 <a class="reference internal" href="#formatstrings"><span>字符串格式化语法</span></a>)。</span><span class="yiyi-st" id="yiyi-126">他们还可以通过直接向内置 <a class="reference internal" href="functions.html#format" title="format"><code class="xref py py-func docutils literal"><span class="pre">format ()</span></code></a> 函数。</span><span class="yiyi-st" id="yiyi-127">每个可格式化的类型须定义格式化规范是如何被解释。</span></p><p><span class="yiyi-st" id="yiyi-128">大多数内置类型都实现了以下的格式描述选项中,虽然一些格式选项只支持数值类型。</span></p><p><span class="yiyi-st" id="yiyi-129">一般的约定是,空格式字符串(<code class="docutils literal"><span class="pre">""</span></code>)产生的结果与在该值上调用<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal"><span class="pre">str()</span></code></a>的结果相同。</span><span class="yiyi-st" id="yiyi-130">非空格式字符串通常会修改结果。</span></p><p><span class="yiyi-st" id="yiyi-131"><em>标准格式说明符</em>的一般形式为:</span></p><pre>
|
||
<strong id="id1">format_spec</strong> ::= [[<a class="reference internal" href="#grammar-token-fill"><code class="xref docutils literal"><span class="pre">fill</span></code></a>]<a class="reference internal" href="#grammar-token-align"><code class="xref docutils literal"><span class="pre">align</span></code></a>][<a class="reference internal" href="#grammar-token-sign"><code class="xref docutils literal"><span class="pre">sign</span></code></a>][#][0][<a class="reference internal" href="#grammar-token-width"><code class="xref docutils literal"><span class="pre">width</span></code></a>][,][.<a class="reference internal" href="#grammar-token-precision"><code class="xref docutils literal"><span class="pre">precision</span></code></a>][<a class="reference internal" href="#grammar-token-type"><code class="xref docutils literal"><span class="pre">type</span></code></a>]
|
||
<strong id="grammar-token-fill">fill </strong> ::= <any character>
|
||
<strong id="grammar-token-align">align </strong> ::= "<" | ">" | "=" | "^"
|
||
<strong id="grammar-token-sign">sign </strong> ::= "+" | "-" | " "
|
||
<strong id="grammar-token-width">width </strong> ::= <a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a>
|
||
<strong id="grammar-token-precision">precision </strong> ::= <a class="reference internal" href="../reference/lexical_analysis.html#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a>
|
||
<strong id="grammar-token-type">type </strong> ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
|
||
</pre><p><span class="yiyi-st" id="yiyi-132">如果指定了一个无效的<em>对齐</em>值,它可以以可以是任何字符和空间,如果省略默认<em>填充</em>字符开头。</span><span class="yiyi-st" id="yiyi-133">It is not possible to use a literal curly brace (“<code class="docutils literal"><span class="pre">{</span></code>” or “<code class="docutils literal"><span class="pre">}</span></code>”) as the <em>fill</em> character when using the <a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal"><span class="pre">str.format()</span></code></a> method. </span><span class="yiyi-st" id="yiyi-134">但是,可以插入带有嵌套替换字段的大括号。</span><span class="yiyi-st" id="yiyi-135">此限制不会影响<a class="reference internal" href="functions.html#format" title="format"><code class="xref py py-func docutils literal"><span class="pre">format()</span></code></a>函数。</span></p><p><span class="yiyi-st" id="yiyi-136">不同的对齐方式选项的含义如下所示:</span></p><span class="yiyi-st" id="yiyi-162"> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%"/> <col width="87%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Option</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'<'</span></code></td> <td>Forces the field to be left-aligned within the available space (this is the default for most objects).</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'>'</span></code></td> <td>Forces the field to be right-aligned within the available space (this is the default for numbers).</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'='</span></code></td> <td>Forces the padding to be placed after the sign (if any) but before the digits. This is used for printing fields in the form ‘+000000120’. This alignment option is only valid for numeric types. It becomes the default when ‘0’ immediately precedes the field width.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'^'</span></code></td> <td>Forces the field to be centered within the available space.</td> </tr> </tbody> </table> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-137">请注意除非定义最小字段宽度,则字段宽度总是将大小相同的数据,来填满它,以便对齐选项已经没有任何意义在这种情况下。</span></p><p><span class="yiyi-st" id="yiyi-138"><em>符号</em>选项只是有效的数字类型,并且可以将下列操作之一:</span></p><span class="yiyi-st" id="yiyi-163"> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%"/> <col width="87%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Option</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'+'</span></code></td> <td>indicates that a sign should be used for both positive as well as negative numbers.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'-'</span></code></td> <td>indicates that a sign should be used only for negative numbers (this is the default behavior).</td> </tr> <tr class="row-even"><td>space</td> <td>indicates that a leading space should be used on positive numbers, and a minus sign on negative numbers.</td> </tr> </tbody> </table> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-139"><code class="docutils literal"><span class="pre">'#'</span></code>选项使“备用表单”用于转换。</span><span class="yiyi-st" id="yiyi-140">不同类型的替代形式定义不同。</span><span class="yiyi-st" id="yiyi-141">此选项仅对整数,浮点,复数和十进制类型有效。</span><span class="yiyi-st" id="yiyi-142">对于整数,当使用二进制,八进制或十六进制输出时,此选项添加相应的前缀<code class="docutils literal"><span class="pre">'0b'</span></code>,<code class="docutils literal"><span class="pre">'0o'</span></code>或<code class="docutils literal"><span class="pre">'0x'</span></code></span><span class="yiyi-st" id="yiyi-143">对于浮点数,复数和小数,备用形式导致转换结果始终包含小数点字符,即使后面没有数字。</span><span class="yiyi-st" id="yiyi-144">通常,只有在数字跟随它后,这些转换的结果中才会出现小数点字符。</span><span class="yiyi-st" id="yiyi-145">此外,对于<code class="docutils literal"><span class="pre">'g'</span></code>和<code class="docutils literal"><span class="pre">'G'</span></code>转换,尾随零不会从结果中删除。</span></p><p><span class="yiyi-st" id="yiyi-146"><code class="docutils literal"><span class="pre">','</span></code>选项指示对于千位分隔符使用逗号。</span><span class="yiyi-st" id="yiyi-147">对于区域设置感知分隔符,请改用<code class="docutils literal"><span class="pre">'n'</span></code>整数呈现类型。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-148"><span class="versionmodified">在版本3.1中已更改:</span>添加了<code class="docutils literal"><span class="pre">','</span></code>选项(另请参阅<span class="target" id="index-2"></span> <a class="pep reference external" href="https://www.python.org/dev/peps/pep-0378"><strong>PEP 378</strong></a>)。</span></p></div><p><span class="yiyi-st" id="yiyi-149"><em>宽度</em>是定义最小字段宽度的十进制整数。</span><span class="yiyi-st" id="yiyi-150">如果未指定,那么将由内容决定字段宽度。</span></p><p><span class="yiyi-st" id="yiyi-151">当未给出显式对齐时,通过零(<code class="docutils literal"><span class="pre">'0'</span></code>)字符在<em>width</em>字段前面启用数字类型的符号感知填零。</span><span class="yiyi-st" id="yiyi-152">这等同于<code class="docutils literal"><span class="pre">'='</span></code>类型的<em>对齐</em>类型的<code class="docutils literal"><span class="pre">'0'</span></code>的<em>填充</em>字符。</span></p><p><span class="yiyi-st" id="yiyi-153">The <em>precision</em> is a decimal number indicating how many digits should be displayed after the decimal point for a floating point value formatted with <code class="docutils literal"><span class="pre">'f'</span></code> and <code class="docutils literal"><span class="pre">'F'</span></code>, or before and after the decimal point for a floating point value formatted with <code class="docutils literal"><span class="pre">'g'</span></code> or <code class="docutils literal"><span class="pre">'G'</span></code>. </span><span class="yiyi-st" id="yiyi-154">对于非数字类型字段指示的最大字段大小 — — 换句话说,将从字段内容使用多少个字符。</span><span class="yiyi-st" id="yiyi-155"><em>精度</em>是不允许使用整数值。</span></p><p><span class="yiyi-st" id="yiyi-156">最后,<em>类型</em>确定数据的显示方式。</span></p><p><span class="yiyi-st" id="yiyi-157">可用字符串演示文稿类型有:</span></p><span class="yiyi-st" id="yiyi-164"> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%"/> <col width="87%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Type</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'s'</span></code></td> <td>String format. This is the default type for strings and may be omitted.</td> </tr> <tr class="row-odd"><td>None</td> <td>The same as <code class="docutils literal"><span class="pre">'s'</span></code>.</td> </tr> </tbody> </table> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-158">可用整数演示文稿类型有:</span></p><span class="yiyi-st" id="yiyi-165"> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%"/> <col width="87%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Type</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'b'</span></code></td> <td>Binary format. Outputs the number in base 2.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'c'</span></code></td> <td>Character. Converts the integer to the corresponding unicode character before printing.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'d'</span></code></td> <td>Decimal Integer. Outputs the number in base 10.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'o'</span></code></td> <td>Octal format. Outputs the number in base 8.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'x'</span></code></td> <td>Hex format. Outputs the number in base 16, using lower- case letters for the digits above 9.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'X'</span></code></td> <td>Hex format. Outputs the number in base 16, using upper- case letters for the digits above 9.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'n'</span></code></td> <td>Number. This is the same as <code class="docutils literal"><span class="pre">'d'</span></code>, except that it uses the current locale setting to insert the appropriate number separator characters.</td> </tr> <tr class="row-odd"><td>None</td> <td>The same as <code class="docutils literal"><span class="pre">'d'</span></code>.</td> </tr> </tbody> </table> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-159">除了上述表示类型,整数可以用下面列出的浮点表示类型格式化(除了<code class="docutils literal"><span class="pre">'n'</span></code>和None)。</span><span class="yiyi-st" id="yiyi-160">这样做时,在格式化之前,<a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-func docutils literal"><span class="pre">float()</span></code></a>用于将整数转换为浮点数。</span></p><p><span class="yiyi-st" id="yiyi-161">可用的演示文稿类型为浮点数和小数的值有:</span></p><span class="yiyi-st" id="yiyi-166"> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%"/> <col width="87%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Type</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'e'</span></code></td> <td>Exponent notation. Prints the number in scientific notation using the letter ‘e’ to indicate the exponent. The default precision is <code class="docutils literal"><span class="pre">6</span></code>.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'E'</span></code></td> <td>Exponent notation. Same as <code class="docutils literal"><span class="pre">'e'</span></code> except it uses an upper case ‘E’ as the separator character.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'f'</span></code></td> <td>Fixed point. Displays the number as a fixed-point number. The default precision is <code class="docutils literal"><span class="pre">6</span></code>.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'F'</span></code></td> <td>Fixed point. Same as <code class="docutils literal"><span class="pre">'f'</span></code>, but converts <code class="docutils literal"><span class="pre">nan</span></code> to <code class="docutils literal"><span class="pre">NAN</span></code> and <code class="docutils literal"><span class="pre">inf</span></code> to <code class="docutils literal"><span class="pre">INF</span></code>.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'g'</span></code></td> <td><p class="first">General format. For a given precision <code class="docutils literal"><span class="pre">p</span> <span class="pre">>=</span> <span class="pre">1</span></code>, this rounds the number to <code class="docutils literal"><span class="pre">p</span></code> significant digits and then formats the result in either fixed-point format or in scientific notation, depending on its magnitude.</p> <p>The precise rules are as follows: suppose that the result formatted with presentation type <code class="docutils literal"><span class="pre">'e'</span></code> and precision <code class="docutils literal"><span class="pre">p-1</span></code> would have exponent <code class="docutils literal"><span class="pre">exp</span></code>. Then if <code class="docutils literal"><span class="pre">-4</span> <span class="pre"><=</span> <span class="pre">exp</span> <span class="pre"><</span> <span class="pre">p</span></code>, the number is formatted with presentation type <code class="docutils literal"><span class="pre">'f'</span></code> and precision <code class="docutils literal"><span class="pre">p-1-exp</span></code>. Otherwise, the number is formatted with presentation type <code class="docutils literal"><span class="pre">'e'</span></code> and precision <code class="docutils literal"><span class="pre">p-1</span></code>. In both cases insignificant trailing zeros are removed from the significand, and the decimal point is also removed if there are no remaining digits following it.</p> <p>Positive and negative infinity, positive and negative zero, and nans, are formatted as <code class="docutils literal"><span class="pre">inf</span></code>, <code class="docutils literal"><span class="pre">-inf</span></code>, <code class="docutils literal"><span class="pre">0</span></code>, <code class="docutils literal"><span class="pre">-0</span></code> and <code class="docutils literal"><span class="pre">nan</span></code> respectively, regardless of the precision.</p> <p class="last">A precision of <code class="docutils literal"><span class="pre">0</span></code> is treated as equivalent to a precision of <code class="docutils literal"><span class="pre">1</span></code>. The default precision is <code class="docutils literal"><span class="pre">6</span></code>.</p> </td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'G'</span></code></td> <td>General format. Same as <code class="docutils literal"><span class="pre">'g'</span></code> except switches to <code class="docutils literal"><span class="pre">'E'</span></code> if the number gets too large. The representations of infinity and NaN are uppercased, too.</td> </tr> <tr class="row-even"><td><code class="docutils literal"><span class="pre">'n'</span></code></td> <td>Number. This is the same as <code class="docutils literal"><span class="pre">'g'</span></code>, except that it uses the current locale setting to insert the appropriate number separator characters.</td> </tr> <tr class="row-odd"><td><code class="docutils literal"><span class="pre">'%'</span></code></td> <td>Percentage. Multiplies the number by 100 and displays in fixed (<code class="docutils literal"><span class="pre">'f'</span></code>) format, followed by a percent sign.</td> </tr> <tr class="row-even"><td>None</td> <td>Similar to <code class="docutils literal"><span class="pre">'g'</span></code>, except that fixed-point notation, when used, has at least one digit past the decimal point. The default precision is as high as needed to represent the particular value. The overall effect is to match the output of <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal"><span class="pre">str()</span></code></a> as altered by the other format modifiers.</td> </tr> </tbody> </table> </div></blockquote></span></div><div class="section" id="format-examples"><h3><span class="yiyi-st" id="yiyi-167">6.1.3.2.</span><span class="yiyi-st" id="yiyi-168">格式示例</span></h3><p><span class="yiyi-st" id="yiyi-169">本节包含<a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal"><span class="pre">str.format()</span></code></a>语法和与旧的<code class="docutils literal"><span class="pre">%</span></code>格式比较的示例。</span></p><p><span class="yiyi-st" id="yiyi-170">在大多数情况下,语法类似于旧的<code class="docutils literal"><span class="pre">%</span></code>格式,添加了<code class="docutils literal"><span class="pre">{}</span></code>和替代<code class="docutils literal"><span class="pre">%</span></code>的<code class="docutils literal"><span class="pre">:</span></code>。</span><span class="yiyi-st" id="yiyi-171">例如,<code class="docutils literal"><span class="pre">'%03.2f'</span></code>可以转换为<code class="docutils literal"><span class="pre">'{:03.2f}'</span></code>。</span></p><p><span class="yiyi-st" id="yiyi-172">新的格式语法还支持新的和不同的选项,以下示例中所示。</span></p><p><span class="yiyi-st" id="yiyi-173">按位置访问参数:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s1">'</span><span class="si">{0}</span><span class="s1">, </span><span class="si">{1}</span><span class="s1">, </span><span class="si">{2}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'a'</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">)</span>
|
||
<span class="go">'a, b, c'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{}</span><span class="s1">, </span><span class="si">{}</span><span class="s1">, </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'a'</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">)</span> <span class="c1"># 3.1+ only</span>
|
||
<span class="go">'a, b, c'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{2}</span><span class="s1">, </span><span class="si">{1}</span><span class="s1">, </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'a'</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">)</span>
|
||
<span class="go">'c, b, a'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{2}</span><span class="s1">, </span><span class="si">{1}</span><span class="s1">, </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="s1">'abc'</span><span class="p">)</span> <span class="c1"># unpacking argument sequence</span>
|
||
<span class="go">'c, b, a'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{0}{1}{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'abra'</span><span class="p">,</span> <span class="s1">'cad'</span><span class="p">)</span> <span class="c1"># arguments' indices can be repeated</span>
|
||
<span class="go">'abracadabra'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-174">按名称访问参数:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s1">'Coordinates: </span><span class="si">{latitude}</span><span class="s1">, </span><span class="si">{longitude}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">latitude</span><span class="o">=</span><span class="s1">'37.24N'</span><span class="p">,</span> <span class="n">longitude</span><span class="o">=</span><span class="s1">'-115.81W'</span><span class="p">)</span>
|
||
<span class="go">'Coordinates: 37.24N, -115.81W'</span>
|
||
<span class="gp">>>> </span><span class="n">coord</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'latitude'</span><span class="p">:</span> <span class="s1">'37.24N'</span><span class="p">,</span> <span class="s1">'longitude'</span><span class="p">:</span> <span class="s1">'-115.81W'</span><span class="p">}</span>
|
||
<span class="gp">>>> </span><span class="s1">'Coordinates: </span><span class="si">{latitude}</span><span class="s1">, </span><span class="si">{longitude}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">coord</span><span class="p">)</span>
|
||
<span class="go">'Coordinates: 37.24N, -115.81W'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-175">访问这些参数的属性:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="mi">3</span><span class="o">-</span><span class="mi">5</span><span class="n">j</span>
|
||
<span class="gp">>>> </span><span class="p">(</span><span class="s1">'The complex number </span><span class="si">{0}</span><span class="s1"> is formed from the real part </span><span class="si">{0.real}</span><span class="s1"> '</span>
|
||
<span class="gp">... </span> <span class="s1">'and the imaginary part </span><span class="si">{0.imag}</span><span class="s1">.'</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
||
<span class="go">'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Point</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="s1">'Point(</span><span class="si">{self.x}</span><span class="s1">, </span><span class="si">{self.y}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="nb">str</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
|
||
<span class="go">'Point(4, 2)'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-176">访问参数的项:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="n">coord</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="s1">'X: </span><span class="si">{0[0]}</span><span class="s1">; Y: </span><span class="si">{0[1]}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coord</span><span class="p">)</span>
|
||
<span class="go">'X: 3; Y: 5'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-177">替换<code class="docutils literal"><span class="pre">%s</span></code>和<code class="docutils literal"><span class="pre">%r</span></code>:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s2">"repr() shows quotes: </span><span class="si">{!r}</span><span class="s2">; str() doesn't: </span><span class="si">{!s}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'test1'</span><span class="p">,</span> <span class="s1">'test2'</span><span class="p">)</span>
|
||
<span class="go">"repr() shows quotes: 'test1'; str() doesn't: test2"</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-178">对齐的文本和指定的宽度:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s1">'</span><span class="si">{:<30}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'left aligned'</span><span class="p">)</span>
|
||
<span class="go">'left aligned '</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:>30}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'right aligned'</span><span class="p">)</span>
|
||
<span class="go">' right aligned'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:^30}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'centered'</span><span class="p">)</span>
|
||
<span class="go">' centered '</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:*^30}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'centered'</span><span class="p">)</span> <span class="c1"># use '*' as a fill char</span>
|
||
<span class="go">'***********centered***********'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-179">替换<code class="docutils literal"><span class="pre">%+f</span></code>,<code class="docutils literal"><span class="pre">%-f</span></code>和<code class="docutils literal"><span class="pre">%</span> <span class="pre">f</span></code>,并指定一个符号:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s1">'</span><span class="si">{:+f}</span><span class="s1">; </span><span class="si">{:+f}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mf">3.14</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.14</span><span class="p">)</span> <span class="c1"># show it always</span>
|
||
<span class="go">'+3.140000; -3.140000'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{: f}</span><span class="s1">; </span><span class="si">{: f}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mf">3.14</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.14</span><span class="p">)</span> <span class="c1"># show a space for positive numbers</span>
|
||
<span class="go">' 3.140000; -3.140000'</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:-f}</span><span class="s1">; </span><span class="si">{:-f}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mf">3.14</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.14</span><span class="p">)</span> <span class="c1"># show only the minus -- same as '{:f}; {:f}'</span>
|
||
<span class="go">'3.140000; -3.140000'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-180">替换<code class="docutils literal"><span class="pre">%x</span></code>和<code class="docutils literal"><span class="pre">%o</span></code>并将值转换为不同的基数:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="c1"># format also supports binary numbers</span>
|
||
<span class="gp">>>> </span><span class="s2">"int: </span><span class="si">{0:d}</span><span class="s2">; hex: </span><span class="si">{0:x}</span><span class="s2">; oct: </span><span class="si">{0:o}</span><span class="s2">; bin: </span><span class="si">{0:b}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
|
||
<span class="go">'int: 42; hex: 2a; oct: 52; bin: 101010'</span>
|
||
<span class="gp">>>> </span><span class="c1"># with 0x, 0o, or 0b as prefix:</span>
|
||
<span class="gp">>>> </span><span class="s2">"int: </span><span class="si">{0:d}</span><span class="s2">; hex: </span><span class="si">{0:#x}</span><span class="s2">; oct: </span><span class="si">{0:#o}</span><span class="s2">; bin: </span><span class="si">{0:#b}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
|
||
<span class="go">'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-181">使用逗号作为千位分隔符:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="s1">'</span><span class="si">{:,}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">1234567890</span><span class="p">)</span>
|
||
<span class="go">'1,234,567,890'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-182">表示百分比:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="n">points</span> <span class="o">=</span> <span class="mi">19</span>
|
||
<span class="gp">>>> </span><span class="n">total</span> <span class="o">=</span> <span class="mi">22</span>
|
||
<span class="gp">>>> </span><span class="s1">'Correct answers: </span><span class="si">{:.2%}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">points</span><span class="o">/</span><span class="n">total</span><span class="p">)</span>
|
||
<span class="go">'Correct answers: 86.36%'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-183">使用特定于类型的格式:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">datetime</span>
|
||
<span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2010</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">58</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="s1">'{:%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
|
||
<span class="go">'2010-07-04 12:15:58'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-184">嵌套参数和更复杂的例子:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">align</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s1">'<^>'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'left'</span><span class="p">,</span> <span class="s1">'center'</span><span class="p">,</span> <span class="s1">'right'</span><span class="p">]):</span>
|
||
<span class="gp">... </span> <span class="s1">'{0:</span><span class="si">{fill}{align}</span><span class="s1">16}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">align</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="n">align</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">'left<<<<<<<<<<<<'</span>
|
||
<span class="go">'^^^^^center^^^^^'</span>
|
||
<span class="go">'>>>>>>>>>>>right'</span>
|
||
<span class="go">>>></span>
|
||
<span class="gp">>>> </span><span class="n">octets</span> <span class="o">=</span> <span class="p">[</span><span class="mi">192</span><span class="p">,</span> <span class="mi">168</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
|
||
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:02X}{:02X}{:02X}{:02X}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">octets</span><span class="p">)</span>
|
||
<span class="go">'C0A80001'</span>
|
||
<span class="gp">>>> </span><span class="nb">int</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
|
||
<span class="go">3232235521</span>
|
||
<span class="go">>>></span>
|
||
<span class="gp">>>> </span><span class="n">width</span> <span class="o">=</span> <span class="mi">5</span>
|
||
<span class="gp">>>> </span><span class="k">for</span> <span class="n">num</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">12</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">for</span> <span class="n">base</span> <span class="ow">in</span> <span class="s1">'dXob'</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'{0:</span><span class="si">{width}{base}</span><span class="s1">}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="n">base</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="go"> 5 5 5 101</span>
|
||
<span class="go"> 6 6 6 110</span>
|
||
<span class="go"> 7 7 7 111</span>
|
||
<span class="go"> 8 8 10 1000</span>
|
||
<span class="go"> 9 9 11 1001</span>
|
||
<span class="go"> 10 A 12 1010</span>
|
||
<span class="go"> 11 B 13 1011</span>
|
||
</code></pre></div></div><div class="section" id="template-strings"><h2><span class="yiyi-st" id="yiyi-186">6.1.4.</span><span class="yiyi-st" id="yiyi-187">模板字符串</span></h2><p><span class="yiyi-st" id="yiyi-188">模板提供了更简单的字符串替换,如<span class="target" id="index-3"></span> <a class="pep reference external" href="https://www.python.org/dev/peps/pep-0292"><strong>PEP 292</strong></a>中所述。</span><span class="yiyi-st" id="yiyi-189">除了正常的基于<code class="docutils literal"><span class="pre">%</span></code>的替换,模板使用支持基于<code class="docutils literal"><span class="pre">$</span></code>以下规则的替换:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-190"><code class="docutils literal"><span class="pre">$$</span></code>是一个转义符;它被替换为单个<code class="docutils literal"><span class="pre">$</span></code>。</span></li><li><span class="yiyi-st" id="yiyi-191"><code class="docutils literal"><span class="pre">$identifier</span></code>命名与<code class="docutils literal"><span class="pre">"identifier"</span></code>的映射键匹配的替换占位符。</span><span class="yiyi-st" id="yiyi-192">默认情况下,<code class="docutils literal"><span class="pre">"identifier"</span></code>限于以下划线或ASCII字母开头的任何不区分大小写的ASCII字母数字字符串(包括下划线)。</span><span class="yiyi-st" id="yiyi-193"><code class="docutils literal"><span class="pre">$</span></code>字符后面的第一个非标识符字符终止此占位符规范。</span></li><li><span class="yiyi-st" id="yiyi-194"><code class="docutils literal"><span class="pre">${identifier}</span></code>等效于<code class="docutils literal"><span class="pre">$identifier</span></code>。</span><span class="yiyi-st" id="yiyi-195">当有效的标识符字符位于占位符之后但不是占位符的一部分时,例如<code class="docutils literal"><span class="pre">"${noun}ification"</span></code>时,此属性是必需的。</span></li></ul><p><span class="yiyi-st" id="yiyi-196">在字符串中任何其他外观<code class="docutils literal"><span class="pre">$</span></code>将导致<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a>被引发。</span></p><p><span class="yiyi-st" id="yiyi-197"><a class="reference internal" href="#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal"><span class="pre">string</span></code></a>模块提供了一个实现这些规则的<a class="reference internal" href="#string.Template" title="string.Template"><code class="xref py py-class docutils literal"><span class="pre">Template</span></code></a>类。</span><span class="yiyi-st" id="yiyi-198"><a class="reference internal" href="#string.Template" title="string.Template"><code class="xref py py-class docutils literal"><span class="pre">Template</span></code></a>的方法是:</span></p><dl class="class"><dt id="string.Template"><span class="yiyi-st" id="yiyi-199"><em class="property">class </em><code class="descclassname">string.</code><code class="descname">Template</code><span class="sig-paren">(</span><em>template</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-200">构造函数采用单个参数即模板字符串。</span></p><dl class="method"><dt id="string.Template.substitute"><span class="yiyi-st" id="yiyi-201"><code class="descname">substitute</code><span class="sig-paren">(</span><em>mapping</em>, <em>**kwds</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-202">执行模板替换,返回一个新字符串。</span><span class="yiyi-st" id="yiyi-203"><em>映射</em>是任何类似于字典对象与键匹配的模板中的占位符。</span><span class="yiyi-st" id="yiyi-204">或者,您可以提供关键字参数,这些关键字在哪里的占位符。</span><span class="yiyi-st" id="yiyi-205">当给定<em>映射</em>和<em>kwds</em>并且存在重复时,来自<em>kwds</em>的占位符优先。</span></p></dd></dl><dl class="method"><dt id="string.Template.safe_substitute"><span class="yiyi-st" id="yiyi-206"><code class="descname">safe_substitute</code><span class="sig-paren">(</span><em>mapping</em>, <em>**kwds</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-207">像<a class="reference internal" href="#string.Template.substitute" title="string.Template.substitute"><code class="xref py py-meth docutils literal"><span class="pre">substitute()</span></code></a>,除了如果<em>映射</em>和<em>kwds</em>缺少占位符,而不是引发<a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>异常,原始占位符将出现在生成的字符串中。</span><span class="yiyi-st" id="yiyi-208">此外,与<a class="reference internal" href="#string.Template.substitute" title="string.Template.substitute"><code class="xref py py-meth docutils literal"><span class="pre">substitute()</span></code></a>不同,<code class="docutils literal"><span class="pre">$</span></code>的任何其他外观将简单地返回<code class="docutils literal"><span class="pre">$</span></code>,而不是提高<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a> 。</span></p><p><span class="yiyi-st" id="yiyi-209">虽然其他例外情况仍然可能发生,但这种方法称为"安全"因为替换总是试图返回一个可用的字符串,而不是引发异常。</span><span class="yiyi-st" id="yiyi-210">在另一种意义上,<a class="reference internal" href="#string.Template.safe_substitute" title="string.Template.safe_substitute"><code class="xref py py-meth docutils literal"><span class="pre">safe_substitute()</span></code></a>可能是安全之外的任何东西,因为它会默默地忽略包含悬挂分隔符,不匹配的大括号或不是有效的Python标识符的占位符的畸形模板。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-211"><a class="reference internal" href="#string.Template" title="string.Template"><code class="xref py py-class docutils literal"><span class="pre">Template</span></code></a>实例还提供一个公共数据属性:</span></p><dl class="attribute"><dt id="string.Template.template"><span class="yiyi-st" id="yiyi-212"><code class="descname">template</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-213">这是传递给构造函数的<em>模板</em>参数的对象。</span><span class="yiyi-st" id="yiyi-214">一般情况下,你不能改变它,除了不执行的只读访问权限。</span></p></dd></dl></dd></dl><p><span class="yiyi-st" id="yiyi-215">这里是如何使用模板的示例:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">string</span> <span class="k">import</span> <span class="n">Template</span>
|
||
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="s1">'$who likes $what'</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">substitute</span><span class="p">(</span><span class="n">who</span><span class="o">=</span><span class="s1">'tim'</span><span class="p">,</span> <span class="n">what</span><span class="o">=</span><span class="s1">'kung pao'</span><span class="p">)</span>
|
||
<span class="go">'tim likes kung pao'</span>
|
||
<span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">who</span><span class="o">=</span><span class="s1">'tim'</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="n">Template</span><span class="p">(</span><span class="s1">'Give $who $100'</span><span class="p">)</span><span class="o">.</span><span class="n">substitute</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">ValueError</span>: <span class="n">Invalid placeholder in string: line 1, col 11</span>
|
||
<span class="gp">>>> </span><span class="n">Template</span><span class="p">(</span><span class="s1">'$who likes $what'</span><span class="p">)</span><span class="o">.</span><span class="n">substitute</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">KeyError</span>: <span class="n">'what'</span>
|
||
<span class="gp">>>> </span><span class="n">Template</span><span class="p">(</span><span class="s1">'$who likes $what'</span><span class="p">)</span><span class="o">.</span><span class="n">safe_substitute</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
|
||
<span class="go">'tim likes $what'</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-216">高级用法:您可以派生<a class="reference internal" href="#string.Template" title="string.Template"><code class="xref py py-class docutils literal"><span class="pre">Template</span></code></a>的子类来自定义占位符语法,定界符字符或用于解析模板字符串的整个正则表达式。</span><span class="yiyi-st" id="yiyi-217">若要做到这一点,可以重写这些类的属性:</span></p><ul><li><p class="first"><span class="yiyi-st" id="yiyi-218"><em>delimiter</em> —— 这是描述占位符引入分隔符的文字字符串。</span><span class="yiyi-st" id="yiyi-219">默认值为<code class="docutils literal"><span class="pre">$</span></code>。</span><span class="yiyi-st" id="yiyi-220">注意,这<em>不</em>应该是正则表达式,因为实现将根据需要调用<a class="reference internal" href="re.html#re.escape" title="re.escape"><code class="xref py py-meth docutils literal"><span class="pre">re.escape()</span></code></a>。</span></p></li><li><p class="first"><span class="yiyi-st" id="yiyi-221"><em>idpattern</em> - 这是描述非支撑占位符模式的正则表达式(大括号会根据需要自动添加)。</span><span class="yiyi-st" id="yiyi-222">默认值为正则表达式<code class="docutils literal"><span class="pre">[_a-z][_a-z0-9]*</span></code>。</span></p></li><li><p class="first"><span class="yiyi-st" id="yiyi-223"><em>flags</em> - 在编译用于识别替换的正则表达式时应用的正则表达式标志。</span><span class="yiyi-st" id="yiyi-224">默认值为<code class="docutils literal"><span class="pre">re.IGNORECASE</span></code>。</span><span class="yiyi-st" id="yiyi-225">请注意,<code class="docutils literal"><span class="pre">re.VERBOSE</span></code>将始终添加到标记中,因此自定义<em>idpattern</em>必须遵守详细正则表达式的约定。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-226"><span class="versionmodified">版本3.2中的新功能。</span></span></p></div></li></ul><p><span class="yiyi-st" id="yiyi-227">或者,您可以通过重写类属性<em>模式</em>提供整个正则表达式模式。</span><span class="yiyi-st" id="yiyi-228">如果你这样做,值必须是一个具有四命名捕获组的正则表达式对象。</span><span class="yiyi-st" id="yiyi-229">捕获组对应于上面,以及无效的占位符规则给出的规则:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-230"><em>转义</em> - 此组与转义序列匹配,例如</span><span class="yiyi-st" id="yiyi-231"><code class="docutils literal"><span class="pre">$$</span></code>。</span></li><li><span class="yiyi-st" id="yiyi-232"><em>named</em> - 此组与未支持的占位符名称匹配;它不应该在捕获组中包括分隔符。</span></li><li><span class="yiyi-st" id="yiyi-233"><em>braced</em> - 此群组与括号括起的占位符名称匹配;它不应该在捕获组中包括分隔符或大括号。</span></li><li><span class="yiyi-st" id="yiyi-234"><em>invalid</em> - 此组与任何其他分隔符模式(通常为单个分隔符)匹配,它应该显示在正则表达式的最后。</span></li></ul></div><div class="section" id="helper-functions"><h2><span class="yiyi-st" id="yiyi-235">6.1.5.</span><span class="yiyi-st" id="yiyi-236">辅助函数</span></h2><dl class="function"><dt id="string.capwords"><span class="yiyi-st" id="yiyi-237"><code class="descclassname">string.</code><code class="descname">capwords</code><span class="sig-paren">(</span><em>s</em>, <em>sep=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-238">使用<a class="reference internal" href="stdtypes.html#str.split" title="str.split"><code class="xref py py-meth docutils literal"><span class="pre">str.split()</span></code></a>将参数分成单词,使用<a class="reference internal" href="stdtypes.html#str.capitalize" title="str.capitalize"><code class="xref py py-meth docutils literal"><span class="pre">str.capitalize()</span></code></a>大写每个单词,并使用<a class="reference internal" href="stdtypes.html#str.join" title="str.join"><code class="xref py py-meth docutils literal"><span class="pre">str.join()</span></code></a>。</span><span class="yiyi-st" id="yiyi-239">如果可选的第二个参数<em>sep</em>不存在或<code class="docutils literal"><span class="pre">None</span></code>,空格字符将被单个空格替换,前导和尾随空格将被删除,否则<em>sep 用于拆分和连接字。</em></span></p></dd></dl></div></div></div> |