web-dev-qa-db-ja.com

プロトコルバッファからすべてのフィールド名を取得しますか?

プロトのすべてのフィールド名をリストに入れたいのですが。これを行う方法はありますか?私はドキュメントを調べましたが、これについて何もないようです。

28
user2253332

すべてのprotoクラスには DESCRIPTORクラス変数 があり、対応するprotobufメッセージのフィールドを検査するために使用できます。

詳細については、 Descriptor および FieldDescriptor クラスのドキュメントをご覧ください。

以下は、FieldDescriptorのすべてのフィールドのmessagesをリストに入れる簡単な例です。

res = message.DESCRIPTOR.fields

「.protoファイルに表示されているとおりに」フィールドの名前を取得するには:

res = [field.name for field in message.DESCRIPTOR.fields]

または(コメントから):

res = message.DESCRIPTOR.fields_by_name.keys()

「包含スコープを含む」フィールドの完全な名前を取得するには:

res = [field.full_name for field in message.DESCRIPTOR.fields]
28
qfiard

qfiard's 答えがうまくいきませんでした。呼び出しmessage.DESCRIPTOR.fields.keys()生成AttributeError: 'list' object has no attribute 'keys'

それが機能しない理由がわかりません。たぶん、メッセージがどのように定義/コンパイルされたかに関係があるのか​​もしれません。

回避策は、個々のフィールドオブジェクトのリスト構成を行い、それぞれのnameプロパティを取得することでした。これにより、このリストのすべてのフィールドの文字列のリストが得られました。

res = [f.name for f in message.DESCRIPTOR.fields]

これはそれらのフィールド内のフィールド名を再帰的に取得しないことに注意してください。

13
ypx