我想有一些回调运行每当一个特定的模块被导入。例如(使用一个不存在的假@imp.when_imported
函数):
@imp.when_imported('numpy')
def set_linewidth(numpy):
import shutil
numpy.set_printoptions(linewidth=shutil.get_terminal_size()[0])
此功能在PEP 369: Post import hooks中设计,但由于以下原因而被撤回:
这个PEP已经被其作者撤回,因为在Python 3.3中迁移到importlib之后,很多详细的设计都不再有效。
但是importlib没有明确的解决方案。如何使用importlib
实现post-import钩子?
4条答案
按热度按时间qybjjes11#
我会震惊地发现这是最好的方法。然而,从早期的python2.x版本开始,就支持了monkey patching
__import__
。我们可以在这里利用这一点:这个答案使得注册回调的注册表非常简单。装饰器只是注册函数,然后返回它。它不做任何花哨的检查(例如,检查模块是否已经加载),但可以很容易地扩展到这样做。
很明显,缺点是如果其他模块决定对
__import__
进行临时修补,那么您就不走运了--这个模块或其他模块都可能会崩溃。我已经测试过了,它似乎可以在python2.x和python3.x上工作。
qni6mghb2#
wrapt
模块提供了一个实现。观看有关
wrapt
的视频,包括以下功能:不要认为
wrapt
的文档中提到了它。一些博客文章在结尾:
但还是要谈谈。
wrapt
有一个名为autowrapt
的配套模块,它允许您使用此机制进行monkey修补,而无需更改应用程序代码本身来触发它。wqnecbli3#
另一种简单得多但有限的方法是检查是否已导入
numpy
。只有当在程序中的某个点上所有导入都完成了,但是根据配置或环境,可能导入了也可能没有导入像numpy
这样的特定模块时,这才有效。如果你需要处理一个模块在程序后面的任何时候被导入,那么这将不起作用。8yparm6h4#
这个有用吗