3

どのようにしてdict同様のオブジェクトを返すのprotoRPCですか?

FieldList無駄に使ってみました。次のフィールド定義のみが表示されます。

       'IntegerField',
       'FloatField',
       'BooleanField',
       'BytesField',
       'StringField',
       'MessageField',
       'EnumField',
4

4 に答える 4

9

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.dumpspickle.dumpsてドロップするensure_ascii=Trueことで、同じ結果が得られます。

于 2012-11-27T02:34:47.267 に答える
3

このようなカスタムを作成することが可能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'}
于 2015-06-11T08:30:53.373 に答える
2

承認された回答の最初のオプションとして、repeated = Trueというパラメーターを追加できるため、回答としてjsonのリストが表示されます。https://developers.google.com/appengine/docs/python/tools/protorpc/overview?hl=en#Defining_the_Response_Messageで確認しました

于 2013-04-22T10:32:00.927 に答える
0

少し複雑ですが、dictの実装に非常に近いレシピがありますprotorpchttps ://gist.github.com/linuxluser/32d4a9c36ca0b8715ad4

文字列のみのキーと単純な(ネストされていない)値の使用に制限されています。ただし、データがそのカテゴリに当てはまる場合、このソリューションはうまく機能するはずです。

アイデアには2つの部分があります。

  1. MultiField任意の値型を保持できる新しいフィールド型を作成します。
  2. 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"})

それはほんの始まりに過ぎません。おそらくもっと良いかもしれません。改善を歓迎します。:)

于 2015-06-11T06:18:28.847 に答える