python - 'from module import function' 语句是否导致给定模块中其他函数的隐式导入

标签 python django import

我的问题最初是由一个错误提出的,突出显示 here .原来的问题现在已经解决了,但这留下了一个关于导入在 Python 中如何工作的问题。以下是使用 Django 重现问题的快速步骤:

  1. 使用 django-admin 启动一个虚拟项目
  2. 用它创建一个应用程序:./manage.py startapp dummy_app
  3. 在应用程序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
    
  4. 在新应用模块的__init__中,导入上述aux_function如下:

    from dummy_app.models import aux_function
    
  5. 将应用程序添加到 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 1ref 2 )。我不清楚的是为什么从模块导入函数会导致在同一模块中隐式导入类(这正是发生的情况,因为提到的异常源自 Model 元的构造函数类)?

最佳答案

为了导入模块中的任何对象,必须导入并运行整个模块。 Python 不区分定义和其他代码 - 所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便可以导入。如果该执行包括导入其他文件的调用,那么这些导入也将被执行(这有时会导致循环导入依赖)。类似地,如果在模块级别有任何其他代码访问数据库或打印到控制台,这些代码也将被执行。

关于python - 'from module import function' 语句是否导致给定模块中其他函数的隐式导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978540/

相关文章:

mysql - Prestashop 导入 CSV 错误 - PRIMARY key 条目重复

html - 使用 IMPORTXML 提取深度嵌入多个 DIV 中的 SPAN 值

python unittest.TestCase.assertRaises 不工作

Django 多重注释减慢查询速度

python3-config --ldflags 不包括 -lpython3.x

django - 让 Pytest 在 Django cookiecutter/Python 3.x 项目中运行

python - 如何在 django 1.6 上安装 django-cms 3

python - 如何添加到jupyter lab中的pythonpath

python - Python 中的奇怪错误 - 变量被视为全局而不是本地

python - Openpyxl - 如何在 Python 中只读取 Excel 文件中的一列?