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

时间:2017-05-15 11:39:39

标签: python django import

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

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

    from dummy_app.models import aux_function
    
  6. 将应用程序添加到INSTALLED_APPS并运行dev server
  7. 这将导致异常:

      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 元的构造函数类)?

1 个答案:

答案 0 :(得分:5)

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