[英]What's the purpose of “import package”?
正如我刚刚发现的那样, import package
不会通过package.module使包的模块可用。 from package import subpackage
和from package import *
如果我无法访问其子模块但只能访问__init__.py
定义的对象,那么导入包的目的是什么呢?
对我来说, from package import *
会膨胀命名空间是有意义的,但是,在其他两种方式的情况下,这不适用! 我也明白加载所有子模块可能需要很长时间 。 但我不知道这些不必要的副作用是什么,“这应该只在明确导入子模块时发生”,这是前一个链接的作者提到的。 对我来说,如果我不想访问__init__.py
提供的对象,那么做一个import package[.subpackage]
(或者from package import subpackage
)就没有任何意义。
这些不必要的副作用真的非常严重,语言实际上必须保护程序员不会造成它们吗? 实际上,我认为Python更多的是“如果程序员想要这样做,那就让他去做吧。” 在我的情况下,我真的想用from package import subpackage
的单个语句导入所有子模块,因为我需要所有子模块! 在__init__.py
文件中告诉Python我正在谈论的子模块(所有这些!)从我的角度来看是非常麻烦的。
请赐教。 :)
如果它自动导入__init__.py
子模块,它取决于包。 例如, os
自动导入os.path
,所以这适用:
import os
print os.path.abspath('somefile')
所以包的创建者可以决定什么是最好的。 如果自动加载所有子模块需要相当长的时间并且很少需要,可能不应该这样做。 如果始终需要所有子模块,则可能应自动导入它们。
如果您认为某个包导入不够,您可以通过编写自己的包装模块来执行所有导入,然后将其与from wrappermodule import *
。
如上所述,解决方案是导入每个子模块。 您可以使用黑客来避免列出它们:
import os
def import_sub():
for fn in os.listdir(os.path.dirname(__file__)):
if fn.endswith(".py") and fn != "__init__.py":
__import__(".".join([__name__, os.path.basename(fn)[:-3]]), level=0)
import_sub()
del import_sub # if desired
在某些情况下,这很容易破裂。 但是,它将处理常见情况,可能暂时适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.