📄 node8.html
字号:
<p> 上面的程式码会导入(load) <tt class="module">Sound.Effects.echo</tt> 这个module。如果你要使用这个module,你必须使用完整的名称,例如: </p> <p> </p> <dl> <dd><pre class="verbatim">Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)<br></pre> </dd> </dl> <p> 另外一个导入在package中的某个module的方法是: </p> <p> </p> <dl> <dd><pre class="verbatim">from Sound.Effects import echo<br></pre> </dd> </dl> <p> 同样的,这会导入 <tt class="module">echo</tt> 这个moduel。不同的是,当你使用这个module的时候你就不用在写前面package的名称了。请看以下使用这个module的例子: </p> <p> </p> <dl> <dd><pre class="verbatim">echo.echofilter(input, output, delay=0.7, atten=4)<br></pre> </dd> </dl> <p> 你也可以直接的import某一个在module里面的函式或变数,如下例: </p> <p> </p> <dl> <dd><pre class="verbatim">from Sound.Effects.echo import echofilter<br></pre> </dd> </dl> <p> 同样的,这会导入 <tt class="module">echo</tt> 这个module,不同的是你现在可以直接的使用 <tt class="function">echofilter()</tt> 这个函式了: </p> <p> </p> <dl> <dd><pre class="verbatim">echofilter(input, output, delay=0.7, atten=4)<br></pre> </dd> </dl> <p> 值得注意的是当你使用 <code>from <var>package</var> import <var>item</var></code> 这样的叙述时,你所import的东西可以是一个package中的module(或者是subpackage),或者是在module里面所定义的名称,例如变数、类别或是函式等等。 <code>import</code> 叙述会先测试是否这个东西真的存在于这个package,如果没有的话,会假设这是一个module然后试着导入(load)之。如果还失败的话,就会引发一个 <tt class="exception">ImportError</tt> 的例外状况(exception)。 </p> <p> 相反的是,当你使用 <code>import <var>item.subitem.subsubitem</var></code> 这样的叙述时,除了最后一个东西(item)以外,其余的都必须是package。最后一个可以是 module 或是 package ,但是不能是一个定义在module里面的类别、成员或函式。 </p> <p> </p> <h2> <br> 6.4.1 从一个Package中Import * </h2> <p> 那如果使用者写了 <code>from Sound.Effectsimport *</code> ,会造成什么结果呢?理想状况下,我们可能会期望会搜寻整个package目录,然后找出所有的module并且一一的import这些module。不幸的是,在Mac以及 Windows 平台下,档案的名称大小写并不统一。所以在这些平台之上,我们并无法保证 <span class="file">ECHO.PY</span> 这个档案应该被import成 <tt class="module">echo</tt>, <tt class="module">Echo</tt> 或 <tt class="module">ECHO</tt> (例如,Windows 95 有一个恼人的特点,就是会自动把所有的档案名称第一个字元大写)。DOS的8+3 档名限制对长的module名称来说,也是另一个有趣的问题。 </p> <p> 所以唯一的解决方法就是package的作者要提供一个明显的index给用package的人。如果遵守这个习惯的话,当用package的人在import的时候使用 <code>from Sound.Effects import *</code> 的话,就会去找这个package的 <span class="file">__init__.py</span> 档案里面的 <code>__all__</code> 这个list变数,这个list里面就会包含所有应该被import进来的module名称了。身为Package的作者有责任要保持 <code>from <var>package</var> import *</code> 这个档案的更新,但是如果package的作者确信没有人会用 <code>from Sound.Effects import *</code> 这种写法的话,也可以不使用这个档案。举例来说 <span class="file">Sounds/Effects/__init__.py</span> 这个档案就可以有下面这样的程式码: </p> <p> </p> <dl> <dd><pre class="verbatim">__all__ = ["echo", "surround", "reverse"]<br></pre> </dd> </dl> <p> 这就表示 <code>from Sound.Effects import*</code> 会从 <tt class="module">Sound</tt> 这个package 里面import 这三个module。 </p> <p> 如果没有定义 <code>__all__</code> 的话, <code>from Sound.Effects import *</code> 这个叙述就 <i>不会</i> 从 <tt class="module">Sound.Effects</tt> 这个package里面import所有的module进入目前的命名空间(namespace)。唯一能保证的是 <tt class="module">Sound.Effects</tt> 这个package有被imported 进来(可能会执行 <span class="file">__init__.py</span> 里面的初始化程式码),并且这个package里面所定义的名称会被import进来。Package里所定义的名称包含了在 <span class="file">__init__.py</span> 里面所定义的名称(以及所import的module)。当然也包含了在之前用import引进来的module名称,例如: </p> <p> </p> <dl> <dd><pre class="verbatim">import Sound.Effects.echo<br>import Sound.Effects.surround<br>from Sound.Effects import *<br></pre> </dd> </dl> <p> 在这个例子里,echo以及 surround 这两个modules都会被 import进来目前的命名空间(namespace)里。这是因为当 <code>from...import</code> 这个叙述执行的时候,这两个module都已经在这个package中有定义了(你也可以用 <code>__all__</code> 来定义)。 </p> <p> 值得注意的是使用import * 这样的写法常常是不被鼓励的,因为这通常会使得你的程式的可读性降低。无论如何,在互动模式下这样做的确会使你减少打太多字的机会,而且有些的module在设计的时候就故意只让某些特别的名称可以被使用。 </p> <p> 记住,使用 <code>from Package importspecific_submodule</code> 没有任何不对的地方。事实上,除非你的module的名字会和其他的名称冲突,否则这是常被推荐使用的形式。 </p> <p> </p> <h2><a name="SECTION008420000000000000000"> 6.4.2 Package内的References(参考) </a> </h2> <p> 在package之中的module常常需要彼此互相使用。例如说, <tt class="module">surround</tt> 这个module就有可能会使用到 <tt class="module">echo</tt> 这个module里的东西。事实上,由于这是最常见的,所以import的时候总是会先找自己这的package里面的module,然后再依照搜寻的路径来寻找。因此 <tt class="module">surround</tt> 这个module可以使用 <code>import echo</code> 或是 <code>from echo import echofilter</code> 就可以了。如果在自己所处的这个package里面找不到这个要import的module的话, <code>import</code> 指令就会在第一级(top-level)的module里找所指定的名称。 </p> <p> 当一个subpackage是在另一个package里的话(例如前面的 <tt class="module">Sound</tt> ),没有其他捷径可以让你使用其他在同一个外围的package里面的subpackage里的module,你必须使用完整的名称来指称你所要用的package。例如说,如果在 <tt class="module">Sound.Filters.vocoder</tt> 这个module里面你想要使用在 <tt class="module">Sound.Effects</tt> 这个package里的 <tt class="module">echo</tt> 这个module的话,你就要使用 <code>from Sound.Effects import echo</code> 这个叙述。 </p> <p> <br> </p> <hr> <h4>注脚</h4> <dl> <dt><a name="foot628">... 才会被执行。 </a><a name="foot628" href="node8.html#tex2html4"><sup>6.1</sup></a> </dt> <dd> 事实上,函式的定义也是”被执行”的叙述,这个执行的结果是把函式的名称写入module的globalsymbol table里面。 </dd> </dl> <div class="navigation"> <table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node7.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node9.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody> </table> <b class="navlabel">Previous:</b> <a class="sectref" href="node7.html">5.资料结构</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node9.html">7. 输入与输出</a> <br> <hr></div> <!--End of Navigation Panel--> <address> </address> <hr>请看<i><a href="about.html">关于此文件…</a></i> 里面有关如何给我们建议的说明。 </body> </html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -