mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
4 lines
17 KiB
HTML
4 lines
17 KiB
HTML
<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">>>> </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">>>> </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> |