Python中如何通过编程判断对象是否为Google Protobuf类型?
Python判断对象是否为Google Protobuf类型的方法
首先明确:isinstance完全支持对Protobuf这类自定义非原始类型的校验,只要你使用正确的基类即可,下面是两种常用的判断方案:
方案1:基于基类的isinstance校验(推荐)
这是准确率最高、无误判的方案,直接用Protobuf所有消息类的公共父类google.protobuf.message.Message做判断即可:
from google.protobuf.message import Message # target为待校验对象 if isinstance(target, Message): print("对象属于Protobuf消息类型")
所有通过protoc编译生成的Protobuf消息类,都会默认继承Message基类,这个方法可以识别任意自定义的Protobuf消息实例。
方案2:鸭子类型校验(无需导入Protobuf模块)
如果你的场景里不想额外引入Protobuf依赖,可以通过判断Protobuf对象特有的属性和方法来识别,常用的特征属性是DESCRIPTOR、SerializeToString:
def is_protobuf(obj) -> bool: return all([ hasattr(obj, "DESCRIPTOR"), hasattr(obj, "SerializeToString"), callable(getattr(obj, "SerializeToString", None)) ])
这个方案存在极低概率的误判,如果你自行定义的Python类刚好实现了上述两个属性/方法,就会被误识别为Protobuf对象,仅推荐在不能直接导入Protobuf模块的场景下使用。
注意事项
- 不要用你自己业务定义的单个Protobuf类(比如你生成的
User、Order类)做isinstance判断,这类判断只能识别特定的Protobuf类型,无法覆盖所有Protobuf实例。 - 如果待校验的对象是Protobuf的基础类型(比如int32、string这类对应Python原生类型的值),不属于Protobuf消息对象范畴,上述方法都不会识别,你可以自行结合基础类型判断做额外处理。
内容的提问来源于stack exchange,提问作者user2896235
相关产品推荐
相关产品推荐

