python - 测试 ProtoBuf 值是否使用默认值

标签 python proto3

我有一个 ProtoBuf 对象。我想检测特定字段何时使用默认值而不是显式提供的字段。

message vector_measurement
{
    measurement x = 1;
    measurement y = 2;
    measurement z = 3;
}
...
message measurement
{
    ...
    float value = 2;
    ...
}

当我使用HasField时,它返回True,但显然情况并非如此:

c = my_vector

print(c)
# x {
#   value: 60.3813476562
# }
# y {
#   value: 0.444311201572
# }
# z {
# }

print(c.x)
# value: 60.3813476562

print(c.z)
#

print(c.z==None)
# False

print(c.z.value)
# 0

print( c.HasField('x'), c.HasField('z') )
# (True, True )

print (c.z.HasField('value') )
# ValueError: Protocol message has no non-repeated submessage field "value"

字符串表示形式似乎知道z正在使用默认值;我怎样才能自己检测到这一点?

最佳答案

您可以通过调用ByteSize()来检查消息是否是默认消息。关于消息:

print(c.x.ByteSize())
# 5

print(c.z.ByteSize())
# 0

但是,请注意,这对于每个默认值都是如此,而不仅仅是那些不随消息发送的默认值。换句话说,如果每个组件值被显式设置为与默认值完全匹配,它将报告 ByteSize()==0:

print(c.x, c.x.ByteSize())
#myBool: true
#stdDev: 1.06
#value: 14.32
# 12

c.x.myBool = False
print(c.x, c.x.ByteSize())
#stdDev: 1.06
#value: 14.32
# 10

c.x.value = 0
print(c.x, c.x.ByteSize())
#stdDev: 1.06
# 5

c.x.stdDev = 0
print(c.x, c.x.ByteSize())
# 0

在 ProtoBuf3 中,空消息和具有默认值的消息没有区别。

关于python - 测试 ProtoBuf 值是否使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223496/

相关文章:

Python Bottle 无法通过邮寄

python - Seaborn和 Pandas : Make multiple x-category bar plot using multi index data in python

java - 如何从 Java 读取 proto3 自定义选项

java - 在 Java 中使用 proto3 时,对象中的长值未正确序列化和反序列化

python-3.x - gRPC:如何使用静态参数和流参数的组合来调用远程过程?

protocol-buffers - 尝试在 Protobuf 中创建 2D 数组时获得预期的顶级语句(例如 "message")

protocol-buffers - 为什么 Protocol Buffers 3 中删除了必需和可选

python - PyQt5 中未处理的异常

python - 如何在 C++ 中高效地创建和编译大 map

python - 在 Python 中比较列表项