【问题标题】:Test if ProtoBuf value is using default测试 ProtoBuf 值是否使用默认值
【发布时间】:2016-10-24 16:47:12
【问题描述】:

我有一个 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正在使用默认值;我如何自己检测到这一点?

【问题讨论】:

    标签: python proto3


    【解决方案1】:

    您可以通过在消息上调用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 中,空消息和具有默认值的消息没有区别。

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      相关资源
      最近更新 更多