2016-10-24 2 views
0

私はProtoBufオブジェクトを持っています。私は、特定のフィールドが明示的に指定されたものと違って、デフォルトを使用しているときを検出したいと思います。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()を呼び出すことによって、デフォルトの場合

答えて

1

あなたがチェックできます。

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に違いはありません。

関連する問題