首页 > 解决方案 > 为什么`from django import *`不能导入所有子模块?

问题描述

星号 (*) 用作通配符from modue_name import *,表示导入 module_name 中的所有子模块。

ls /usr/local/lib/python3.5/dist-packages/django
apps  contrib  dispatch  __init__.py  __pycache__   templatetags  utils
bin   core     forms     __main__.py  shortcuts.py  test          views
conf  db       http      middleware   template      urls

apps位于module中的子django模块。

import django
from django import *
print(django.apps)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'django' has no attribute 'apps'

为什么子模块apps不能被导入from django import *

标签: pythondjango

解决方案


星号 (*) 在 from modue_name import * 中用作通配符,表示导入 module_name 中的所有子模块。

有点。

模块

在 中使用时的星号from <module_name> import *。如果我们谈论的是单个模块(单个文件,例如tools.py),将导入模块内的所有内容。这种模块没有 sub_modules 所以说没有意义

这意味着导入module_name中的所有子模块。

包裹

然而,这里我们正在处理一个名为 django 的包;它有一个__init__.py在 Python 3.3 及更高版本中,包不需要__init__.py文件)文件,因此它是一个包。在这种情况下,调用from <package_name> import *将导入__init__.py包文件中的所有内容,但默认情况下它不会导入包中的其他子模块,除非您定义一个__all__列表并在其中包含您希望导出的子模块、对象和子包的名称sub_package(这是包供应商的工作)。IE

# __init__.py
__all__ = ['apps']

该包还可以显式导入其中的 sub_moudules/sub_packages/objects __init__.py,这使得 sub_moudule 在使用from <package_name> import * 语法时可用,即

# __init__.py
import django.apps

这又是供应商的工作。

解决方案

但是从代码的你这边你应该简单地输入

from django.apps import <what_you_need>

干净多了


推荐阅读