2016-10-24 1 views
0

ProtoBuf 개체가 있습니다. 특정 필드가 명시 적으로 제공된 대 기본값을 사용하는 경우 검색하고 싶습니다.ProtoBuf 값이 기본값을 사용하는지 테스트합니다.

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

나는 그것이 True을 반환 HasField 사용, 아직 명확하지 않는 경우 경우 :

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을보고합니다 빈 메시지 및 기본 값이 메시지 사이 ProtoBuf3에는 차이가

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 

없습니다.

관련 문제