将库导入python scrapy shell。

时间:2014-05-16 17:44:53

标签: python namespaces scrapy

我通过以下方式启动shell:

scrapy shell 'some_url'

我想在shell中使用numpy:

import numpy
a = numpy.random.random(2)
a = array([ 0.64836678,  0.72713776])

这些都很好。当我尝试在函数定义中使用numpy时会出现问题:

In [23]: def foo(n): return numpy.random.random(n) 
In [24]: foo(2) 
In [24]: foo(2)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-24-3ab2f4e33a15> in <module>()
----> 1 foo(2)

<ipython-input-23-8383e2a3c452> in foo(n)
----> 1 def foo(n) : return numpy.random.random(n)

NameError: global name 'numpy' is not defined

我目前的解决方案是:

def foo(n) :import numpy ; return numpy.random.random(n)

有人可以帮助解释这个问题并提出更优雅的解决方案吗?

提前感谢。

1 个答案:

答案 0 :(得分:1)

当你numpy.random.random(n) Python在局部变量中查找numpy名称时,如果找不到它,它会在全局变量中查找它。

很明显,如果你还没有进口numpy就没有这样的名字:

NameError: global name 'numpy' is not defined 

如果你这样做

def foo(n) :import numpy ; return numpy.random.random(n)

导入numpy模块并在本地(内部函数foo)变量numpy中保留对它的引用。因此,您的通话numpy.random.random(n)可以正常使用。

如果将numpy导入全局命名空间,它也可以工作:

import numpy
def foo(n):
    return numpy.random.random(n)

确保您执行了import numpy,因为此处一切正常:

In [1]: import numpy

In [2]: numpy.random.random(2)
Out[2]: array([ 0.05183811,  0.18187864])

In [3]: def foo(n): return numpy.random.random(n)

In [4]: foo(2)
Out[4]: array([ 0.19754933,  0.88955471])