为什么要在__init__.py文件中放置代码?

83

我想知道在__init__.py文件中应该放置什么类型的代码以及与此相关的最佳实践。或者,这通常是一种不好的做法吗?

如果有任何已知文档的参考说明,也非常感谢。


3
可能是与What is init.py for?重复的问题。 - Aamir
3个回答

70

通常,库和框架会在__init__.py文件中使用初始化代码来整洁地隐藏内部结构并向用户提供统一的接口。

让我们以Django表单模块为例。表单模块中的各种函数和类基于它们的分类在不同的文件中定义。

forms/
  __init__.py
  extras/
    ...
  fields.py
  forms.py
  widgets.py
  ...

如果你要创建一个表单,你需要知道每个函数在哪个文件中被定义,在代码中创建联系表单会变得非常繁琐和难看(不方便且丑陋)。

 class CommentForm(forms.forms.Form):
    name = forms.fields.CharField() 
    url = forms.fields.URLField()
    comment = forms.fields.CharField(widget=forms.widgets.Textarea) 

在Django中,您可以直接从表单命名空间中引用各种小部件、表单、字段等,而不需要使用HTML模板。

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField(widget=forms.Textarea)

这是如何实现的?为了使这个可能,Django在forms/__init__.py文件中添加了以下语句,将所有小部件、表单、字段等导入到forms命名空间中。

from widgets import *
from fields import *
from forms import *
from models import *

正如你所看到的,这简化了你创建表单时的工作,因为现在你不必担心每个函数/类定义在哪里,只需直接从 forms 命名空间中使用它们即可。这只是一个例子,但你可以在其他框架和库中看到类似的例子。


这是一个相当不错的答案,但以beautifulsoup4为例,它似乎将大部分主要功能集中在__init__.py文件中。他们为什么要这样做呢? https://github.com/getanewsletter/BeautifulSoup4/blob/master/bs4/__init__.py - Thorvald

14

在这个领域中最佳实践之一是从您的库中导入所有所需的类(例如请参阅 mongoengine)。因此,库的用户可以执行以下操作:

from coollibrary import OneClass, SecondClass

取代

from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass

此外,一个好的实践是在__init__.py中包含版本常量。


1
版本常量是什么意思?您能否澄清一下这个说法? - thanos.a

7
  1. For convenience: The other users will not need to know your functions' exactly location.

    your_package/
      __init__.py
      file1.py/
      file2.py/
        ...
      fileN.py
    
    # in __init__.py
    from file1 import *
    from file2 import *
    ...
    from fileN import *
    
    # in file1.py
    def add():
        pass
    

    then others can call add() by

    from your_package import add
    

    without knowing file1, like

    from your_package.file1 import add
    
  2. Put something for initializing. For example, the logging(this should put in the top level):

    import logging.config
    logging.config.dictConfig(Your_logging_config)
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接