inspect无法获取faker库函数类型注解,如何保留编译后的类型信息
类型注解不会在默认编译流程中丢失
Python 3以上版本将代码编译为字节码(包括打包为库安装的过程)时,类型注解会作为函数的__annotations__属性默认保留,不会被自动移除。你遇到的注解丢失,通常是两种原因:
- 你使用的faker版本过旧,对应版本的
random_int源码本身还没有添加类型注解 - faker的方法是动态挂载的:faker的功能逻辑都分散在各个Provider类中,初始化Faker实例时会动态把Provider的类方法绑定到实例上,你拿到的
fake.random_int是绑定后的实例方法包装对象,inspect读取这个包装对象时拿不到原函数的注解。
解决方案
优先尝试读取原函数的签名
绝大多数情况不需要重新编译库,直接访问实例方法的__func__属性就能拿到带注解的原函数,再读取签名即可:
import inspect sig = inspect.signature(fake.random_int.__func__)
也可以直接从对应Provider类读取方法签名:
from faker.providers import BaseProvider import inspect sig = inspect.signature(BaseProvider.random_int)
以上两种方式都可以拿到你预期的带类型注解的签名结果。
确实需要重新编译库保留注解的操作
如果确认你安装的faker包被主动移除了类型注解,可以直接从源码编译安装:
- 卸载现有faker包:
pip uninstall -y faker - 下载对应版本的faker源码到本地
- 进入源码根目录,执行
pip install .,默认编译安装流程会保留所有类型注解。
内容的提问来源于stack exchange,提问作者Qinjie
相关产品推荐
相关产品推荐

