You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Callable类型?有无Pythonic方式实现类似TS/C#的委托类型?

在Python中创建符合风格的Callable类型

嘿,你的疑问很常见——毕竟Python的类型系统和TypeScript/C#确实有差异,但你写的写法其实完全是符合Python风格且被官方推荐的!

先给你吃个定心丸:MyHandler = Callable[[ClassOne, int], None]这种写法是Python类型注解里定义可调用类型的标准方式,和TypeScript的类型别名、C#的委托是等价的。PyCharm没报错是因为它完全认可这种写法,运行起来也不会有问题,哪怕是私用代码也完全没问题。

不过如果你想要更贴近Python面向对象风格的写法(或者需要更灵活的扩展),还有另一个更Pythonic的方案:使用typing.Protocol(Python 3.8+支持,3.8之前可以用typing_extensions.Protocol)来定义一个可调用协议:

from typing import Protocol

# 先定义你的ClassOne类
class ClassOne:
    pass

# 定义可调用协议,模拟委托的语义
class MyHandler(Protocol):
    def __call__(self, paramOne: ClassOne, num: int) -> None:
        """符合这个签名的可调用对象都属于MyHandler类型"""
        ...

这种写法的好处是:

  • 语义更清晰,看起来更像一个“类型”而不是一个别名,和C#里的委托定义思路更接近
  • 后续如果需要给这个“Handler”添加额外的属性或方法(比如日志记录、状态保存),可以直接在Protocol里扩展,灵活性更强
  • 类型检查器(比如PyCharm、mypy)会严格验证任何标注为MyHandler的对象是否符合__call__的签名

总结一下:

  • 如果只是需要简单的签名标注,Callable的简洁写法完全够用,是Python风格的
  • 如果想要更清晰的语义或扩展能力,Protocol的写法更符合Python的鸭子类型思想,也是非常推荐的Pythonic方案

内容的提问来源于stack exchange,提问作者Steven G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:22:28