У меня есть класс, который я хочу представить как удаленный сервис с использованием 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 оборачивает функцию, создает БД перед вызовом и открывает ее, а затем закрывает после завершения вызова, прежде чем вернуть результат.
Когда я вызываю этот метод, я получаю сообщение об ошибке " call () получил неожиданный аргумент ключевого слова" имя "". Итак, возможно ли вызывать методы, принимающие переменные с именованными аргументами удаленно? Или мне придется создавать переопределение для каждого варианта метода, который мне нужен.
Спасибо за ответы. Я немного изменил свой код, поэтому вопрос больше не является проблемой. Однако теперь я знаю это для дальнейшего использования, если мне действительно нужно реализовать позиционные аргументы и поддерживать удаленный вызов. Я думаю, что сочетание подходов Томаса и Праптакса было бы хорошо. Превращение kwargs в позиционные аргументы на клиенте через xmlrpclient и использование оболочки для методов на стороне сервера для распаковки позиционных аргументов.