如何在Python中提取函数签名作为类型?TypeScript方案无法复用
Python是否支持像TypeScript那样通过typeof提取函数签名类型?
Python的类型系统无法完全复刻TypeScript中typeof提取函数签名的便捷性,但根据Python版本不同,有对应的解决方案:
为什么你的代码无法工作
你使用Type[foo]是错误用法:typing.Type是用于表示类的类型的工具,而非函数的签名类型。这里foo是一个函数对象,Type[foo]实际表示的是这个函数对象本身的类型的类型,所以Pylance会识别为type[type],自然无法提供正确的代码补全。
解决方案
- Python 3.12+:原生支持提取函数类型
Python 3.12引入了type[obj]语法(注意是小写的type,不是typing.Type),可以直接提取对象的类型,包括函数的签名:
def foo(bar: str) -> str: pass # 提取foo的函数签名类型作为别名 FooFunc = type[foo] foo_looking_func: FooFunc = foo # 类型检查器会识别正确的签名,提供补全
- Python 3.11及更早版本:手动定义Callable别名
旧版本没有原生的类型提取语法,需要手动复用函数签名定义Callable类型别名:
from typing import Callable # 先定义与foo匹配的函数类型别名 FooFunc = Callable[[str], str] def foo(bar: str) -> str: pass foo_looking_func: FooFunc = foo # 类型匹配,支持代码补全
如果需要确保别名和原函数签名严格一致,可以结合inspect模块动态获取签名,但静态类型检查器(如Pylance、mypy)无法识别动态生成的类型,所以静态场景下还是推荐手动定义。
内容的提问来源于stack exchange,提问作者Gody
相关产品推荐
相关产品推荐

