我希望能够做到这一点:
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