“进口包装”的目的是什么?

时间:2010-04-13 10:30:42

标签: python import package

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我正在谈论的子模块(所有这些模块!)从我的角度来看是非常麻烦的。

请赐教。 :)

2 个答案:

答案 0 :(得分:4)

如果它自动导入__init__.py中的子模块,则取决于包。例如,os会自动导入os.path,因此可以使用:

import os
print os.path.abspath('somefile')

所以包的创建者可以决定什么是最好的。如果自动加载所有子模块需要相当长的时间并且很少需要,可能不应该这样做。如果总是需要所有子模块,则可能应该自动导入它们。

如果您认为某个软件包导入不够,您可以编写自己的包装模块来执行所有导入,然后将其与from wrappermodule import *一起使用。

答案 1 :(得分:1)

如上所述,解决方案是导入每个子模块。您可以使用黑客来避免列出它们:

__初始化__。PY

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

在某些情况下,这很容易破裂。但是,它将处理常见情况,可能暂时适用。