As I just found out import package
没有通过package.module使软件包的模块可用。 from package import subpackage
以及from package import *
如果我无法访问其子模块而只访问__init__.py
中定义的对象,那么根本导入包的目的是什么?
对我来说from package import *
会使命名空间膨胀是有意义的,但是,在其他两种方式的情况下,这不适用!我也明白加载所有子模块可能take a long time。但我不知道这些不必要的副作用是什么,“这应该只在明确导入子模块时发生”,这是前一个链接的作者提到的。
对我来说,如果我不想访问import package[.subpackage]
中提供的对象,那么执行from package import subpackage
(或__init__.py
)就没有任何意义。
这些不必要的副作用是否真的非常严重,语言实际上必须保护程序员不会造成它们?实际上,我认为Python更多的是“如果程序员想要这样做,那就让他去做吧。”
在我的情况下,我确实想要使用单个语句from package import subpackage
导入所有子模块,因为我需要所有这些子模块!
在__init__.py
文件中告诉Python我正在谈论的子模块(所有这些模块!)从我的角度来看是非常麻烦的。
请赐教。 :)
答案 0 :(得分:4)
如果它自动导入__init__.py
中的子模块,则取决于包。例如,os
会自动导入os.path
,因此可以使用:
import os
print os.path.abspath('somefile')
所以包的创建者可以决定什么是最好的。如果自动加载所有子模块需要相当长的时间并且很少需要,可能不应该这样做。如果总是需要所有子模块,则可能应该自动导入它们。
如果您认为某个软件包导入不够,您可以编写自己的包装模块来执行所有导入,然后将其与from wrappermodule import *
一起使用。
答案 1 :(得分:1)
如上所述,解决方案是导入每个子模块。您可以使用黑客来避免列出它们:
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
在某些情况下,这很容易破裂。但是,它将处理常见情况,可能暂时适用。