このサイトについて

xmlrpclibの__getattr__

xmlrpclibの__getattr__

Python 2.3からはxmlrpclibというライブラリが標準でつくようになりました。これを使うとXML-RPCのリクエストを簡単に送信できます。

   import xmlrpclib
   #xmlrpcサーバインスタンスを生成
   srv = xmlrpclib.Server('http://url.to.xmlrpc/server/')
   #XML-RPCリクエストを送信,結果を表示
print srv.path.to.method('arg1','arg2')

Pythonのxmlrpclibがイカしてると思うのは,サーバのインスタンスからドット区切りで階層を表現できること。ソースはこんな感じになっています。nameにドットで区切られた階層の文字列が渡ってきます。

       def __getattr__(self, name):
           # magic method dispatcher
           return _Method(self.__request, name)

で,_Methodの中身は以下。

   class _Method:
       # some magic to bind an XML-RPC method to an RPC server.
       # supports "nested" methods (e.g. examples.getStateName)
       def __init__(self, send, name):
           self.__send = send
           self.__name = name
       def __getattr__(self, name):
           return _Method(self.__send, "%s.%s" % (self.__name,   name))
       def __call__(self, *args):
           return self.__send(self.__name, args)

__getattr__を再帰的に呼び出しているんですね。__nameにドット区切りの階層が連結されて行きます。一番最後は関数呼び出しになっているので,__call__が呼ばれる,というわけ。おもしろいなあ:-)。

2010-08-27 04:26