python中的import语句

wgx48brx  于 2023-02-20  发布在  Python
关注(0)|答案(3)|浏览(157)

当import语句用于从包的子包导入模块时,为什么给予调用函数的完整路径?
例如,A是程序包,AA是A的子程序包,AA1是AA中的模块

import A.AA.AA1

A.AA.AA1.AA1fun()

工作正常
但是

AA1.AA1fun()

为什么不是这样,为什么“A”被放在全局名称空间中,为什么不是“AA1”?

bvn4nwqk

bvn4nwqk1#

假设我们执行这两个模块的import

import A.AA.AA1
import B.AA.AA1

如果运行以下函数,将选择两个模块中的哪一个?

AA.AA1.fun()
AA.AA1.fun()
AA1.fun()
AA1.fun()

为了避免这种不确定性,您必须显式地放置整个包、子包和模块路径。

A.AA.AA1.fun()
B.AA.AA1.fun()

如果您希望避免每次都使用整个路径,可以使用from选项:

from A.AA.AA1 import fun
fun()

但是,这样做会暴露标识符fun的名称,因此,如果fun先前已被分配给另一个对象,则它将被覆盖,并指向 A.AA.AA1 中的新对象。

fun = lambda x: 2*x
from A.AA.AA1 import fun
from B.AA.AA1 import fun

在最后一个示例中,执行完这几行代码后,fun仅引用 module B.AA.AA1 中的对象。
还可以使用as选项为导入的模块创建别名:

import A.AA.AA1 as AAA1
import B.AA.AA1 as BAA1

AAA1.fun()
BAA1.fun()

这样,整个路径被简化,避免了从一个模块或另一个模块执行fun时的歧义。
在此链接中,您可以找到文档:import doc

g0czyy6m

g0czyy6m2#

主要区别在于import的工作方式,请参阅docs章节5.4.2了解更多信息。

import A.AA.AA1

A.AA.AA1.AA1fun()

对于作为唯一的import,您必须提供完整的路径。另一方面,如果您使用from语句,则可以直接使用它:

from A.AA import AA1

AA1.AA1fun()
k75qkfdt

k75qkfdt3#

上面的答案是令人满意的,实际上在python中没有什么东西没有名字,因为包所有python知道的都是一个模块,所以即使你检查任何解释器,也总是有模块而不是包。

相关问题