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

web*_*uth 64 python module

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

任何对已解释此文档的已知文档的引用也非常感谢.

Pra*_*ota 59

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

我们以Django表单模块为例.表单模块中的各种函数和类根据其分类在不同的文件中定义.

forms/
  __init__.py
  extras/
    ...
  fields.py
  forms.py
  widgets.py
  ...
Run Code Online (Sandbox Code Playgroud)

现在,如果你要创建一个表单,你必须知道每个函数定义在哪个文件中,你创建联系表单的代码必须看起来像这样(这是不方便和丑陋的).

 class CommentForm(forms.forms.Form):
    name = forms.fields.CharField() 
    url = forms.fields.URLField()
    comment = forms.fields.CharField(widget=forms.widgets.Textarea) 
Run Code Online (Sandbox Code Playgroud)

相反,在Django中,您可以直接从forms命名空间引用各种小部件,表单,字段等.

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField(widget=forms.Textarea)
Run Code Online (Sandbox Code Playgroud)

这怎么可能?为了实现这一点,Django将以下语句添加到forms/__init__.py文件中,该文件将所有小部件,表单,字段等导入到forms命名空间中.

from widgets import *
from fields import *
from forms import *
from models import *
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这在创建表单时简化了您的生活,因为现在您不必担心每个函数/类的定义位置,只需直接从forms命名空间使用所有这些函数/类.这只是一个例子,但你可以在其他框架和库中看到这样的例子.


dar*_*vin 10

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

from coollibrary import OneClass, SecondClass
Run Code Online (Sandbox Code Playgroud)

代替

from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass
Run Code Online (Sandbox Code Playgroud)

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


fly*_*cee 6

  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
    
    Run Code Online (Sandbox Code Playgroud)

    然后其他人可以通过调用 add()

    from your_package import add
    
    Run Code Online (Sandbox Code Playgroud)

    不知道file1,就像

    from your_package.file1 import add
    
    Run Code Online (Sandbox Code Playgroud)
  2. 放一些东西来初始化。例如,日志记录(这应该放在顶层):

    import logging.config
    logging.config.dictConfig(Your_logging_config)
    
    Run Code Online (Sandbox Code Playgroud)