我有一个简单的xmlrpc
服务器定义为(server.py
):
from SimpleXMLRPCServer import SimpleXMLRPCServer
def foo():
return "foo"
server = SimpleXMLRPCServer(("localhost", 1025))
server.register_introspection_functions()
server.register_function(foo, 'test.foo')
server.serve_forever()
客户端 ( client.py
) 实现如下:
import xmlrpclib
class XMLRPC(object):
def __init__(self):
self.xmlrpc = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")
def __getattr__(self, name):
attr = getattr(self.xmlrpc, name)
def wrapper(*args, **kwargs):
result = attr(*args, **kwargs)
return result
return wrapper
xmlrpc = XMLRPC()
print xmlrpc.test.foo()
我想包装并执行xmlrpc
类中对服务器进行的每个调用XMLRPC
。但是上面的工作示例给出了一个错误
Traceback (most recent call last):
File "client.py", line 20, in <module>
xmlrpc.test.foo()
AttributeError: 'function' object has no attribute 'foo'
如何使这段代码工作?
附加信息和限制:
- 我已经尝试过包装
wrapper
但functools.wraps(attr)
没有成功。由于字符串attr
没有属性__name__
,我得到一个不同的错误 - 我无法更改
server.py
. - 上面的例子是完全有效的。
- 替换
return wrapper
为return attr
不是解决方案 - 我需要xmlrpc
在wrapper
. - 我需要一个没有 3rd 方库的简单解决方案,标准的 python 库是可以的。