首页 > 编程问答 >Singledispatch 并将类型作为输入参数

Singledispatch 并将类型作为输入参数

时间:2024-07-28 04:55:24浏览次数:7  
标签:python python-typing

我希望能够做到这一点:

from typing import Type
from functools import singledispatch

class A:
    pass

class B(A):
    pass

@singledispatch
def foo(arg):
    print('default')

@foo.register
def _(arg: Type[A]):
    print(arg)

foo(A)
foo(B)

但是,我得到 Invalid annotation for 'arg'. typing.Type[__main__.arg] is not a class.

我猜 singledispatch 暂时不完全支持 typing 有什么优雅的解决方法吗?

UPD 我无法修改 A B


是对的, singledispatch 目前在处理 typing.Type 注解时存在一些限制。

一种解决方法是使用字符串作为注册键,并在函数内部进行类型检查:

from functools import singledispatch

class A:
    pass

class B(A):
    pass

@singledispatch
def foo(arg):
    print('default')

@foo.register(str)
def _(arg: str):
    if arg == 'A':
        print(A)
    elif arg == 'B':
        print(B)

foo(A)  # 调用默认实现
foo('A') # 打印 <class '__main__.A'>
foo('B') # 打印 <class '__main__.B'>

这段代码使用字符串 "A" 和 "B" 来注册处理 A B 类型的函数。在函数内部,我们使用 if 语句检查传入的字符串并执行相应的逻辑。

优点 :

  • 简单易懂。
  • 避免了 singledispatch typing.Type 的限制。

缺点 :

  • 需要手动维护类型字符串和实际类型之间的映射关系。
  • 在函数内部进行类型检查可能会影响性能,尤其是在处理大量类型的时候。

其他方法 :

  • 使用第三方库,例如 multipledispatch ,它提供了更强大的多重分派功能,并且可以更好地处理类型注解。
  • 使用自定义装饰器实现类似 singledispatch 的功能,并在装饰器内部处理类型注解。

希望这些信息对有所帮助!如果有任何其他问题,请随时提出。

标签:python,python-typing
From: 55393179

相关文章

  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......
  • Python学习笔记45:游戏篇之外星人入侵(六)
    前言飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。子弹模块子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对......
  • 三种语言实现二分(C++/Python/Java)
    题目给定一个按照升序排列的长度为......