Mar*_*ase 3 python protocol-buffers
我想制作一个Event可以包含几种不同事件类型的protobuf 消息.这是一个例子:
message Event {
required int32 event_id = 1;
oneof EventType {
FooEvent foo_event = 2;
BarEvent bar_event = 3;
BazEvent baz_event = 4;
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但有一点让我感到困惑的是,这EventType是可选的:我只能编码一个对象,event_id而protobuf不会抱怨.
>>> e = test_pb2.Event()
>>> e.IsInitialized()
False
>>> e.event_id = 1234
>>> e.IsInitialized()
True
Run Code Online (Sandbox Code Playgroud)
有没有办法要求EventType设置?如果重要的话,我正在使用Python.
小智 12
根据Protocol Buffers文档,required不建议使用字段规则,并且已在proto3中删除了该字段规则.
必需永远您应该非常小心地根据需要标记字段.如果您希望在某个时刻停止写入或发送必填字段,则将字段更改为可选字段会有问题 - 旧读者会认为没有此字段的邮件不完整,可能会无意中拒绝或丢弃它们.您应该考虑为缓冲区编写特定于应用程序的自定义验证例程.谷歌的一些工程师得出的结论是,使用必需品弊大于利; 他们更喜欢只使用可选和重复.但是,这种观点并不普遍.
正如上面的文档所说,您应该考虑使用特定于应用程序的验证,而不是将字段标记为required.
没有办法将其标记oneof为"必需"(即使在proto2中),因为在oneof引入的时候,已经广泛接受的是,字段可能永远不应该是"必需的",因此设计人员不打算实施制作方法一个oneof必需的.