次のような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
ラップし、メソッドを介して任意の呼び出しを転送します。この質問の範囲外のさらなる理由については、このメソッドを別のメソッドでラップ/置換して、たとえば、呼び出された関数の名前、引数などを出力する必要があります (関連する質問hereを参照)。xmlrpc
__getattr__
__getattr__
しかし、このアプローチは機能せず、次のエラーが発生します。
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
DeviceProxy