如何访问 python 中的 Protocol Buffers 自定义选项?
How to access Protocol Buffers custom option in python?
我正在按照 Google Developers guide 的说明创建自定义消息选项。我使用了他们的示例,但收到错误消息:
Traceback (most recent call last):
File "test_my_opt.py", line 2, in <module>
value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]
File "(...)\google\protobuf\internal\python_message.py", line 1167, in __getitem__
_VerifyExtensionHandle(self._extended_message, extension_handle)
File "(...)\google\protobuf\internal\python_message.py", line 170, in _VerifyExtensionHandle
message.DESCRIPTOR.full_name))
KeyError: 'Extension "my_option" extends message type "google.protobuf.MessageOptions", but this message is of type "google.protobuf.MessageOptions".'
我简单地使用了以下代码:
import my_proto_file_pb2
value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]
还有这个原型文件:
import "beans-protobuf/proto/src/descriptor.proto";
extend google.protobuf.MessageOptions {
optional string my_option = 51234;
}
message MyMessage {
option (my_option) = "Hello world!";
}
一切都像指南中那样...那么我应该如何正确访问此选项?
import "beans-protobuf/proto/src/descriptor.proto";
我认为这是问题所在。 descriptor.proto
的正确导入语句是:
import "google/protobuf/descriptor.proto";
路径字符串很重要,因为您需要扩展描述符类型的原始定义,而不是它们的某些副本。 google/protobuf/descriptor.proto
成为 Python 中的模块 google.protobuf.descriptor_pb2
,并且 Protobuf 库期望任何自定义选项都是其中类型的扩展。但是你实际上是在扩展beans-protobuf/proto/src/descriptor.proto
,它在Python中变成了beans_protobuf.proto.src.descriptor_pb2
,这是一个完全不同的模块!因此,protobuf 库变得混乱,认为这些扩展不适用于 protobuf 描述符。
我认为如果您只更改导入语句,一切都应该有效。正确安装 protobuf 后,google/protobuf/descriptor.proto
应始终作为导入工作——无需提供您自己的文件副本。
我正在按照 Google Developers guide 的说明创建自定义消息选项。我使用了他们的示例,但收到错误消息:
Traceback (most recent call last):
File "test_my_opt.py", line 2, in <module>
value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]
File "(...)\google\protobuf\internal\python_message.py", line 1167, in __getitem__
_VerifyExtensionHandle(self._extended_message, extension_handle)
File "(...)\google\protobuf\internal\python_message.py", line 170, in _VerifyExtensionHandle
message.DESCRIPTOR.full_name))
KeyError: 'Extension "my_option" extends message type "google.protobuf.MessageOptions", but this message is of type "google.protobuf.MessageOptions".'
我简单地使用了以下代码:
import my_proto_file_pb2
value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]
还有这个原型文件:
import "beans-protobuf/proto/src/descriptor.proto";
extend google.protobuf.MessageOptions {
optional string my_option = 51234;
}
message MyMessage {
option (my_option) = "Hello world!";
}
一切都像指南中那样...那么我应该如何正确访问此选项?
import "beans-protobuf/proto/src/descriptor.proto";
我认为这是问题所在。 descriptor.proto
的正确导入语句是:
import "google/protobuf/descriptor.proto";
路径字符串很重要,因为您需要扩展描述符类型的原始定义,而不是它们的某些副本。 google/protobuf/descriptor.proto
成为 Python 中的模块 google.protobuf.descriptor_pb2
,并且 Protobuf 库期望任何自定义选项都是其中类型的扩展。但是你实际上是在扩展beans-protobuf/proto/src/descriptor.proto
,它在Python中变成了beans_protobuf.proto.src.descriptor_pb2
,这是一个完全不同的模块!因此,protobuf 库变得混乱,认为这些扩展不适用于 protobuf 描述符。
我认为如果您只更改导入语句,一切都应该有效。正确安装 protobuf 后,google/protobuf/descriptor.proto
应始终作为导入工作——无需提供您自己的文件副本。