在动态导入的模块中注册 singledispatch 函数

本泽尔姆

我正在尝试将动态导入的模块中的附加功能注册到单分派功能。

main.py

from importlib import import_module
from functools import singledispatch

@singledispatch
def handle(a):
    return 'default'

def import_something():
    other_module = import_module('dynimp')
    handle_result = handle(1)
    assert handle_result == 'int', f'Error: {handle_result}'

if __name__ == '__main__':
    import_something()

dynimp.py

from main import handle

@handle.register(int)
def handle_int(a):
    return 'int'

中的断言import_something失败,我得到'default',而不是'int'

我进一步调查了一下。函数对象在导入时以某种方式被复制dynimp如果我在 之后设置断点other_module = import_module('dynimp')other_module.handle != handle而 whileother_module.registry显示handle_int 为已注册,handle.registry则不会。

一个有效的解决方案是在 中有一个register函数dynimp.py,然后传递它handle

def do_register(handle_fn):
    handle_fn.register(int, handle_int)

然后添加other_module.do_register(handle)import_something功能。

我的问题是:当我们导入一个装饰函数时会发生什么,为什么这不起作用?

阿兰菲

发生这种情况是因为import main创建了主文件的新实例。确认这一点的简单方法是以下代码:

>>> sys.modules['main'] == sys.modules['__main__']
False

一种解决方案是更改from main import handlefrom __main__ import handle. (请注意,这依赖于main.py作为启动程序文件的文件。)另一种解决方法是sys.modules['main'] = sys.modules['__main__']在导入dynimp.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

导入错误:动态模块未定义 init 函数 (initlibpyuno)

来自分类Dev

无法从模块导入函数

来自分类Dev

jQuery函数未在Wordpress中注册

来自分类Dev

Python:导入与函数同名的模块

来自分类Dev

从Python模块导入隐藏函数

来自分类Dev

从导入模块中的父模块调用函数

来自分类Dev

python导入swig库失败,动态模块没有定义init函数

来自分类Dev

等同于functools.singledispatch的super()

来自分类Dev

如何结合@singledispatch和@lru_cache?

来自分类Dev

在Python中注册要在事件上调用的函数

来自分类Dev

在ConfigureServices中注册服务时将调用哪个构造函数

来自分类Dev

onclick 函数未在创建的 DOM 元素的外层 HTML 中注册

来自分类Dev

Python:如何从导入的模块调用全局函数

来自分类Dev

模拟导入到函数内部的模块

来自分类Dev

从导入模块重新定义调用的函数

来自分类Dev

模拟导入模块时调用的函数

来自分类Dev

TypeError:Webpack导入的模块不是函数

来自分类Dev

在Python中导入模块时运行函数

来自分类Dev

在Prestashop模块中注册挂钩

来自分类Dev

在PowerShell中的模块中动态创建函数

来自分类Dev

从Python中的导入模块替换主模块中的函数

来自分类Dev

在导入模块之前,正在从模块调用函数

来自分类Dev

在angularjs中注入函数

来自分类Dev

如何在实例方法中使用functools.singledispatch?

来自分类Dev

python3:类中的singledispatch,如何调度自类型

来自分类Dev

如何列出Python模块的所有函数而忽略模块导入的函数?

来自分类Dev

反射-从程序集动态创建和注册构造函数

来自分类Dev

如何在Lua用户数据中注册C ++类构造函数并默认使用它

来自分类Dev

如何使用传递给构造函数的新实例覆盖已经在LightInject中注册的类型?

Related 相关文章

  1. 1

    导入错误:动态模块未定义 init 函数 (initlibpyuno)

  2. 2

    无法从模块导入函数

  3. 3

    jQuery函数未在Wordpress中注册

  4. 4

    Python:导入与函数同名的模块

  5. 5

    从Python模块导入隐藏函数

  6. 6

    从导入模块中的父模块调用函数

  7. 7

    python导入swig库失败,动态模块没有定义init函数

  8. 8

    等同于functools.singledispatch的super()

  9. 9

    如何结合@singledispatch和@lru_cache?

  10. 10

    在Python中注册要在事件上调用的函数

  11. 11

    在ConfigureServices中注册服务时将调用哪个构造函数

  12. 12

    onclick 函数未在创建的 DOM 元素的外层 HTML 中注册

  13. 13

    Python:如何从导入的模块调用全局函数

  14. 14

    模拟导入到函数内部的模块

  15. 15

    从导入模块重新定义调用的函数

  16. 16

    模拟导入模块时调用的函数

  17. 17

    TypeError:Webpack导入的模块不是函数

  18. 18

    在Python中导入模块时运行函数

  19. 19

    在Prestashop模块中注册挂钩

  20. 20

    在PowerShell中的模块中动态创建函数

  21. 21

    从Python中的导入模块替换主模块中的函数

  22. 22

    在导入模块之前,正在从模块调用函数

  23. 23

    在angularjs中注入函数

  24. 24

    如何在实例方法中使用functools.singledispatch?

  25. 25

    python3:类中的singledispatch,如何调度自类型

  26. 26

    如何列出Python模块的所有函数而忽略模块导入的函数?

  27. 27

    反射-从程序集动态创建和注册构造函数

  28. 28

    如何在Lua用户数据中注册C ++类构造函数并默认使用它

  29. 29

    如何使用传递给构造函数的新实例覆盖已经在LightInject中注册的类型?

热门标签

归档