我可能在这里完全错了,但我找不到适当的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
?
此外,当你必须在多个文件中包含库时,正确的做法是什么,而这些文件又包含在其他文件中?
答案 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_x
或x.something_else_from_x
,编写和维护非常麻烦。
答案 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
仅导入一次。