python导入会导致代码膨胀。我在这里错了吗?

时间:2015-08-13 10:49:54

标签: python python-2.7 python-import

我可能在这里完全错了,但我找不到适当的google来源来解决我的困境:

假设我们正在使用python,而且我们有文件

  

foo.py和bar.py,它们具有以下伪代码:

foo.py中的代码:

# Code in foo.py
import sys
def foo():
# Some blah code for foo function

bar.py中的代码是:

# Code in bar.py
import sys
import foo
def bar():
# Some blah code for bar function

现在,我想知道的是:Will this not cause code bloat?,因为我们已经在bar.py中导入了两次sys。一旦通过import sys而另一次是因为我们正在进行import foo

此外,当你必须在多个文件中包含库时,正确的做法是什么,而这些文件又包含在其他文件中?

2 个答案:

答案 0 :(得分:3)

在python中导入模块两次不会引入“膨胀”。第二个导入只是在缓存的模块字典中进行名称查找(确切地说是sys.modules。在sys的情况下,这使得它更不相关,因为实际上没有任何东西不会隐式触发sys的导入 - 虽然它显然没有在命名空间中公开。)

如果您导入Polymer({ is: "page-home", attributeChanged: function(name, type) { console.log(this.localName + ' attribute ' + name + ' was changed to ' + this.getAttribute(name)); }, 中某个模块x的某些部分,并且需要foo.py中的其他部分,会发生什么?必须仔细修改您的导入,然后在bar.py中使用foo.something_from_xx.something_else_from_x,编写和维护非常麻烦。

TLDR:别担心。真。不。

答案 1 :(得分:2)

这不会导致任何code bloat。多次导入同一个库时,python实际上只导入一次(第一次),然后将其缓存到sys.modules中,然后每次执行import sys时,它返回模块来自sys.modules的对象。

一个非常简单的例子来展示这个 -

假设我有a.py -

print("In A")

每次导入模块时都会打印In A。现在让我们尝试多次导入它 -

>>> import a
In A
>>> import a
>>> import a
>>> import a

正如您所看到的,代码实际上只导入了一次,其余时间都返回了缓存对象。要查看sys.modules -

>>> import sys
>>> sys.modules['a']
<module 'a' from '\\path\to\\a.py'>

当你导入一个模块时,会发生的事情是python导入代码,并创建一个module对象,然后在本地命名空间中创建一个带有模块名称的名称(如果没有as提供了关键字,否则在as关键字后面提供名称),并为其分配模块对象。

在其他模块中导入时也会发生同样的事情。另一个例子 -

b.py -

import a

print("In B")

c.py -

import b
import a

print("In C")

运行c.py -

的结果
In A
In B
In C

如您所见,a.py仅导入一次。