Skip to main content
 首页 » 编程设计

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

2025年05月04日23三少

我的问题最初是由一个错误提出的,突出显示 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 1 、 ref 2 )。我不清楚的是为什么从模块导入函数会导致在同一模块中隐式导入类(这正是发生的情况,因为提到的异常源自 Model 元的构造函数类)?

请您参考如下方法:

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