gpt4 book ai didi

python - 在 python 中使用 **kwargs 和 SimpleXMLRPCServer

转载 作者:太空狗 更新时间:2023-10-29 17:29:58 24 4
gpt4 key购买 nike

我有一个类,我希望使用 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,然后再转发到远程服务器。问题是服务中采用命名可变参数的方法:

@useDb
def select(self, db, fields, **kwargs):
pass

@useDb 装饰器包装函数,在调用之前创建数据库并打开它,然后在调用完成后关闭它,然后返回结果。

当我调用此方法时,出现错误“call() 得到了一个意外的关键字参数‘name’”。那么,是否可以远程调用采用变量命名参数的方法?或者我必须为我需要的每个方法变体创建一个覆盖。


感谢您的回复。我稍微更改了代码,因此问题不再是问题。但是,如果我确实需要实现位置参数并支持远程调用,现在我知道这一点以供将来引用。我认为将 Thomas 和 praptaks 方法结合起来会很好。通过 xmlrpclient 在客户端将 kwargs 转换为位置参数,并在方法服务器端使用包装器来解压位置参数。

最佳答案

你不能用普通的 xmlrpc 来做到这一点,因为它没有关键字参数的概念。但是,您可以将其作为协议(protocol)叠加在 xmlrpc 之上,该协议(protocol)始终将列表作为第一个参数传递,将字典作为第二个参数传递,然后提供适当的支持代码,以便您的使用变得透明,示例如下:

服务器

from SimpleXMLRPCServer import SimpleXMLRPCServer

class Server(object):
def __init__(self, hostport):
self.server = SimpleXMLRPCServer(hostport)

def register_function(self, function, name=None):
def _function(args, kwargs):
return function(*args, **kwargs)
_function.__name__ = function.__name__
self.server.register_function(_function, name)

def serve_forever(self):
self.server.serve_forever()

#example usage
server = Server(('localhost', 8000))
def test(arg1, arg2):
print 'arg1: %s arg2: %s' % (arg1, arg2)
return 0
server.register_function(test)
server.serve_forever()

客户端

import xmlrpclib

class ServerProxy(object):
def __init__(self, url):
self._xmlrpc_server_proxy = xmlrpclib.ServerProxy(url)
def __getattr__(self, name):
call_proxy = getattr(self._xmlrpc_server_proxy, name)
def _call(*args, **kwargs):
return call_proxy(args, kwargs)
return _call

#example usage
server = ServerProxy('http://localhost:8000')
server.test(1, 2)
server.test(arg2=2, arg1=1)
server.test(1, arg2=2)
server.test(*[1,2])
server.test(**{'arg1':1, 'arg2':2})

关于python - 在 python 中使用 **kwargs 和 SimpleXMLRPCServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/119802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com