【问题标题】:Why would I put code in __init__.py files?为什么我要将代码放在 __init__.py 文件中?
【发布时间】:2011-08-15 10:14:23
【问题描述】:

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

非常感谢任何对已知文档的引用来解释这一点。

【问题讨论】:

标签: python module


【解决方案1】:

库和框架通常使用__init__.py文件中的初始化代码巧妙地隐藏内部结构并为用户提供统一的界面

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

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

【讨论】:

    【解决方案2】:

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

    from coollibrary import OneClass, SecondClass
    

    而不是

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

    另外,好的做法是包含在__init__.py 版本常量中

    【讨论】:

    • 版本常量是什么意思?能否请您清除此声明?
    【解决方案3】:
    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)
      

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 1970-01-01
      • 2018-01-13
      • 2010-09-12
      • 1970-01-01
      • 2020-01-26
      • 2019-10-06
      • 2013-09-03
      • 1970-01-01
      相关资源
      最近更新 更多