Python能否创建统一导入全量模块的公共模块,该方案是否合理
结论先行
技术上可以实现类似效果,但你给出的示例代码存在语法错误,且这种开发模式在Python中极度不推荐,会带来很多难以排查的问题。
先修正你示例里的写法错误
Python导入模块时不需要加.py后缀,同时你需要在models/、audio/、graphics/、common/每个子目录下都创建一个空的__init__.py文件,Python才会把这些目录识别为可导入的包。
修正后的driverlib.py写法参考:
# 自定义项目模块,注意同名模块要手动起别名避免冲突 from models import player, monster from audio import mixer, effects, player as audio_player from graphics import renderer, screen from common import constants # 第三方依赖 import numpy import matplotlib
其他模块中导入时直接写import driverlib即可,不需要加后缀。但要注意:和C语言头文件直接展开符号的机制不同,Python导入后你需要通过driverlib.xxx的前缀访问对应内容,比如调用numpy要写driverlib.numpy.array(),调用音频模块要写driverlib.audio_player.play(),不能直接用numpy、audio_player这类名字。
为什么不推荐这种统一导入的写法
- 极易触发循环导入报错:比如
models/player.py导入driverlib,driverlib又反过来导入models.player,Python在处理这种循环引用时,很容易出现"模块属性不存在"的报错——因为模块还没初始化完成就被其他地方引用了,项目规模越大,这类问题排查成本越高。 - 严重拖慢运行效率:不管某个文件实际只需要用到一个常量,还是只调用一个简单工具函数,只要导入
driverlib,就会把整个项目所有自定义模块、所有第三方依赖全部加载到内存,程序启动速度会明显变慢,内存占用也会不必要地升高。 - 代码可读性、可维护性极差:Python的设计原则是显式优于隐式,如果所有依赖都藏在
driverlib里,其他人读代码时看到一个函数、一个类,根本没法直接从当前文件的导入语句判断它来自哪里,必须跳转到driverlib里翻找,后期迭代、改bug的时候效率极低。 - 命名冲突风险高:比如你示例里
models/和audio/目录下都有player.py,你必须在driverlib里手动给其中一个起别名,一旦漏写,后导入的模块会直接覆盖前面的,引发非常隐蔽的逻辑bug。
Python项目的常规做法
- 每个文件只导入自己实际用到的模块、类、函数,需要什么导什么。现在所有主流Python IDE都支持自动补全导入、自动整理导入顺序,根本不需要手动逐行写导入,完全不会有你说的繁琐问题。
- 如果某一个目录下的模块经常被外部批量导入,可以在对应目录的
__init__.py文件里做统一导出,比如graphics/__init__.py里写:
外部使用时直接写from .renderer import Renderer from .screen import Screenfrom graphics import Renderer, Screen即可,不需要逐个从子模块导入。 - 第三方库全项目统一使用社区通用别名即可,比如
import numpy as np、import matplotlib.pyplot as plt,不需要额外做统一封装。
内容的提问来源于stack exchange,提问作者jwberlin
相关产品推荐
相关产品推荐

