【问题标题】:Does 'from module import function' statement cause implicit imports of other functions in given module'from module import function' 语句是否会导致给定模块中其他函数的隐式导入
【发布时间】:2017-05-15 11:39:38
【问题描述】:

我的问题最初是由一个错误提出的,突出显示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 django import


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多