假设我有这个
class PlayerSchema(Schema):
nickname = fields.Str(required=True)
...
@validates('nickname')
def validate_nickname(self, value):
raise ValidationError('Error!!!')
其中message Game
{
string name = 1;
repeated float probability = 2;
}
字段代表分布。这意味着每个值都必须为非负数,且总和必须为1。
是否有更好的方法来使用protobuf(例如,像probability
之类的东西或在值之和上加边界的东西)?
答案 0 :(得分:4)
不,协议缓冲区中没有无符号浮点类型,也没有类似这样的自动施加的约束。
当您对Game
进行反序列化时,您可能想在业务代码中添加约束-请注意,float
近似于小数结果的总和可能不是精确 1.0。您将需要某种形式的宽容。
答案 1 :(得分:2)
仅使用一种类型就无法安全地执行此操作。您可以再说一步:
{
string name = 1;
repeated uint32 probability = 2;
uint32 divisor = 3;
}
诀窍是将浮点数乘以1000 000左右的较大数字,然后再将其除以。这样既可以确保您的安全,又可以增加开销。