У меня есть определение 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. Есть ли другой способ сделать это?