传递/导出整个第三方模块(使用__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) 

当作为脚本运行时,输出代码,然后可以将代码附加到此文件的末尾。