gpt4 book ai didi

python - 在 python 中循环 protobuf 枚举

转载 作者:行者123 更新时间:2023-12-01 08:22:07 26 4
gpt4 key购买 nike

我目前正在 Python 3.7 上使用 protobuff3 来序列化数据包并通过网络传输它们。在重构之前,我使用的是常规枚举,但现在我已经转向 protobuff 枚举。但是我没有找到一种方法来检查该值是否在枚举中。在普通的Python中,我会这样做if item in enum:。最好的方法是什么?

我的 protobuff 文件:

syntax = "proto3";

package vlcTogether;

message defaultPacket {
Commands command = 1;
string param = 2;

enum Commands {
ERROR = 0;
JOIN = 1;
QUIT = 2;
VLC_COMMAND = 3;
SERVER_INFO = 4;
}
}

最佳答案

defaultPacketgoogle.protobuf.pyext.cpp_message.GeneratedProtocolMessageType有一个Commands属性。

此属性是 google.protobuf.internal.enum_type_wrapper.EnumTypeWrapper 的实例并具有以下方法 NameValue .

Name当整数存在于 Enum 中时,方法返回该整数的名称。或提出 ValueError .

Value当字符串存在于 Enum 中时,方法返回该字符串的值。或提出 ValueError同样。

def valuenum_in_enum(enum_wrapper, valuenum):
try:
if enum_wrapper.Name(valuenum):
return True
except ValueError:
return False

def valuename_in_enum(enum_wrapper, valuename):
try:
if enum_wrapper.Value(valuename):
return True
except ValueError:
return False

>>> valuenum_in_enum(defaultPacket.Commands, 2)
True
>>> valuename_in_enum(defaultPacket.Commands, 'QUIT')
True

另一种直接的方法是使用 DESCRIPTOR Commands 的属性。它有values_by_numbervalues_by_name返回映射的属性。例如,

>>> commands_descriptor = defaultPacket.Commands.DESCRIPTOR

>>> 'QUIT' in commands_descriptor.values_by_name
>>> 2 in commands_descriptor.values_by_number

关于python - 在 python 中循环 protobuf 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com