プロトのすべてのフィールド名をリストに入れたいのですが。これを行う方法はありますか?私はドキュメントを調べましたが、これについて何もないようです。
すべてのprotoクラスには DESCRIPTORクラス変数 があり、対応するprotobufメッセージのフィールドを検査するために使用できます。
詳細については、 Descriptor および FieldDescriptor クラスのドキュメントをご覧ください。
以下は、FieldDescriptor
のすべてのフィールドのmessage
sをリストに入れる簡単な例です。
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]
qfiard's 答えがうまくいきませんでした。呼び出しmessage.DESCRIPTOR.fields.keys()
生成AttributeError: 'list' object has no attribute 'keys'
。
それが機能しない理由がわかりません。たぶん、メッセージがどのように定義/コンパイルされたかに関係があるのかもしれません。
回避策は、個々のフィールドオブジェクトのリスト構成を行い、それぞれのname
プロパティを取得することでした。これにより、このリストのすべてのフィールドの文字列のリストが得られました。
res = [f.name for f in message.DESCRIPTOR.fields]
これはそれらのフィールド内のフィールド名を再帰的に取得しないことに注意してください。