Python 是否';从模块导入功能';语句导致在给定模块中隐式导入其他函数
我的问题最初是由一个错误提出的,突出显示。原来的问题现在已经解决了,但这留下了一个关于导入在Python中如何工作的问题。以下是使用Django重现问题的快速步骤:Python 是否';从模块导入功能';语句导致在给定模块中隐式导入其他函数,python,django,import,Python,Django,Import,我的问题最初是由一个错误提出的,突出显示。原来的问题现在已经解决了,但这留下了一个关于导入在Python中如何工作的问题。以下是使用Django重现问题的快速步骤: 使用django管理员启动一个虚拟项目 使用它创建应用程序:/manage.py startapp dummy\u应用程序 在appmodels.py中定义扩展Django模型的函数和类,如下所示: from django.db import models # auxiliary function in models def au
/manage.py startapp dummy\u应用程序
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
from dummy_app.models import aux_function
\uuuu init\uuuu
中,导入所述的辅助功能,如下所示:
from django.db import models
# auxiliary function in models
def aux_function(value):
print(value)
class Report(models.Model):
class Meta:
managed = False
from dummy_app.models import aux_function
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.")
File”/home/aanikeev/PycharmProjects/dummy/dummy\u app/\uuuuuuu init\uuuuuuuuuu.py”,第1行,在
从虚拟应用程序模型导入辅助功能
文件“/home/aanikeev/PycharmProjects/dummy/dummy_app/models.py”,第8行,在
课堂报告(models.Model):
文件“/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site packages/django/db/models/base.py”,第110行,新__
app\u config=apps.get\u包含app\u config(模块)
文件“/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site packages/django/apps/registry.py”,第247行,在包含应用程序配置的get_中
self.check_apps_ready()
文件“/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site packages/django/apps/registry.py”,第125行,在check\u apps\u ready中
raise AppRegistryNotReady(“应用程序尚未加载。”)
这是可以的,我们从文档中知道,在Django初始化之前,我们不应该用它们导入模型或模块(请参见,)。我不清楚的是,为什么从模块导入函数会导致隐式导入同一模块中的类(这正是发生的情况,因为提到的异常源自模型元类的构造函数)?为了导入模块中的任何对象,必须导入并运行整个模块。Python不区分定义和其他代码——所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便导入它。如果该执行包括导入其他文件的调用,则也将执行这些导入(这有时会导致循环导入依赖项)。类似地,如果模块级有任何其他代码访问数据库或打印到控制台,也将执行这些代码。为了导入模块中的任何对象,必须导入并运行整个模块。Python不区分定义和其他代码——所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便导入它。如果该执行包括导入其他文件的调用,则也将执行这些导入(这有时会导致循环导入依赖项)。类似地,如果模块级有任何其他代码访问数据库或打印到控制台,也将执行这些代码