将代码添加到 __init__.py

2022-01-13 00:00:00 python package initialization

问题描述

我正在查看 django 中的模型系统是如何工作的,我发现了一些我不明白的地方.

I'm taking a look at how the model system in django works and I noticed something that I don't understand.

我知道你创建了一个空的 __init__.py 文件来指定当前目录是一个包.并且您可以在 __init__.py 中设置一些变量,以便 import * 正常工作.

I know that you create an empty __init__.py file to specify that the current directory is a package. And that you can set some variable in __init__.py so that import * works properly.

但是django在__init__.py中添加了一堆from ... import ...语句并定义了一堆类.为什么?这不是让事情看起来很乱吗?__init__.py 中是否有需要此代码的原因?

But django adds a bunch of from ... import ... statements and defines a bunch of classes in __init__.py. Why? Doesn't this just make things look messy? Is there a reason that requires this code in __init__.py?


解决方案

当你导入包含它的包(目录)时,__init__.py 中的所有导入都可用.

All imports in __init__.py are made available when you import the package (directory) that contains it.

例子:

./dir/__init__.py:

import something

./test.py:

import dir
# can now use dir.something

忘了提一下,__init__.py 中的代码在您第一次从该目录导入任何模块时运行.所以它通常是放置任何包级初始化代码的好地方.

forgot to mention, the code in __init__.py runs the first time you import any module from that directory. So it's normally a good place to put any package-level initialisation code.

dgrant 在我的示例中指出了可能的混淆.在 __init__.py import something 可以导入任何模块,不需要从包中导入.例如,我们可以将其替换为 import datetime,然后在我们的顶级 test.py 中,这两个片段都可以工作:

dgrant pointed out to a possible confusion in my example. In __init__.py import something can import any module, not necessary from the package. For example, we can replace it with import datetime, then in our top level test.py both of these snippets will work:

import dir
print dir.datetime.datetime.now()

import dir.some_module_in_dir
print dir.datetime.datetime.now()

底线是:在 __init__.py 中分配的所有名称,无论是导入的模块、函数还是类,在您导入包或包中的模块时自动在包命名空间中可用.

The bottom line is: all names assigned in __init__.py, be it imported modules, functions or classes, are automatically available in the package namespace whenever you import the package or a module in the package.

相关文章