我有一个xmlrpc
运行如下的服务器
from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(x,y):
return x+y
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, 'add.numbers')
server.serve_forever()
在以下代码中调用使用:
import xmlrpclib
class DeviceProxy(object):
def __init__(self, uri):
self.rpc = xmlrpclib.ServerProxy(uri)
def __getattr__(self, attr):
return getattr(self.rpc, attr)
original = DeviceProxy.__getattr__
def mygetattr(device, attr):
def wrapper(*args, **kw):
print('called with %r and %r' % (args, kw))
return original(device, attr)(*args, **kw)
return wrapper
DeviceProxy.__getattr__ = mygetattr
dev = DeviceProxy("http://localhost:8000/RPC2")
print dev.add.numbers(4,6)
如您所见,该类出于此问题范围之外的原因Proxy
包装了代理,通过方法转发任意调用。由于此问题范围之外的其他原因,我需要用不同的方法包装/替换此方法,例如打印出调用的函数的名称、参数等(请参阅此处的相关问题)。xmlrpc
__getattr__
__getattr__
但是这种方法不起作用,它给出了以下错误:
AttributeError: 'function' object has no attribute 'numbers'
该示例按预期工作,当我
- 不要
DeviceProxy.__getattr__
用别的东西代替 替换
DeviceProxy.__getattr__
为函数def dummy(实例,属性):返回原始(设备,属性)
xmlrpc
用零点名称替换函数的名称(例如,只是sum
代替sum.numbers
)
您可以验证自己通过 xmlrpc 代理进行的以下直接调用将按预期工作:
dev = xmlrpclib.ServerProxy("http://localhost:8000/RPC2")
print dev.add.numbers(4,6)
我的问题:如何解决我的问题,即如何能够DeviceProxy.__getattr__
正确地包装/覆盖以便能够看到调用的函数、所有参数等,而无需在xmlrpc
服务器或DeviceProxy
类中进行更改?