为什么我会将python代码放在​​__init__.py文件中

时间:2011-04-29 10:59:00

标签: python module

我正在寻找将__init__.py文件放入哪种类型的代码以及与此相关的最佳实践。或者,这一般是不好的做法吗?

对于解释这一点的已知文件的任何引用也非常感谢。

3 个答案:

答案 0 :(得分:56)

库和框架通常使用__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中,您可以直接从表单命名空间引用各种小部件,表单,字段等。

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命名空间使用所有这些函数/类。这只是一个例子,但你可以在其他框架和库中看到这样的例子。

答案 1 :(得分:10)

该领域的最佳实践之一是从您的​​库中导入所有需要的类(例如,查看mongoengine)。因此,您图书馆的用户可以这样做:

from coollibrary import OneClass, SecondClass

而不是

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

此外,良好做法包括在__init__.py版本常量

答案 2 :(得分:1)

  1. 为方便起见:其他用户无需了解您的功能的确切位置。

    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
    

    然后其他人可以通过

    调用add()
    from your_package import add
    

    不知道file1,比如

    from your_package.file1 import add
    
  2. 用于初始化的东西。例如,日志记录(这应该放在顶层):

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