どのようにしてdict
同様のオブジェクトを返すのprotoRPC
ですか?
FieldList
無駄に使ってみました。次のフィールド定義のみが表示されます。
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
どのようにしてdict
同様のオブジェクトを返すのprotoRPC
ですか?
FieldList
無駄に使ってみました。次のフィールド定義のみが表示されます。
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
2つのシナリオがあります。
1)dict
明確に定義されたスキーマがあります:これはProtoRPCの最良の使用例であり、可能であれば、スキーマに適合させるようにしてください。この場合、ディクショナリのスキーマに一致するクラスでをMessageField
使用します。Message
たとえば、代わりに
{'amount': 31, 'type': 'fish', mine: False}
あなたは定義することができます
from protorpc import messages
class MyCatch(messages.Message):
amount = messages.IntegerField(1)
type = messages.StringField(2)
mine = messages.BooleanField(3)
次に、このメッセージ定義をフィールドで使用します。
messages.MessageField(MyCatch, index, ...)
2)dict
明確に定義されたスキーマがありません:この場合json
、辞書を文字列にダンプensure_ascii=True
し、戻り型がbytes(str
)オブジェクトであることを確認するように要求できます。次に、を使用できますBytesField
。
例えば:
import json
class MyMessage(messages.Message):
some_dict = messages.BytesField(1)
my_dict = {'amount': 31, 'type': 'fish', mine: False}
message = MyMessage(some_dict=json.dumps(my_dict, ensure_ascii=True))
の使用はデフォルトのensure_ascii
ようにオプションですTrue
が、これは環境によって変わる可能性があります。
pickle
代わりに、辞書をシリアル化するために使用できます。このメソッドpickle.dumps
は常にASCII/バイナリを出力するため、をスワップアウトjson.dumps
しpickle.dumps
てドロップするensure_ascii=True
ことで、同じ結果が得られます。
このようなカスタムを作成することが可能JsonField
です:
In [1]: class JsonField(messages.StringField):
type = dict
その後、他のフィールドとして使用できます。
In [2]: class MyMessage(messages.Message):
data = JsonField(1)
In [3]: m = MyMessage(data={"foo": "bar"})
In [4]: m.data
Out [4]: {'foo': 'bar'}
承認された回答の最初のオプションとして、repeated = Trueというパラメーターを追加できるため、回答としてjsonのリストが表示されます。https://developers.google.com/appengine/docs/python/tools/protorpc/overview?hl=en#Defining_the_Response_Messageで確認しました
少し複雑ですが、dictの実装に非常に近いレシピがありますprotorpc
:https ://gist.github.com/linuxluser/32d4a9c36ca0b8715ad4
文字列のみのキーと単純な(ネストされていない)値の使用に制限されています。ただし、データがそのカテゴリに当てはまる場合、このソリューションはうまく機能するはずです。
アイデアには2つの部分があります。
MultiField
任意の値型を保持できる新しいフィールド型を作成します。MapField
タイプのリストにキーと値のペアを格納するdictのようなタイプを作成しMultiField
ます。あなたはそれを次のように使用します:
import messages
import mapfield
class MyMessage(messages.Message):
some_dict = mapfield.MapField(1)
my_message = MyMessage(some_dict={"foo": 7, "bar": False, "baz": 9.2, "qux": "nog"})
それはほんの始まりに過ぎません。おそらくもっと良いかもしれません。改善を歓迎します。:)