I’ve updated the steps described in this post, please see the revisited post.
I’m developing python scripting which uses XMLRPC. Every now and then I find myself in a situation where I wish I could just get the calls written to my terminal, in the order I called them in, including parameters – especially when I need support. This is what I came up with in my quest to find a decent way to make the XMLRPC API write each call before it’s actually invoked:
def __init__(self, writer = pprint.pprint):
self._output_writer = writer
def dumps(self, params, methodname, encoding='',
allow_none = False):
self._output_writer("fire => %s%s" % (methodname, params))
return real_dumps(params, methodname, encoding = encoding,
allow_none = allow_none)
real_dumps = xmlrpclib.dumps
xmlrpclib.dumps = MethodInvocationWriter().dumps
if __name__ == '__main__':
client = xmlrpclib.ServerProxy(
When executed, it’ll return this:
'fire => examples.getStateName(12,)'
xmlrpclib.dumps function is overriden with a custom method:
XMLRPCLibOutputWriter.dumps. I don’t want to duplicate exiting code, so I keep a reference to the original dumps method:
real_dumps. The ServerProxy will now call
XMLRPCLibOutputWriter.dumps, which prints the name of the name of the method being called including parameters using the output_writer, and offloads the work to
real_dumps at the end.
It would have been cleaner to override
xmlrpclib.ServerProxy.__request, but access modifiers on
__request prevented me from doing that.
Comments, questions or improvements? Let me know.