【发布时间】:2011-08-15 10:14:23
【问题描述】:
我正在寻找我将在__init__.py 文件中放入什么类型的代码,以及与此相关的最佳实践是什么。或者,一般来说这是一种不好的做法吗?
非常感谢任何对已知文档的引用来解释这一点。
【问题讨论】:
-
What is init.py for? 的可能重复项
我正在寻找我将在__init__.py 文件中放入什么类型的代码,以及与此相关的最佳实践是什么。或者,一般来说这是一种不好的做法吗?
非常感谢任何对已知文档的引用来解释这一点。
【问题讨论】:
库和框架通常使用__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 命名空间使用所有这些。这只是一个示例,但您可以在其他框架和库中看到类似的示例。
【讨论】:
该领域的最佳实践之一是从您的库中导入所有需要的类(例如,查看mongoengine)。因此,您图书馆的用户可以这样做:
from coollibrary import OneClass, SecondClass
而不是
from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass
另外,好的做法是包含在__init__.py 版本常量中
【讨论】:
为方便起见:其他用户不需要知道您的函数的确切位置。
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
放一些东西来初始化。例如,日志记录(这应该放在顶层):
import logging.config
logging.config.dictConfig(Your_logging_config)
【讨论】: