代码之家  ›  专栏  ›  技术社区  ›  balu

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

  •  6
  • balu  · 技术社区  · 14 年前

    As I just found 外面的 import package 不通过package.module提供包的模块。同样的道理显然也适用于 from package import subpackage 以及 from package import *

    如果我不能访问包的子模块,而只能访问 __init__.py ?

    我觉得这很有道理 从包导入* 会使名称空间膨胀,但是在其他两种情况下不适用!我也知道加载所有子模块可能 take a long time . 但我不知道这些不必要的副作用是什么,“只有在显式导入子模块时才会发生”,这是前一个链接的作者提到的。 对我来说就像是 import package[.subpackage] (或) 从包导入子包 )如果我不想访问 π介子 .

    这些不必要的副作用真的那么严重吗,以至于语言必须保护程序员不致引起这些副作用?实际上,我认为python更多的是关于“如果程序员想这么做,就让他这么做”。 在我的例子中,我真的想用一条语句导入所有的子模块 从包导入子包 ,因为我需要所有这些! 告诉python π介子 我说的是哪个子模块(全部!)在我看来很麻烦。

    请启发我。:)

    2 回复  |  直到 14 年前
        1
  •  4
  •   sth Alien    14 年前

    如果包自动导入 __init__.py 或者没有。例如 os 自动导入 os.path ,所以这是有效的:

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

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

    如果您认为包导入不够,可以编写自己的包装器模块来完成所有导入,然后将其与 from wrappermodule import * .

        2
  •  1
  •   Roger Pate    14 年前

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

    π介子

    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
    

    在某些情况下,这很容易打破。不过,它将处理常见的情况,可以暂时适用。