我应该使用`from numpy import*`将numpy(或pylab)用作python环境吗?

lev*_*que 12 python coding-style numpy

我在所有的python程序中使用pylab(更具体地说是numpy).例外情况非常罕见,如果有的话.到目前为止,我已经习惯了以下列方式导入numpy:

from numpy import *
Run Code Online (Sandbox Code Playgroud)

这样做的好处是从一开始就让它看起来像是python的一部分.在每个脚本中导入这样的numpy有什么不好的事吗?我的意思是除了每个脚本/程序都需要更多内存并且需要更长时间才能加载的事实.

我认为在来自numpy(例如np.zeros(3))的每个函数调用之前总是必须写numpy甚至np 是单调乏味的,因为它需要我知道哪个函数来自numpy而哪个函数不来.我真的不在乎零函数来自numpy或python,我只是想/需要使用它.

根据你的哪种表示法更好?

unu*_*tbu 19

  1. 使用from numpy import *更改行为any,allsum.例如,

    any([[False]])
    # True
    all([[True, False], [False, False]])
    # True
    sum([[1,2],[3,4]], 1) 
    # TypeError: unsupported operand type(s) for +: 'int' and 'list'
    
    Run Code Online (Sandbox Code Playgroud)

    然而,如果你使用from numpy import *那么价值是完全不同的:

    from numpy import *
    any([[False]])
    # False
    all([[True, False], [False, False]])
    # False
    sum([[1,2],[3,4]], 1) 
    array([3, 7])
    
    Run Code Online (Sandbox Code Playgroud)

    可以通过这种方式找到完整的名称冲突(感谢@Joe Kington和@jolvi指出这一点):

    import numpy as np
    np_locals = set(np.__all__)
    builtins = set(dir(__builtins__))
    print([name for name in np_locals.intersection(builtins) if not name.startswith('__')])
    # ['any', 'all', 'sum']
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这可能会导致非常混乱的错误,因为有人在Python解释器中测试或使用您的代码时from numpy import *可能会看到与您完全不同的行为.

  3. 使用表单的多个导入from module import *可能会使问题更加复杂,甚至更多这种类型的冲突.如果你把这个坏习惯扼杀在萌芽状态,你将永远不必担心这个(可能是混乱的)错误.

    如果两个模块重新定义相同的名称,则导入的顺序也很重要.

    而且它很难弄清楚函数和值的来源.

  4. 虽然可以使用from numpy import *并仍然访问Python的内置函数,但它很尴尬:

    from numpy import *
    any([[False]])
    __builtins__.any([[False]])
    
    Run Code Online (Sandbox Code Playgroud)

    并且可读性低于:

    import numpy as np
    np.any([[False]])
    any([[False]])
    
    Run Code Online (Sandbox Code Playgroud)
  5. 正如Python的禅宗所说,

    命名空间是一个很棒的主意 - 让我们使用更多这些!

我的建议是永远不要from module import *在任何剧本中使用.


Joe*_*ton 12

只是要详细说明其他人说的话,numpy是一个特别糟糕的模块import *.

pylab是用于交互式使用,它在那里很好.pylab.zeros当他们可以打字时,没有人想在shell中反复输入zeros.但是,一旦开始编写代码,一切都会发生变化.你输入一次它可能永远存在,其他人(例如你自己一年后)可能会试图找出你在做什么.

除了什么@unutbu已经说过有关重写Python的内置sum,float int等等,并说每个人都有关,不知道哪里的功能是从哪里来的,numpy而且pylab是非常大的命名空间.

numpy在其命名空间中有566个函数,变量,类等.好多啊!pylab930!(使用pylab,这些来自不同的模块.)

当然,这是很容易猜出zerosones或者array是从,但什么sourceDataSourcelib.utils?(如果你这样做,所有这些都将在你的本地命名空间中from numpy import *

如果你有一个更大的项目,你很可能会在另一个文件中找到一个局部变量或变量,这个文件的命名类似于大模块中的东西numpy.突然之间,你开始更关心你正在呼唤的是什么!

再举一个例子,你会如何区分pylabfft功能numpyfft 模块

取决于你是否这样做

from numpy import *
from pylab import *
Run Code Online (Sandbox Code Playgroud)

要么:

from pylab import *
from numpy import *
Run Code Online (Sandbox Code Playgroud)

fft是一种完全不同的东西完全不同的行为!(即试图fft在第二种情况下调用会引发错误.)

总而言之,你应该总是避免from module import *,但在et等情况下numpy,这是一个特别糟糕的主意scipy.人.因为它们是如此庞大的名称空间.

当然所有这一切,如果你只是在一个shell中试图快速得到一些数据的图,然后继续实际做一些事情,那么肯定,使用pylab.这就是它的用途.只是不要写下任何人可能会在未来的路上尝试阅读的东西!

</rant>