我希望修改IPython默认处理导入错误的方式。当我在IPython shell中原型设计时,我经常忘记先导入 os
, re
或其他需要的依赖库。前几个语句通常遵循这个模式:
In [1]: os.path.exists("~/myfile.txt")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-0ffb6014a804> in <module>()
----> 1 os.path.exists("~/myfile.txt")
NameError: name 'os' is not defined
In [2]: import os
In [3]: os.path.exists("~/myfile.txt")
Out[3]: False
当然,这是我的坏习惯,对于脚本或真实的程序而言,这是有意义的,但在shell中,我更希望IPython遵循DWIM原则,至少尝试导入我要使用的内容。
In [1]: os.path.exists("~/myfile.txt")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-0ffb6014a804> in <module>()
----> 1 os.path.exists("~/myfile.txt")
NameError: name 'os' is not defined
Catching this for you and trying to import "os" … success!
Retrying …
---------------------------------------------------------------------------
Out[1]: False
如果使用原版IPython无法实现,我该怎么做才能让它工作?使用包装内核是最简单的方法吗?还是应该直接在核心中实现,使用魔术命令?请注意,这与那些问题不同,其中某人想要始终加载预定义模块。 我不需要。 因为我不知道我将要处理什么,也不想加载所有内容(也不想保持所有内容的列表更新)。
pip
有方法可以做到这一点,但有人可能正在导入他们本地机器上的某些东西。 - Aaron ChristiansenNameError
作为set_custom_exc的第一个参数传递?最后,有没有办法区分在库或程序代码中发生的NameError
和在shell中发生的NameError
?如果我的程序代码有错误,导致出现这样的NameError,那么尝试导入变量名只会让事情变得更糟。 - mknecht