测试 ProtoBuf 值是否使用默认值
Test if ProtoBuf value is using default
我有一个 ProtoBuf 对象。我想检测特定字段何时使用默认值,而不是明确提供。
message vector_measurement
{
measurement x = 1;
measurement y = 2;
measurement z = 3;
}
...
message measurement
{
...
float value = 2;
...
}
当我使用HasField
时returnsTrue
,但显然不是这样:
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 中没有区别。
我有一个 ProtoBuf 对象。我想检测特定字段何时使用默认值,而不是明确提供。
message vector_measurement
{
measurement x = 1;
measurement y = 2;
measurement z = 3;
}
...
message measurement
{
...
float value = 2;
...
}
当我使用HasField
时returnsTrue
,但显然不是这样:
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 中没有区别。