uTools-Manuals/docs/python/symtable.html

4 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-symtable"><h1><span class="yiyi-st" id="yiyi-10">32.3. <a class="reference internal" href="#module-symtable" title="symtable: Interface to the compiler's internal symbol tables."><code class="xref py py-mod docutils literal"><span class="pre">symtable</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/symtable.py">Lib / symtable.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">在生成字节码之前编译器从AST生成符号表。</span><span class="yiyi-st" id="yiyi-13">符号表负责计算代码中每个标识符的范围。</span><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="#module-symtable" title="symtable: Interface to the compiler's internal symbol tables."><code class="xref py py-mod docutils literal"><span class="pre">symtable</span></code></a>提供了一个接口来检查这些表。</span></p><div class="section" id="generating-symbol-tables"><h2><span class="yiyi-st" id="yiyi-15">32.3.1. </span><span class="yiyi-st" id="yiyi-16">Generating Symbol Tables</span></h2><dl class="function"><dt id="symtable.symtable"><span class="yiyi-st" id="yiyi-17"> <code class="descclassname">symtable.</code><code class="descname">symtable</code><span class="sig-paren">(</span><em>code</em>, <em>filename</em>, <em>compile_type</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-18">返回对于Python源代码<em>代码</em>的toplevel <a class="reference internal" href="#symtable.SymbolTable" title="symtable.SymbolTable"><code class="xref py py-class docutils literal"><span class="pre">SymbolTable</span></code></a></span><span class="yiyi-st" id="yiyi-19"><em>filename</em>是包含代码的文件的名称。</span><span class="yiyi-st" id="yiyi-20"><em>compile_type</em>类似于<a class="reference internal" href="functions.html#compile" title="compile"><code class="xref py py-func docutils literal"><span class="pre">compile()</span></code></a><em>模式</em>参数。</span></p></dd></dl></div><div class="section" id="examining-symbol-tables"><h2><span class="yiyi-st" id="yiyi-21">32.3.2. </span><span class="yiyi-st" id="yiyi-22">Examining Symbol Tables</span></h2><dl class="class"><dt id="symtable.SymbolTable"><span class="yiyi-st" id="yiyi-23"> <em class="property">class </em><code class="descclassname">symtable.</code><code class="descname">SymbolTable</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-24">块的命名空间表。</span><span class="yiyi-st" id="yiyi-25">构造函数不是公共的。</span></p><dl class="method"><dt id="symtable.SymbolTable.get_type"><span class="yiyi-st" id="yiyi-26"> <code class="descname">get_type</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-27">返回符号表的类型。</span><span class="yiyi-st" id="yiyi-28">可能的值为<code class="docutils literal"><span class="pre">'class'</span></code><code class="docutils literal"><span class="pre">'module'</span></code><code class="docutils literal"><span class="pre">'function'</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_id"><span class="yiyi-st" id="yiyi-29"> <code class="descname">get_id</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-30">返回表的标识符。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_name"><span class="yiyi-st" id="yiyi-31"> <code class="descname">get_name</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">返回表的名称。</span><span class="yiyi-st" id="yiyi-33">这是类的名称,如果表是一个类,函数的名称,如果表是一个函数,或<code class="docutils literal"><span class="pre">'top'</span></code>如果表是全局的(<a class="reference internal" href="#symtable.SymbolTable.get_type" title="symtable.SymbolTable.get_type"><code class="xref py py-meth docutils literal"><span class="pre">get_type()</span></code></a>返回<code class="docutils literal"><span class="pre">'module'</span></code>)。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_lineno"><span class="yiyi-st" id="yiyi-34"> <code class="descname">get_lineno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-35">返回此表所表示的块中第一行的数字。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.is_optimized"><span class="yiyi-st" id="yiyi-36"> <code class="descname">is_optimized</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">如果可以优化此表中的本地化,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.is_nested"><span class="yiyi-st" id="yiyi-38"> <code class="descname">is_nested</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">如果块是嵌套类或函数,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.has_children"><span class="yiyi-st" id="yiyi-40"> <code class="descname">has_children</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-41">如果块在其中嵌套命名空间,则返回<code class="docutils literal"><span class="pre">True</span></code></span><span class="yiyi-st" id="yiyi-42">这些可以通过<a class="reference internal" href="#symtable.SymbolTable.get_children" title="symtable.SymbolTable.get_children"><code class="xref py py-meth docutils literal"><span class="pre">get_children()</span></code></a>获得。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.has_exec"><span class="yiyi-st" id="yiyi-43"> <code class="descname">has_exec</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">如果块使用<code class="docutils literal"><span class="pre">exec</span></code>,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_identifiers"><span class="yiyi-st" id="yiyi-45"> <code class="descname">get_identifiers</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">返回此表中的符号名称列表。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.lookup"><span class="yiyi-st" id="yiyi-47"> <code class="descname">lookup</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-48">在表中查找<em>名称</em>,并返回<a class="reference internal" href="#symtable.Symbol" title="symtable.Symbol"><code class="xref py py-class docutils literal"><span class="pre">Symbol</span></code></a>实例。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_symbols"><span class="yiyi-st" id="yiyi-49"> <code class="descname">get_symbols</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">返回表中名称的<a class="reference internal" href="#symtable.Symbol" title="symtable.Symbol"><code class="xref py py-class docutils literal"><span class="pre">Symbol</span></code></a>实例的列表。</span></p></dd></dl><dl class="method"><dt id="symtable.SymbolTable.get_children"><span class="yiyi-st" id="yiyi-51"> <code class="descname">get_children</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-52">返回嵌套符号表的列表。</span></p></dd></dl></dd></dl><dl class="class"><dt id="symtable.Function"><span class="yiyi-st" id="yiyi-53"> <em class="property">class </em><code class="descclassname">symtable.</code><code class="descname">Function</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">函数或方法的命名空间。</span><span class="yiyi-st" id="yiyi-55">此类继承<a class="reference internal" href="#symtable.SymbolTable" title="symtable.SymbolTable"><code class="xref py py-class docutils literal"><span class="pre">SymbolTable</span></code></a></span></p><dl class="method"><dt id="symtable.Function.get_parameters"><span class="yiyi-st" id="yiyi-56"> <code class="descname">get_parameters</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-57">将包含参数名称的元组返回到此函数。</span></p></dd></dl><dl class="method"><dt id="symtable.Function.get_locals"><span class="yiyi-st" id="yiyi-58"> <code class="descname">get_locals</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-59">在此函数中返回包含本地人名称的元组。</span></p></dd></dl><dl class="method"><dt id="symtable.Function.get_globals"><span class="yiyi-st" id="yiyi-60"> <code class="descname">get_globals</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-61">在此函数中返回包含全局变量名称的元组。</span></p></dd></dl><dl class="method"><dt id="symtable.Function.get_frees"><span class="yiyi-st" id="yiyi-62"> <code class="descname">get_frees</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-63">返回一个包含该函数中自由变量名称的元组。</span></p></dd></dl></dd></dl><dl class="class"><dt id="symtable.Class"><span class="yiyi-st" id="yiyi-64"> <em class="property">class </em><code class="descclassname">symtable.</code><code class="descname">Class</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">类的命名空间。</span><span class="yiyi-st" id="yiyi-66">此类继承<a class="reference internal" href="#symtable.SymbolTable" title="symtable.SymbolTable"><code class="xref py py-class docutils literal"><span class="pre">SymbolTable</span></code></a></span></p><dl class="method"><dt id="symtable.Class.get_methods"><span class="yiyi-st" id="yiyi-67"> <code class="descname">get_methods</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-68">返回一个包含类中声明的方法名称的元组。</span></p></dd></dl></dd></dl><dl class="class"><dt id="symtable.Symbol"><span class="yiyi-st" id="yiyi-69"> <em class="property">class </em><code class="descclassname">symtable.</code><code class="descname">Symbol</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-70"><a class="reference internal" href="#symtable.SymbolTable" title="symtable.SymbolTable"><code class="xref py py-class docutils literal"><span class="pre">SymbolTable</span></code></a>中的条目对应于源中的标识符。</span><span class="yiyi-st" id="yiyi-71">构造函数不是公共的。</span></p><dl class="method"><dt id="symtable.Symbol.get_name"><span class="yiyi-st" id="yiyi-72"> <code class="descname">get_name</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-73">返回符号的名称。</span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_referenced"><span class="yiyi-st" id="yiyi-74"> <code class="descname">is_referenced</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-75">如果在其块中使用符号,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_imported"><span class="yiyi-st" id="yiyi-76"> <code class="descname">is_imported</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-77">如果符号是从import语句创建的则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_parameter"><span class="yiyi-st" id="yiyi-78"> <code class="descname">is_parameter</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-79">如果符号是参数,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_global"><span class="yiyi-st" id="yiyi-80"> <code class="descname">is_global</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-81">如果符号是全局的,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_declared_global"><span class="yiyi-st" id="yiyi-82"> <code class="descname">is_declared_global</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">如果符号已使用全局语句声明为全局,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_local"><span class="yiyi-st" id="yiyi-84"> <code class="descname">is_local</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-85">如果符号位于其块的本地,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_free"><span class="yiyi-st" id="yiyi-86"> <code class="descname">is_free</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-87">如果符号在其块中引用,但未分配给,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_assigned"><span class="yiyi-st" id="yiyi-88"> <code class="descname">is_assigned</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-89">如果在其块中分配了符号,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.is_namespace"><span class="yiyi-st" id="yiyi-90"> <code class="descname">is_namespace</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-91">如果名称绑定引入新的命名空间,则返回<code class="docutils literal"><span class="pre">True</span></code></span></p><p><span class="yiyi-st" id="yiyi-92">如果将该名称用作函数或类语句的目标则为true。</span></p><p><span class="yiyi-st" id="yiyi-93">例如:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">table</span> <span class="o">=</span> <span class="n">symtable</span><span class="o">.</span><span class="n">symtable</span><span class="p">(</span><span class="s2">"def some_func(): pass"</span><span class="p">,</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"exec"</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">table</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="s2">"some_func"</span><span class="p">)</span><span class="o">.</span><span class="n">is_namespace</span><span class="p">()</span>
<span class="go">True</span>
</code></pre><p><span class="yiyi-st" id="yiyi-94">请注意,单个名称可以绑定到多个对象。</span><span class="yiyi-st" id="yiyi-95">如果结果为<code class="docutils literal"><span class="pre">True</span></code>则该名称也可能绑定到其他对象如int或list不会引入新的命名空间。</span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.get_namespaces"><span class="yiyi-st" id="yiyi-96"> <code class="descname">get_namespaces</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-97">返回绑定到此名称的命名空间的列表。</span></p></dd></dl><dl class="method"><dt id="symtable.Symbol.get_namespace"><span class="yiyi-st" id="yiyi-98"> <code class="descname">get_namespace</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-99">返回绑定到此名称的命名空间。</span><span class="yiyi-st" id="yiyi-100">如果绑定了多个命名空间,则会引发<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></dd></dl></dd></dl></div></div></div>