我想知道在__init__.py
文件中应该放置什么类型的代码以及与此相关的最佳实践。或者,这通常是一种不好的做法吗?
如果有任何已知文档的参考说明,也非常感谢。
通常,库和框架会在__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
命名空间中使用它们即可。这只是一个例子,但你可以在其他框架和库中看到类似的例子。
在这个领域中最佳实践之一是从您的库中导入所有所需的类(例如请参阅 mongoengine)。因此,库的用户可以执行以下操作:
from coollibrary import OneClass, SecondClass
取代
from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass
此外,一个好的实践是在__init__.py
中包含版本常量。
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
Put something for initializing. For example, the logging(this should put in the top level):
import logging.config
logging.config.dictConfig(Your_logging_config)