从另一个文件导入类是否也会导入该文件的依赖项?

PyR*_*red 2 python import dependencies

假设我有一个名为 src.py 的脚本,其中定义了几个函数;这些函数都在一个名为 的类中LDA。numpy这些函数需要、等库scipy,这些库在脚本顶部作为标准导入。

现在,在一个名为 的新单独脚本中,main.py我导入该类LDA:

from src import LDA
Run Code Online (Sandbox Code Playgroud)

如果我现在在新脚本中使用该类LDA及其所有函数main.py,即使我没有导入src.py. 这是如何运作的?我是否应该需要 importnumpy等scipy才能main.py工作LDA?

Sig*_*lon 5

这个问题和类似的问题已经在这里得到解答。请参阅此内容和此内容import module以了解 python和功能的意义from module import class。

总之, 和import X都from X import class逐行执行目标文件,因此所有依赖项将自动加载到模块的名称空间中。因此,如果您实例化该类并运行函数/方法,它们将在 X 的命名空间(一个奇特的字典)中查找,其中存在对依赖项的引用。导入后会创建一个具有相同名称的from X import class引用,以便无需限定即可使用它。class但需要注意的是模块 X 没有引用,因此无法使用 X.obj 限定符访问对象。使用普通import X语句,您可以访问 X 中定义的所有对象。

旁注:导入对象的 dir() 函数和dict属性是查看加载了哪些对象的好方法。下面给出一个例子

#script test.py
import numpy as np

class Baz():
    def __init__(self, num):
        self.a = np.arange(num)
        self.b = np.ones(num)
        print self.a, self.b

    def foo(self):
        prod = np.dot(self.a, self.b)
        return prod

>>> import test
>>> dir(test)
['Baz', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'np']
>>> test.__dict__.keys()
['__builtins__', '__file__', 'Baz', '__package__', 'np', '__name__', '__doc__']
>>> test.__dict__['np']
<module 'numpy' from '/home/user/bin/python2.7/site-packages/numpy/__init__.pyc'>
>>> x = test.Baz(5)
[0 1 2 3 4] [ 1.  1.  1.  1.  1.]
>>> x.foo()
10.0
Run Code Online (Sandbox Code Playgroud)

现在是 from import 语句

>>> from test import Baz
>>> dir(test)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
>>> dir(Baz)
['__doc__', '__init__', '__module__', 'foo']
>>> Baz.__module__
'test'
>>> Baz.__dict__.keys()
['__module__', 'foo', '__doc__', '__init__']
>>> x = Baz(5)
[0 1 2 3 4] [ 1.  1.  1.  1.  1.]
>>> x.foo()
10.0
>>> Baz.__dict__['foo'].__globals__.keys()
['__builtins__', '__file__', 'Baz', '__package__', 'np', '__name__', '__doc__']
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,模块 numpy 已加载并在__globals__函数的属性中可用,该函数再次返回所有已加载模块的字典。因此,当该foo()方法运行时,它会在名称空间字典中执行查找并找到 numpy.