.pyc文件是否包含类型提示信息?能否通过typing.get_type_hints()读取?
类型提示在.pyc文件中的留存与访问问题
你问到的这个问题很有意思——之前以为类型提示全靠读取明文源码,但其实Python确实会把类型提示信息存储在对象本身,那编译成.pyc后还能拿到这些信息吗?答案是肯定的,类型信息会被保留,拿到.pyc文件的人完全可以用typing.get_type_hints()来访问。
为什么类型提示能在.pyc中留存?
Python在编译.py文件到.pyc时,会把函数的类型注解(也就是你写的a: int、-> str这类内容)作为函数对象的__annotations__属性保存下来。这个属性是一个字典,会被序列化到.pyc文件里,和函数的其他元数据(比如名称、参数信息)一起存储。
实际验证一下
我们可以用你给出的代码来测试:
- 先写一个
test.py文件:
def myfunc(a: int, b:int) -> str: return "{a} + {b} = {a+b}"
- 编译成.pyc(可以直接运行一次,Python会自动生成
__pycache__目录下的.pyc文件)。 - 删除原.py文件,只保留.pyc文件,然后在同一个目录下运行Python交互环境:
from test import myfunc import typing print(myfunc.__annotations__) # 输出: {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'str'>} print(typing.get_type_hints(myfunc)) # 输出同样是上面的字典内容
从结果就能看到,即使没有原.py文件,仅通过.pyc也能完整获取到类型提示信息。
补充说明
- 这里的前提是编译.pyc时的Python版本和读取时的版本兼容(比如都是3.10+,不同小版本一般没问题,但跨大版本可能存在兼容性问题)。
- 如果你担心类型提示被获取,目前Python本身没有默认机制在编译时移除这些注解,除非你手动在代码里删除
__annotations__属性,或者使用第三方工具来剥离这类元数据。
内容的提问来源于stack exchange,提问作者Schilcote
相关产品推荐
相关产品推荐

