通过/导出整个第三方模块(使用\uuuu all \uuuu?)

2024-10-04 03:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模块,它包装了另一个模块,以便在某些函数中插入一些填充逻辑。包装的模块使用了一个设置模块mod.settings,我想公开它,但是我不想让用户从那里导入它,以防将来我想在那里填充一些东西。我要他们导入wrapmod.settings。你知道吗

导入模块并导出它是可行的,但是在客户端有点冗长。它导致必须写settings.thing,而不是只写thing。你知道吗

我希望用户能够执行from wrapmod.settings import *,并获得与执行from mod.settings import *相同的结果,但现在,只有from wrapmod import settings可用。我该如何解决这个问题?你知道吗


Tags: 模块函数用户fromimportmod客户端settings
2条回答

如果我正确地理解了这种情况,那么您正在编写一个模块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)

当作为脚本运行时,输出的代码可以附加到此文件的末尾。你知道吗

相关问题 更多 >