2016-10-24 6 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 использует значение по умолчанию; как я могу сам это обнаружить?

ответ

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 между пустым сообщением и сообщением, которое имеет значение по умолчанию.