繁体   English   中英

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

[英]What's the purpose of “import package”?

正如我刚刚发现的那样, import package不会通过package.module使包的模块可用。 from package import subpackagefrom 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 *

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

__init__.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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM