Нет доступа к (вложенным) типам перечислений (proto3) в Python 3 - PullRequest
0 голосов
/ 27 сентября 2018

Мне не удалось получить доступ к (вложенным) перечислениям в тривиальном сообщении буфера протокола.Я пытался в любом случае, вложенный или отделенный от DataNodeManagement!:

syntax = "proto3";

message DataNodeManagement {
  string name = 1;
  string id = 2;
  string origin = 3;
  ConnectionType con_type = 4;
  enum ConnectionType {
    UNKNOWN = 0;
    MQTT = 1;
  }
}

Я использую этот код для заполнения данных в моем сообщении:

config = data_node_pb2.DataNodeManagement()
config.name = "Scanner1"
config.id = key
config.origin = "PC1"
config.con_type = data_node_pb2.ConnectionType.MQTT
# or 
# config.con_type = data_node_pb2.DataNodeManagement.ConnectionType.MQTT

datasource.advertise_data_node(config.SerializeToString())

И он жалуется:

Traceback (most recent call last):
  File "scanner-connector.py", line 144, in <module>
    config.con_type = data_node_pb2.ConnectionType.MQTT
AttributeError: 'EnumTypeWrapper' object has no attribute 'MQTT'

соответственно:

Traceback (most recent call last):
  File "scanner-connector.py", line 144, in <module>
    config.con_type = data_node_pb2.DataNodeManagement.ConnectionType.MQTT
AttributeError: type object 'DataNodeManagement' has no attribute 'ConnectionType'

Я использую следующие версии:

python --version
Python 3.6.6 :: Anaconda custom (64-bit)

protoc --version
libprotoc 3.6.1

Есть ли что-то особенное, что я пропустил как новичок?

1 Ответ

0 голосов
/ 24 октября 2018

Вы должны пропустить enum-name, чтобы получить доступ к значениям из enum.Как видно из Python-учебник по протоколу , перечисление определено в сообщении

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

В разделе Чтение сообщения доступ к перечислениюна

import addressbook_pb2
addressbook_pb2.Person.MOBILE

Так что в вашем примере это должно быть data_node_pb2.DataNodeManagement.MQTT

...