前提・実現したいこと
Python初心者ですが、
gRPCにて、下記のようなオブジェクトを扱ってみたいです。
{"a": 1, "b": 2}
また、(根本的に勘違いしている感はあるのですが)
JSON Mapping をみると、
NotesにAll keys are converted to strings.
ってありますが、
map<key_type, value_type> map_field = N;
key_type
を指定するのってなぜでしょうか?
試したこと
PythonでのQuick Start にて、
Quick Start内のRun! まで試した後、
Language Guide (proto3)の#Mapsを参考に
helloworld.proto
を下記のように変更
diff
1message HelloRequest { 2 string name = 1; 3+ repeated MapFieldEntry map_field = 2; 4} 5 6message HelloReply { 7 string message = 1; 8} 9 10+message MapFieldEntry { 11+ string key = 1; 12+ int32 value = 2; 13+}
greeter_client.py
にて
diff
1def run(): 2 channel = grpc.insecure_channel('localhost:50051') 3 stub = helloworld_pb2_grpc.GreeterStub(channel) 4 response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) 5 print("Greeter client received: " + response.message) 6- response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='you')) 7+ response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(map_field={"a": 1, "b": 2})) 8 print("Greeter client received: " + response.message)
greeter_server.py
にて
diff
1class Greeter(helloworld_pb2_grpc.GreeterServicer): 2 3 def SayHello(self, request, context): 4 return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) 5 6 def SayHelloAgain(self, request, context): 7- return helloworld_pb2.HelloReply(message='Hello, again %s!' % request.map_field.a) 8+ return helloworld_pb2.HelloReply(message='Hello, again %s!' % request.map_field.a)
実行しますと下記エラーになります
Greeter client received: Hello, you! Traceback (most recent call last): File "greeter_client.py", line 36, in <module> run() File "greeter_client.py", line 30, in run response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(map_field={"a": 1, "b": 2})) TypeError: Parameter to MergeFrom() must be instance of same class: expected helloworld.MapFieldEntry got str.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。