python - 为什么`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 *
?
解决方案
星号 (*) 在 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>
干净多了
推荐阅读
- perl - 自动替换服务器中的 exe 文件或 script/myscript.pl
- java - java.lang.IllegalStateException:找不到所需的标识符属性
- python - 无法通过 pip 安装 watson 开发者云模块
- regex - 将日志字符串转换为fail2ban的正则表达式
- arrays - Excel:识别数组公式最终结果中使用的参考行
- ios - iOS 13 - 应用程序因终止原因而崩溃:命名空间 SPRINGBOARD,代码 0xbaadca11
- javascript - 按钮 onClick() 函数未在 JavaScript 中第二次执行
- docker - 为更多并行运行/启动容器配置 docker 和 docker-compose
- php - 并非所有命令都适用于 exec/shell_exec
- vue.js - vue-cli-service 详细构建模式