【发布时间】:2016-02-02 18:37:28
【问题描述】:
我有时会在脚本的某个位置使用embed 来快速充实一些本地功能。最小的例子:
#!/usr/bin/env python
# ...
import IPython
IPython.embed()
开发本地函数通常需要新的导入。但是,当在函数中使用时,在 IPython 会话中导入模块似乎不起作用。例如:
In [1]: import os
In [2]: def local_func(): return os.path.sep
In [3]: local_func()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-f0e5d4635432> in <module>()
----> 1 local_func()
<ipython-input-2-c530ce486a2b> in local_func()
----> 1 def local_func(): return os.path.sep
NameError: global name 'os' is not defined
这相当令人困惑,尤其是因为我什至可以使用制表符完成来编写os.path.sep。
我注意到问题更为根本:通常,在 IPython 嵌入会话中创建的函数不会关闭嵌入范围内的变量。例如,这也失败了:
In [4]: x = 0
In [5]: def local_func(): return x
In [6]: local_func()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-f0e5d4635432> in <module>()
----> 1 local_func()
<ipython-input-5-2116e9532e5c> in local_func()
----> 1 def local_func(): return x
NameError: global name 'x' is not defined
模块名称可能只是“关闭”最常见的东西......
有没有办法解决这个问题?
更新:问题不仅适用于闭包,也适用于nested list comprehensions。
免责声明:我将自己发布一个(不令人满意的)问题答案——不过仍然希望有更好的解决方案。
【问题讨论】:
-
截至 2017 年 2 月,我仍然观察到 sys.version 为
2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]的问题。
标签: python import closures ipython