У меня есть класс, который я хочу показать как удаленный сервис с помощью pythons SimpleXMLRPCServer. Запуск сервера выглядит следующим образом:
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, который затем перенаправляет его на удаленный сервер. Проблема заключается в методе в службе, который принимает именованные varargs:
@useDb
def select(self, db, fields, **kwargs):
pass
Декодер @useDb обертывает эту функцию, создавая db перед вызовом и открывая ее, затем закрывая ее после завершения вызова перед возвратом результата.
Когда я вызываю этот метод, я получаю сообщение об ошибке " вызов() получил неожиданное ключевое слово" имя ". Итак, можно ли вызывать методы, использующие переменные именованные аргументы удаленно? Или мне нужно создать переопределение для каждого варианта метода, который мне нужен.
Спасибо за ответы. Я немного изменил свой код, поэтому вопрос больше не является проблемой. Однако теперь я знаю это для будущей справки, если мне действительно нужно реализовать позиционные аргументы и поддерживать удаленный вызов. Я думаю, что сочетание подходов Томаса и Праптакса было бы хорошим. Превращение kwargs в позиционные args на клиенте через xmlrpclient и наличие оболочки на методах serverside для распаковки позиционных аргументов.