使用__init__.py

65 python module packages initialization

我很难理解__init__.py我项目中python 文件的使用场景或设计目标.

假设我有'model'目录(引用为包),其中包含以下文件

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

我发现了两种使用方式__init__.py:

  1. 我有共同的需要被用于定义solrmodel.py,mongomodel.py,samodel.py.我可以__init__.py用作所有*model.py类的基本/公共定义吗?这意味着我必须导入model/__init__.py.

  2. 或者,它__init__.py应该自己导入solrmodel.py,mongomodel.py,samodel.py的定义,它允许轻松导入类或函数,如下所示:

    # file: __init__.py
    
    from mongomodel import *
    from solrmodel import *
    from samodel import *
    
    Run Code Online (Sandbox Code Playgroud)

    (我知道import *不建议这样做,我只是将它作为惯例使用)

我无法在上述两种情况之间做出决定.是否有更多的使用场景,__init__.py您能解释一下使用情况吗?

Ale*_*lli 50

__init__.py我写的绝大多数文件都是空的,因为许多软件包没有任何初始化的东西.

其中,我可能要初始化一个例子是,当在包加载时间我想在一组数据一劳永逸阅读(来自文件的数据块,或网页,说的) -在这种情况下,它漂亮到将该读取放在包中的私有函数中__init__.py而不是单独的"初始化模块",并从包中的每个单个实模块中冗余地导入该模块(无用的重复且容易出错:这显然是依赖于语言的情况)保证的包__init__.py 在包中的任何模块之前加载一次显然要更Python!).

对于其他具体和权威的意见表达,请查看作为Python标准库一部分的各种包中采用的不同方法.

  • 就个人而言,我宁愿不在`__init __.py`中加入大量代码,但没有深层理由避免它 - 它纯粹是一种风格选择.第一次导入包或包中的任何模块时,将执行该文件中的所有代码. (8认同)
  • Pylons建议将模型放在__init__.py中.可以吗?这是否真的以这种方式初始化模型? (2认同)

Ign*_*ams 23

__init__.py导入包中的模块时导入的内容.

你忽略了第三个场景,即将公共部分放在一个单独的模块中,然后让其他模块导入它,留下__init__.py将在包外使用的东西.这是我经常遵循的做法.

  • @Tyler Long,他的意思是拥有一个单独的初始化模块(fe`bootstrap`并在包的`__init __.py`中调用`import bootstrap`. (4认同)
  • 我不太明白。您能否提供第三种情况的示例? (2认同)