pythonsSimpleXMLRPCServerを使用してリモートサービスとして公開したいクラスがあります。サーバーの起動は次のようになります。
server = SimpleXMLRPCServer((serverSettings.LISTEN_IP,serverSettings.LISTEN_PORT))
service = Service()
server.register_instance(service)
server.serve_forever()
次に、次のようなServiceRemoteクラスがあります。
def __init__(self,ip,port):
self.rpcClient = xmlrpclib.Server('http://%s:%d' %(ip,port))
def __getattr__(self, name):
# forward all calls to the rpc client
return getattr(self.rpcClient, name)
したがって、ServiceRemoteオブジェクトに対するすべての呼び出しは、xmlrpclib.Serverに転送され、xmlrpclib.Serverはそれをリモートサーバーに転送します。問題は、名前付きvarargsを受け取るサービスのメソッドです。
@useDb
def select(self, db, fields, **kwargs):
pass
@useDbデコレータは関数をラップし、呼び出しの前にdbを作成して開き、呼び出しが完了した後、結果を返す前に閉じます。
このメソッドを呼び出すと、「call()が予期しないキーワード引数'name'」というエラーが発生します。それで、変数の名前付き引数をリモートで取るメソッドを呼び出すことは可能ですか?または、必要なメソッドバリエーションごとにオーバーライドを作成する必要がありますか。
回答ありがとうございます。コードを少し変更したので、質問はもう問題ではありません。ただし、実際に位置引数を実装してリモート呼び出しをサポートする必要がある場合は、将来の参照用にこれを知っています。トーマスとプラプタクスのアプローチの組み合わせが良いと思います。xmlrpclientを介してクライアントでkwargsを位置引数に変換し、サーバー側のメソッドにラッパーを設定して位置引数を解凍します。