当import语句用于从包的子包导入模块时,为什么给予调用函数的完整路径?例如,A是程序包,AA是A的子程序包,AA1是AA中的模块
import A.AA.AA1 A.AA.AA1.AA1fun()
工作正常但是
AA1.AA1fun()
为什么不是这样,为什么“A”被放在全局名称空间中,为什么不是“AA1”?
bvn4nwqk1#
假设我们执行这两个模块的import:
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
from A.AA.AA1 import fun fun()
但是,这样做会暴露标识符fun的名称,因此,如果fun先前已被分配给另一个对象,则它将被覆盖,并指向 A.AA.AA1 中的新对象。
fun
fun = lambda x: 2*x from A.AA.AA1 import fun from B.AA.AA1 import fun
在最后一个示例中,执行完这几行代码后,fun仅引用 module B.AA.AA1 中的对象。还可以使用as选项为导入的模块创建别名:
as
import A.AA.AA1 as AAA1 import B.AA.AA1 as BAA1 AAA1.fun() BAA1.fun()
这样,整个路径被简化,避免了从一个模块或另一个模块执行fun时的歧义。在此链接中,您可以找到文档:import doc
g0czyy6m2#
主要区别在于import的工作方式,请参阅docs章节5.4.2了解更多信息。
对于作为唯一的import,您必须提供完整的路径。另一方面,如果您使用from语句,则可以直接使用它:
from A.AA import AA1 AA1.AA1fun()
k75qkfdt3#
上面的答案是令人满意的,实际上在python中没有什么东西没有名字,因为包所有python知道的都是一个模块,所以即使你检查任何解释器,也总是有模块而不是包。
3条答案
按热度按时间bvn4nwqk1#
假设我们执行这两个模块的
import
:如果运行以下函数,将选择两个模块中的哪一个?
为了避免这种不确定性,您必须显式地放置整个包、子包和模块路径。
如果您希望避免每次都使用整个路径,可以使用
from
选项:但是,这样做会暴露标识符
fun
的名称,因此,如果fun
先前已被分配给另一个对象,则它将被覆盖,并指向 A.AA.AA1 中的新对象。在最后一个示例中,执行完这几行代码后,
fun
仅引用 module B.AA.AA1 中的对象。还可以使用
as
选项为导入的模块创建别名:这样,整个路径被简化,避免了从一个模块或另一个模块执行
fun
时的歧义。在此链接中,您可以找到文档:import doc
g0czyy6m2#
主要区别在于
import
的工作方式,请参阅docs章节5.4.2了解更多信息。对于作为唯一的import,您必须提供完整的路径。另一方面,如果您使用
from
语句,则可以直接使用它:k75qkfdt3#
上面的答案是令人满意的,实际上在python中没有什么东西没有名字,因为包所有python知道的都是一个模块,所以即使你检查任何解释器,也总是有模块而不是包。