如何以编程方式查找对象类型是否为 Google Protobuf?

How to programmatically find if the object type is of Google Protobuf?

我遇到过从另一个模块接收对象的情况。对象类型可以是 JSON 字符串、字典或 Google Protobuf。我可以在 python 中使用 isinstance 来判断它是 JSON String 还是 dict,但是发现很难使用 isinstance 来检查它是否是 protobuf。我什至不确定 isinstance 是否可以用于像 Google Protobuf 这样的非原始类型。

那么,在 Python 中有没有办法检查给定的对象是 Google Protobuf 类型?

您接收的是 Protobuf 对象还是序列化(二进制)字符串?

如果您正在接收对象,那么这些 应该 Message and isinstance 的子类,使用您的 object for Message 对于 protobufs 应该是正确的.

如果您的传入对象是 o 并且:

assert isinstance(json.loads(o), dict)
assert isinstance(o, dict)

from google.protobuf.message import Message
assert isinstance(o, Message)
assert issubclass(o, Message)

尽管测试每种类型(JSON、dict、proto)需要付出更多努力,但我认为在继续之前确认对象的类型会更好。

您可以通过仅测试直到找到匹配来缩短测试,但您希望避免在将来添加某些第 4 种类型并且您的代码假设任何不是 JSON 或 dict 的东西都是原型.