繁体   English   中英

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

[英]Does 'from module import function' statement cause implicit imports of other functions in given module

我的问题最初是由一个错误引起的, 在此突出显示。 原来的问题现在已经解决了,但这给导入在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在定义和其他代码之间没有区别-所有代码都是可执行的,因此必须执行整个文件才能定义对象,以便可以导入它。 如果执行包括导入其他文件的调用,则还将执行这些导入(有时可能会导致循环导入依赖性)。 同样,如果在模块级别有任何其他代码可以访问数据库或打印到控制台,则这些代码也将被执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM