<p>Python没有像Lisp或Scheme中的<em><a href="http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/let.html" rel="noreferrer">let</a></em>这样的临时命名空间工具。在</p>
<p>Python中常用的技术是将名称放入当前名称空间,然后在处理完这些名称后将其取出。此技术在标准库中大量使用:</p>
<pre><code>abspath = os.path.abspath
dirname = os.path.dirname
# 15 lines of heavy usage of those functions
a = abspath(somepath)
d = dirname(somepath)
...
del abspath, dirname
</code></pre>
<p>减少键入工作量的另一种方法是缩短重复出现的前缀:</p>
^{pr2}$
<p>标准库中常用的另一种技术是不必担心会污染模块名称空间,而只需依赖<em>\uu all_u</em>列出您打算公开的名称。在<a href="http://docs.python.org/reference/simple_stmts.html?highlight=__all__#the-import-statement" rel="noreferrer">docs for the import statement</a>中讨论了<em>的作用。在</p>
<p>当然,您也可以通过将名称存储在字典中来创建自己的命名空间(尽管此解决方案并不常见):</p>
<pre><code>d = dict(abspath = os.path.abspath,
dirname = os.path.dirname)
...
a = d['abspath'](somepath)
d = d['dirname'](somepath)
</code></pre>
<p>最后,您可以将所有代码放在一个函数中(它有自己的本地命名空间),但这有许多缺点:</p>
<ul>
<li>设置很尴尬(函数的非典型和神秘用法)</li>
<li>您需要将要执行的任何非临时任务声明为<em>global</em>。在</li>
<li>除非调用函数,否则代码不会运行</li>
</ul>
<blockquote>
<pre><code> def temp(): # disadvantage 1: awkward setup
global a, d # disadvantage 2: global declarations
abspath = os.path.abspath
dirname = os.path.dirname
# 15 lines of heavy usage of those functions
a = abspath(somepath)
d = dirname(somepath)
temp() # disadvantage 3: invoking the code
</code></pre>
</blockquote>