我的问题最初是由一个错误提出的,突出显示 here .原来的问题现在已经解决了,但这留下了一个关于导入在 Python 中如何工作的问题。以下是使用 Django 重现问题的快速步骤:
- 使用 django-admin 启动一个虚拟项目
- 用它创建一个应用程序:
./manage.py startapp dummy_app
在应用程序
models.py
中定义一个函数和一个扩展Django 模型的类,如下所示:from django.db import models # auxiliary function in models def aux_function(value): print(value) class Report(models.Model): class Meta: managed = False
在新应用模块的
__init__
中,导入上述aux_function
如下:from dummy_app.models import aux_function
- 将应用程序添加到
INSTALLED_APPS
并运行开发服务器
它会导致异常:
File "/home/aanikeev/PycharmProjects/dummy/dummy_app/__init__.py", line 1, in <module>
from dummy_app.models import aux_function
File "/home/aanikeev/PycharmProjects/dummy/dummy_app/models.py", line 8, in <module>
class Report(models.Model):
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/db/models/base.py", line 110, in __new__
app_config = apps.get_containing_app_config(module)
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/apps/registry.py", line 247, in get_containing_app_config
self.check_apps_ready()
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/apps/registry.py", line 125, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
没关系,我们从文档中知道我们不应该在 Django 初始化之前导入模型或模块(参见 ref 1 、 ref 2 )。我不清楚的是为什么从模块导入函数会导致在同一模块中隐式导入类(这正是发生的情况,因为提到的异常源自 Model 元的构造函数类)?
最佳答案
为了导入模块中的任何对象,必须导入并运行整个模块。 Python 不区分定义和其他代码 - 所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便可以导入。如果该执行包括导入其他文件的调用,那么这些导入也将被执行(这有时会导致循环导入依赖)。类似地,如果在模块级别有任何其他代码访问数据库或打印到控制台,这些代码也将被执行。
关于python - 'from module import function' 语句是否导致给定模块中其他函数的隐式导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978540/