在python中循环遍历prob枚举

时间:2019-02-07 01:44:33

标签: python python-3.x

我目前在Python 3.7上使用protobuff3对数据包进行序列化并通过网络传输它们。在重构之前,我使用的是常规枚举,但是现在我转向了probobuff枚举。但是我没有找到一种方法来检查该值是否在枚举中。在普通的python中,我会这样做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; } } 。最好的方法是什么?

我的原型文件:

protopayload_auditlog.authorizationInfo

1 个答案:

答案 0 :(得分:1)

with my_table (created_at, amount, register_name) as ( values ('2019-01-01', -150.01, 'Front'), ('2019-01-01', 38.10, 'Back'), ('2019-01-02', -150.01, 'Front'), ('2019-01-02', 38.10, 'Back') ) select created_at, amount, register_name, sum(amount) over (partition by register_name order by created_at) from my_table order by created_at, register_name; created_at | amount | register_name | sum ------------+---------+---------------+--------- 2019-01-01 | 38.10 | Back | 38.10 2019-01-01 | -150.01 | Front | -150.01 2019-01-02 | 38.10 | Back | 76.20 2019-01-02 | -150.01 | Front | -300.02 (4 rows) 中的defaultPacket具有google.protobuf.pyext.cpp_message.GeneratedProtocolMessageType属性。

此属性是Commands的实例,并具有以下方法google.protobuf.internal.enum_type_wrapper.EnumTypeWrapperName

Value方法在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 的{​​{1}}属性。 它具有DESCRIPTORCommands属性,它们返回映射。 例如,

values_by_number