module/function的导入方式有哪些?

What are the ways to import a module/function?

这是一个非常基本的问题,但到目前为止我还没有看到涵盖所有可能情况的任何解释。

假设m1, m2, m3是模块层级,fun()是层级内部的一个函数。

我见过像

这样的命令

Version 1

from m1.m2.m3 import fun
fun() #To access the function

Version 2

import m1
m1.m2.m3.fun()

它们是否完全等同于

Version 3

import m1.m2
m1.m2.m3.fun()

Version 4

from m1.m2 import m3
m3.fun()

或者两者之间的任何其他组合?有什么相对优势或劣势吗?显然,我宁愿在每次调用函数时写 fun() 而不是写 m1.m2.m3.fun() 但权衡是什么?
据我了解,版本 2 将执行 m1 的整个脚本。但是其他人在执行时是否更具选择性(因此可能更快地到达 __main__?)

另一种导入方式是

import m1.m2.m3 as m

因此您可以使用

调用该函数
m.fun()

要注意的最重要的事情是不要覆盖已经存在的东西(污染命名空间)

Version 1

from m1.m2.m3 import fun
fun() #To access the function

版本 1 是 如果 fun 是您想要从 m1 你可以保证你的脚本中的任何其他函数都不会被调用 fun。如果以上任何一项不满足不做,但如果满足,做。


Version 2

import m1
m1.m2.m3.fun()

版本 2 是 如果 您希望能够访问 m1 中的 一切 的版本。它确实会导致更冗长的代码,因为您必须始终随身携带 m1,但它比等价物(不鼓励使用)from m1 import * 更安全且更隐蔽。请注意,m1 代码将被执行。


Version 3

import m1.m2
m1.m2.m3.fun()

第 3 版是 如果 您希望能够访问 m2 中的 一切 而不是更高(不能做到 m1.more_fun())。请注意,将执行 m2 代码。


Version 4

from m1.m2 import m3
m3.fun()

第 4 版是 如果 您希望能够访问 m3 中的 所有内容 而不是更高(不能做到 m1.m2.more_fun())。请注意,将执行 m3 代码。