2016-04-20 8 views
2

Betrachten Struktur folgendeWelche Parameter erwartet HasField-Funktion von Protobuf?

message Fly { 
    uint32 dtime = 1; 
} 

Aber HasField Funktion nicht funktioniert:

>>> d.ListFields()[0][0].name 
'dtime' 
>>> d.ListFields()[0][0].full_name 
'Fly.dtime' 
>>> 
>>> d.HasField('dtime') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/.../lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 825, in HasField 
    raise ValueError(error_msg % field_name) 
ValueError: Protocol message has no non-repeated submessage field "dtime" 
>>> d.HasField('Fly.dtime') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/.../lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 825, in HasField 
    raise ValueError(error_msg % field_name) 
ValueError: Protocol message has no non-repeated submessage field "Fly.dtime" 

Welche Parameter tut HasField erwartet?

Antwort

1

Ich denke, Sie haben missverstanden, was HasField() tut. Es prüft nicht, ob ein Protobuf-Typ ein spezifisches Feld durch einen Namen definiert. Was es tut ist zu überprüfen, ob das Feld für die aktuelle Instanz gesetzt ist.

Wie die documentation Hinweise, Aufruf von HasField für ein Nicht-Nachrichtenfeld in Proto3 wird einen Fehler auslösen.

+0

Also, wenn 'dtime' ein Nachrichtentyp wäre, würde es funktionieren? Ich versuche, eine Liste von Feldern zu erhalten, die gesetzt wurden (weil protobuf Standardwerte für primitive Typen festlegte), ich kann das erreichen, indem ich über ListFields iteriere, aber ich suchte nach netter Lösung. – rkuska

+0

@rkuska: Proto3 entfernte das Konzept von Satz gegen nicht gesetzt für primitive Felder. Ihr Code hätte mit Proto2 gearbeitet, aber nicht in Proto3. Vielleicht können Sie das Feld mit seinem Standardwert vergleichen. –

+0

@KentonVarda ist nicht das gleiche wie manchmal Wertsatz könnte gleich wie der Standardwert sein, suchte ich nach einer Lösung, die zeigen würde, welche optionalen Parameter nicht festgelegt wurden. Selbst 'ListFields' funktionieren nicht, da sie die Parameter ignorieren, für die Standardwerte gesetzt sind. – rkuska

Verwandte Themen