Python 是否';从模块导入功能';语句导致在给定模块中隐式导入其他函数

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

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

  • 使用django管理员启动一个虚拟项目
  • 使用它创建应用程序:
    /manage.py startapp dummy\u应用程序
  • 在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
    
    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不区分定义和其他代码——所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便导入它。如果该执行包括导入其他文件的调用,则也将执行这些导入(这有时会导致循环导入依赖项)。类似地,如果模块级有任何其他代码访问数据库或打印到控制台,也将执行这些代码