问题 重新导入别名/阴影python内置方法


如果一个人跑了

from numpy import *

然后是内置的 all,和其他几个功能,被阴影 numpy 具有相同名称的函数。

发生这种情况的最常见情况(没有人完全意识到)是在启动时 ipython 同 ipython --pylab (但你不应该这样做,使用 --matplotlib,它不会将任何内容导入您的名称空间,而是设置与gui相关的魔法,而不是)。

一旦完成,无论如何都要调用内置函数?

这是值得做的,因为内置 all 可以处理发电机,在哪里 numpy 版本不能。


4201
2017-09-12 21:10


起源

但为什么要用 from numpy import * 首先? - Akavall
@Akavall因为当你开始使用ipython时 ipython --pylab 它被拉入。对于互动工作,它非常方便。这是少数几个挂机之一。 - tacaswell
好。我懂了。谢谢 - Akavall
对于后代:在最近的IPythons你应该使用 ipython --matplotlib 相反,它执行所有设置但不导入任何内容。 (为了便于访问您可以做的绘图内容 import pylab as pl。) - Dougal


答案:


你可以这样做

all = __builtins__.all

该声明 from numpy import * 基本上做两件事

  1. 导入模块 numpy
  2. 将所有导出的名称从模块复制到当前模块

通过重新分配原始值 __builtins__ 您可以恢复所需功能的情况。


10
2017-09-12 21:16



谢谢。怀疑我错过了一些简单的事情。 - tacaswell
__builtin__ (单数)也会奏效。当你启动ipython时 ipython --pylab  __bulitins__ 是一个字典,而不是一个模块因为 numpy.__builtins__ 哪个阴影 __builtins__。 - tacaswell


您可以通过重新导入内置函数来纠正这些问题:

In [1]: all
Out[1]: <function all>

In [2]: from numpy import *

In [3]: all
Out[3]: <function numpy.core.fromnumeric.all>

In [4]: from __builtin__ import *

In [5]: all
Out[5]: <function all>

3
2017-09-18 20:36



另一方面,在人们会使用的上下文中 --pylab 像numpy这样的东西 sum 和 max 是你想要的(IMO)。 - tacaswell
Tbh我总是用np作为前缀,我更喜欢明确。 - Andy Hayden
我倾向于同意,但重点 pylab 是在MATLAB终端复制,无论好坏。 - tacaswell