Протобуф одного из полей с кодировкой enum - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть определение Protobuf следующим образом:

MyMessage {
  oneof my_oneof {
     EnumA a = 1;
     EnumB b = 2;
  }
}

enum EnumA {
ENUMA_UNSPECIFIED = 0;
FOO = 1;
BAR = 2;
}

enum EnumB {
ENUMB_UNSPECIFIED = 0;
FOOB = 1;
BARB = 2;
}

Я установил поле a сообщения прото следующим образом:

MyMessage test;
test.a = EnumA.Value("FOO")

Я хочу прочитать test.a и сравните его со значением, считанным из строки json:

{'message_enumA': "FOO"} 

Итак, я хочу сделать:

import json


json_dict = json.load({'message_enumA': "FOO"})
getattr(test, test.WhichOneof("my_oneof")) in json_dict.values()

Приведенный выше код возвращает False, поскольку getattr возвращает целое число 1, соответствующее перечислению в EnumA. Я не могу сделать test.a = EnumA.Name(1), потому что a внутренне определяется как поле int.

Я, конечно, могу обернуть вызов getattr(...) вокруг EnumA.Name(). Но такого рода поражение цели Oneof. Есть ли другой способ сделать это?

...