这是一个非常基本的问题,但到目前为止我还没有看到任何解释所有可能情况的解释。
假设m1, m2, m3
是模块层次结构,fun()
是层次结构内的函数。
我见过像这样的命令
版本 1
from m1.m2.m3 import fun
fun() #To access the function
版本 2
import m1
m1.m2.m3.fun()
它们完全相同吗?
版本 3
import m1.m2
m1.m2.m3.fun()
要么
版本 4
from m1.m2 import m3
m3.fun()
或任何其他组合 in-between?有任何相对优势或劣势吗?显然,我更愿意在每次调用函数时写fun()
而不是写m1.m2.m3.fun()
但是什么是权衡?
根据我的理解,版本 2 将执行 m1 的整个脚本。但其他人在执行方面是否更具选择性(因此可能会更快地进行__main__
?)
2 回答
版本 1 是与一起使用的如果**
fun
是你想要的唯一函数来自m1
树****你可以保证脚本中的其他函数都不会被称为fun
.如果上述任何一项不满意不要这样做,但如果是,就这样做.如果你希望能够在
m1
内访问所有**,那么版本 2 就是**。它确实导致了更详细的代码,因为你必须随身携带m1
,但它更安全,而且不那么模糊等同(应该不鼓励)from m1 import *
。请注意,将执行m1
代码。版本 3 是与一起使用如果你希望能够访问
m2
里面的所有内容**但不高(不能做m1.more_fun()
)。请注意,将执行m2
代码。如果你希望能够访问
m3
里面的所有但不高(不能做m1.m2.more_fun()
),那么版本 4 就是。请注意,将执行m3
代码。另一种导入方式是
因此你可以调用函数
最重要的一点是不要覆盖已存在的东西(污染命名空间)