使用__init__.py中的__all__导入模块时出现AttributeError,如何让config模块直接暴露mydb.py中的dbkey变量?
init.py中的__all__导入模块时出现AttributeError,如何让config模块直接暴露mydb.py中的dbkey变量?
我刚好遇到过类似的问题,其实核心是你对__init__.py里__all__的作用理解有偏差——它只是控制from ... import *语句的导入范围,并不会自动把子模块的变量提升到父模块的命名空间里。要让config模块直接暴露mydb.py里的dbkey,不用额外加mydb这一层,只需要在config/__init__.py里做简单的显式导入即可,完全不用把所有代码都堆到__init__.py里。
解决方案1:直接将dbkey导入到config模块
修改/var/www/html/hellopy/app/config/__init__.py:
# -*- coding: utf-8 -*- # 从mydb子模块导入dbkey,将其变为config模块的属性 from .mydb import dbkey # 如果需要支持`from app.config import *`导入dbkey,就保留这行 __all__ = ["dbkey"]
解决方案2:保留子模块引用同时暴露dbkey
如果你还想在代码里通过config.mydb访问整个子模块,同时又能直接用config.dbkey,可以这么写:
# -*- coding: utf-8 -*- from . import mydb # 将mydb里的dbkey赋值给config模块的dbkey属性 dbkey = mydb.dbkey # 让import *能同时导入mydb子模块和dbkey变量 __all__ = ["mydb", "dbkey"]
为什么原来的代码会报错?
你之前的__init__.py只有__all__ = ["mydb"],这行代码的作用仅仅是:当别人执行from app.config import *时,会把mydb这个子模块导入到当前命名空间,但它并不会让config模块本身拥有dbkey这个属性——dbkey依然只属于mydb子模块,所以直接访问config.dbkey自然会触发AttributeError。
修改完__init__.py后,你在hellopy.wsgi里的代码:
from app import config mydbkey = config.dbkey
就可以正常工作了,完全符合你想要的“不用多一层mydb调用”的需求。
备注:内容来源于stack exchange,提问作者Jeremy Daniel Gregorio
相关产品推荐
相关产品推荐

