Python:强制每个导入重新加载

标签 python metaprogramming python-import monkeypatching

有没有办法强制import x在Python中始终重新加载x(即,就好像我调用了reload(x) ,或 Python 3 的 imp.reload(x) )?或者一般来说,是否有某种方法可以强制每次运行 import x 时运行某些代码?我可以接受猴子补丁或黑客攻击。

我尝试将代码移至单独的模块中,并从该单独文件中的 sys.modules 中删除 x 。我涉足了一些导入钩子(Hook),但我并没有太努力,因为根据文档,它们仅在检查 sys.modules 缓存后才会被调用。我还尝试使用自定义 dict 子类对 sys.modules 进行猴子修补,但每当我这样做时,from module import submodule 都会引发 KeyError (我是猜测 sys.modules 不是真正的字典)。

基本上,我正在尝试编写一个调试工具(这就是为什么这里可以进行一些黑客攻击)。我的目标很简单,import x 的输入时间比 import x;x.y 更短。

最佳答案

如果您确实想更改 import 语句的语义,则必须修补解释器。 import 检查指定的模块是否已加载,如果是,则不执行任何操作。您必须准确地更改这一点,这是解释器中硬连线的。

也许您可以接受修补 Python 源代码以使用 myImport('modulename') 而不是 import modulename?这使得 Python 本身成为可能。

关于Python:强制每个导入重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056351/

相关文章:

python - 如何从 Django 项目中的一个目录导入一些东西?

PYTHONPATH 共享库问题

python - 如何在 Python 中使用 Google HttpMock?

java - 您可以使用 Groovy 元编程来覆盖 Java 类上的私有(private)方法吗

python - 从不同的文件夹导入python中的模块

c++ - 在 C++ 中使用带有模板方法的模板类

ruby - module_eval/class_eval/instance_eval 如何统计行号

python - 命名空间和类

python - 从另一个命令调用的 Django 命令中的重定向会导致无关的换行符。我怎样才能解决这个问题?

python - 为什么 setattr(super(), ...) 不等同于 super().__setattr__(...)?