我目前在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
答案 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.EnumTypeWrapper
和Name
。
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}}属性。
它具有DESCRIPTOR
和Commands
属性,它们返回映射。
例如,
values_by_number