当前位置: 首页 > 知识库问答 >
问题:

在python协议中访问自定义选项

明宜年
2023-03-14

元数据3.proto

syntax = "proto3";

import "google/protobuf/descriptor.proto";

package metas3;

message MessageOptionsMetadata3 {
  optional string message_options_field1 = 1;
  optional string message_options_field2 = 2;
  optional string message_options_field3 = 3;
}

extend google.protobuf.MessageOptions {
  MessageOptionsMetadata3 message_options_metadata3 = 50000;
}

message FileOptionsMetadata3 {
  optional string file_options_field1 = 1;
  optional string file_options_field2 = 2;
  optional string file_options_field3 = 3;
  optional string file_options_field4 = 4;
}

extend google.protobuf.FileOptions {
  FileOptionsMetadata3 file_options_metadata3 = 60000;
}

extend google.protobuf.FieldOptions {
  repeated string event_type = 70000;
}

my_proto_file.proto

syntax = "proto3";

import "metadata3.proto";
import "google/protobuf/descriptor.proto";

package events;

extend google.protobuf.MessageOptions {
  optional string my_option = 51234;
}

message MyMessage {
  option (my_option) = "Hello world!";
  option (metas3.message_options_metadata3).message_options_field1 = "Message option";
}

生成元数据3\u pb2。py并在protoc插件中使用它,如下所示,

protoc -I=./protos --python_out=./protos_generated --plugin=./protos_generated/metadata3_pb2.py ./protos/*.proto

my\u proto\u file\u pb2。py公司

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: my_proto_file.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


import metadata3_pb2 as metadata3__pb2
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='my_proto_file.proto',
  package='events',
  syntax='proto3',
  serialized_options=None,
  create_key=_descriptor._internal_create_key,
  serialized_pb=b'\n\x13my_proto_file.proto\x12\x06\x65vents\x1a\x0fmetadata3.proto\x1a google/protobuf/descriptor.proto\"1\n\tMyMessage:$\x92\x82\x19\x0cHello world!\x82\xb5\x18\x10\n\x0eMessage option:7\n\tmy_option\x12\x1f.google.protobuf.MessageOptions\x18\xa2\x90\x03 \x01(\t\x88\x01\x01\x62\x06proto3'
  ,
  dependencies=[metadata3__pb2.DESCRIPTOR,google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,])


MY_OPTION_FIELD_NUMBER = 51234
my_option = _descriptor.FieldDescriptor(
  name='my_option', full_name='events.my_option', index=0,
  number=51234, type=9, cpp_type=9, label=1,
  has_default_value=False, default_value=b"".decode('utf-8'),
  message_type=None, enum_type=None, containing_type=None,
  is_extension=True, extension_scope=None,
  serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key)


_MYMESSAGE = _descriptor.Descriptor(
  name='MyMessage',
  full_name='events.MyMessage',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=b'\222\202\031\014Hello world!\202\265\030\020\n\016Message option',
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=82,
  serialized_end=131,
)

DESCRIPTOR.message_types_by_name['MyMessage'] = _MYMESSAGE
DESCRIPTOR.extensions_by_name['my_option'] = my_option
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

MyMessage = _reflection.GeneratedProtocolMessageType('MyMessage', (_message.Message,), {
  'DESCRIPTOR' : _MYMESSAGE,
  '__module__' : 'my_proto_file_pb2'
  # @@protoc_insertion_point(class_scope:events.MyMessage)
  })
_sym_db.RegisterMessage(MyMessage)

google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(my_option)

_MYMESSAGE._options = None
# @@protoc_insertion_point(module_scope)

访问文件中定义的选项与生成代码中设置的选项相同

value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]

但从外部proto文件导入的选项似乎未设置,因此无法访问

value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.message_options_field1]

共有1个答案

刘海
2023-03-14
--plugin=./protos_generated/metadata3_pb2.py

我觉得这很奇怪。你认为它应该做什么?

serialized_options=b'\222\202\031\014Hello world!\202\265\030\020\n\016Message option',

看起来您的消息选项也包括在内。所以问题只在于访问它。

value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions()
           .Extensions[my_proto_file_pb2.message_options_field1]

据我所知,没有我的proto\u文件pb2。message\u options\u field1在my\u proto\u文件中定义。协议。相反,它应该是元数据3\u pb2。消息\u选项\u元数据3。

 类似资料:
  • 问题内容: 我正在尝试将我的爱好项目之一移植到linux。最好使用Mono,因为它是用C#编写的。但是我也在研究Python。 该应用程序的功能之一是它需要与自定义协议相关联,因此,当用户单击应用程序网站上的链接时,将调用该应用程序: 像这样,这个和这个的定制协议。 在linux / unix系统中怎么做?我可以像Windows中那样关联系统范围的处理程序吗?还是需要依赖于浏览器? 在Google

  • 当然, 这个世界上没有绝对的事情. 所以万一现在所有的路由协议都不能满足你的需求, 那么你可以自己实现你自己的路由协议, 你要做的是, 申明你的路由协议实现了Yaf_Route_Interface接口即可.

  • 本文向大家介绍对python 自定义协议的方法详解,包括了对python 自定义协议的方法详解的使用技巧和注意事项,需要的朋友参考一下 前面说到最近在写python的一些东西,然后和另外一位小伙伴定义了协议,然后昨天我有一部分东西没理解对,昨天上午我自己重写了一遍接收和发送的全部逻辑,昨天下午补了压力测试的脚本,自测没问题之后告知联调的小伙伴。 结果上午还是出了一点问题,然后我们两对代码,他写了一

  • 问题内容: 在Swift中有可能吗?如果没有,那么是否有解决方法? 问题答案: 1.使用默认实现(首选)。 优点 不涉及Objective-C运行时 (至少没有明确 涉及 )。这意味着您可以使其符合结构,枚举和非类。同样,这意味着您可以利用强大的泛型系统。 *当遇到符合此类协议的类型时, *您始终可以确保满足所有要求 。它始终是具体实现或默认实现。这就是“接口”或“合同”在其他语言中的行为方式。

  • 在 Swift 中可能吗?如果没有,那么是否有解决方法可以做到这一点?

  • 我有一个奇怪的错误,我的代表是零,也不知道在哪里检查。也许其他人也有同样的问题。 我有这个类和协议: 在我的VC里 触发计划通知后,我单击它,调用并且不知为何为零,即使已设置委托(打印了来自的消息)。 扩展中的委托方法从未触发,因为委托为nil。 我还在每个类的中打印了一些消息,以查看它是否以某种方式从内存中删除了,但它们没有,只是在我从vc堆栈中弹出它们之后。