【发布时间】:2012-12-08 12:53:05
【问题描述】:
我有一个 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__ 方法,例如打印出被调用函数的名称、参数等(参见相关问题here)。
但是这种方法不起作用,它给出了以下错误:
AttributeError: 'function' object has no attribute 'numbers'
当我执行该示例时,该示例按预期工作
- 请勿将
DeviceProxy.__getattr__替换为其他内容 -
用函数替换
DeviceProxy.__getattr__def 虚拟(实例,属性): 返回原始(设备,属性)
用零点名称替换
xmlrpc函数的名称(例如,只需sum而不是sum.numbers)
您可以自己验证以下通过 xmlrpc 代理的直接调用将按预期工作:
dev = xmlrpclib.ServerProxy("http://localhost:8000/RPC2")
print dev.add.numbers(4,6)
我的问题:如何解决我的问题,即如何能够正确包装/覆盖 DeviceProxy.__getattr__ 以便能够查看调用的函数、所有参数等,而无需更改 xmlrpc 服务器或 @ 987654338@上课?
【问题讨论】:
标签: python attributes xml-rpc