传递/导出整个第三方模块(使用__all__?)
问题描述:
我有一个模块,用于封装另一个模块以在某些函数中插入一些填充逻辑。封装的模块使用了我想公开的设置模块mod.settings
,但我不希望用户从那里导入它,以防我将来也可以使用这些模块。我希望他们导入wrapmod.settings
。传递/导出整个第三方模块(使用__all__?)
导入模块并导出它工作,但在客户端有点冗长。它导致必须写settings.thing
而不是仅仅thing
。
我希望用户能够做到from wrapmod.settings import *
并且如果他们from mod.settings import *
但现在,只有from wrapmod import settings
可以得到相同的结果。我如何解决这个问题?
答
如果我正确地理解了这种情况,那么您正在编写一个模块wrapmod
,用于转换现有软件包的一部分mod
。您正在转换的特定部分是子模块mod.settings
。您已导入settings
模块并对其进行了更改,但即使它可用作wrapmod.settings
,也不能在from ... import ...
语句中使用该模块名称。
我认为解决这个问题的最好方法就是将修改过的模块插入到sys.modules
的新点名下。这使得Python接受该名称是有效的,即使wrapmod
不是一个真正的包。
所以wrapmod
看起来是这样的:
import sys
from mod import settings
# modify settings here
sys.modules['wrapmod.settings'] = settings # add this line!
答
我最终作出一个代码生成一个简单封装模块代替,因为sys.module
黑客打破了所有的IDE集成。
from ... import mod
# this is just a pass-through wrapper around mod.settings
__all__ = mod.__all__
# generate pass-through wrapper around mod.settings; doesn't break IDE integration, unlike manual sys.modules editing.
if __name__ == "__main__":
for thing in settings.__all__:
print(thing + " = mod." + thing)
当作为脚本运行时,输出代码,然后可以将代码附加到此文件的末尾。