首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何包装xmlrpc函数调用?

如何包装xmlrpc函数调用?
EN

Stack Overflow用户
提问于 2013-06-25 12:19:15
回答 1查看 1.7K关注 0票数 1

我有一个简单的xmlrpc服务器,定义为(server.py):

代码语言:javascript
复制
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)实现如下:

代码语言:javascript
复制
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服务器进行的每个调用。但是上面的工作示例给出了一个错误。

代码语言:javascript
复制
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不是一个解决方案--我需要在wrapper中执行实际的xmlrpc调用。
  • 我需要一个没有第三方库的简单解决方案,标准的python库是可以的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 12:33:32

您需要返回一个可调用的对象。

XML代理返回一个可以调用但也可以遍历的对象的实例。因此,对于xmlrpc.test.foo(),您将xmlrpc.test包装在一个函数中;该函数对象没有foo属性,因为函数通常没有这样的属性。

相反,返回一个代理对象;__call__钩子使它成为一个可调用的对象,就像函数一样:

代码语言:javascript
复制
class WrapperProxy(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped

    def __getattr__(self, name):
        attr = getattr(self.wrapped, name)
       return type(self)(attr)

    def __call__(self, *args, **kw):
        return self.wrapped(*args, **kw)

class XMLRPC(object):
    def __init__(self):
        self.xmlrpc = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")

    def __getattr__(self, name):
        attr = getattr(self.xmlrpc, name)
        return WrapperProxy(attr)

或者,合并成一个对象:

代码语言:javascript
复制
class XMLRPCWrapperProxy(object):
    def __init__(self, wrapped=None):
        if wrapped is None: 
            wrapped = xmlrpclib.ServerProxy("http://localhost:1025/RPC2")
        self.wrapped = wrapped

    def __getattr__(self, name):
        attr = getattr(self.wrapped, name)
       return type(self)(attr)

    def __call__(self, *args, **kw):
        return self.wrapped(*args, **kw)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17297169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档