( )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
。 - サードパーティのライブラリを使用しないシンプルなソリューションが必要です。標準の Python ライブラリは問題ありません。