2016-04-20 10 views
2

は構造protobufのHasField機能にはどのようなパラメータが必要ですか?

message Fly { 
    uint32 dtime = 1; 
} 

しかしHasField機能doesntの仕事次の点を考慮

>>> 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" 

何のパラメータHasFieldを期待しますか?

答えて

1

HasField()はあなたが誤解していると思います。 protobuf型が特定のフィールドを名前で定義しているかどうかはチェックしません。それは、メッセージの名前がフィールドの場合、そのフィールドが現在のインスタンスに設定されているかどうかを確認することです。

documentationの注釈として、proto3の非メッセージフィールドのHasFieldを呼び出すとエラーが発生します。

+0

もし 'dtime'がメッセージタイプだったら、うまくいくでしょうか?私は設定されたフィールドのリストを取得しようとしています(protobufがプリミティブ型のデフォルト値を設定するため)、私はListFieldsを反復することでそれを達成できますが、すばらしい解決策を探していました。 – rkuska

+0

@rkuska:Proto3は、プリミティブフィールドに対してセット対ノットセットの概念を削除しました。あなたのコードはproto2で動作しましたが、proto3では動作しませんでした。おそらくできることは、フィールドをデフォルト値と比較することです。 –

+0

@KentonVardaは時々同じ値ではありませんsetはデフォルト値と同じかもしれませんが、私はオプションパラメータが設定されていないことを示す解決策を探していました。デフォルト値が設定されているパラメータは無視されるので、 'ListFields'は機能しません。 – rkuska

関連する問題