在类似的多调用中包装xmlrpclib调用的python方法

2024-06-16 13:48:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个通过xmlrpc接口到MoinMoin wiki的类(下面是简化代码):

class MoinMoin(object):
    token = None

    def __init__(self, url, username=None, password=None):
        self.wiki  = xmlrpclib.ServerProxy(url + '/?action=xmlrpc2')
        if username and password:
            self.token = self.wiki.getAuthToken(username, password)
    # some sample methods:
    def searchPages(self, regexp):
    def getPage(self, page):
    def putPage(self, page):

现在,如果不涉及身份验证,我的每个方法都需要单独调用相关的xmlrpc方法;如果有auth,则需要将其包装在多调用中。示例:

^{pr2}$

除了为每种方法重复这些东西之外,还有没有更好的方法来做呢?在

因为我必须调用任意方法,用东西包装它们,然后在另一个类上调用同名的方法,选择相关的结果并将它们返回,我怀疑解决方案可能涉及元类或类似的深奥(对我来说)的东西。我应该看看xmlrpclib源代码,看看它是如何实现的,然后也许可以将它们的MultiCall子类化以添加我的东西。。。在

但也许我错过了一些更简单的东西。我得到的最好的结果是:

def _getMultiCall(self):
    mc = xmlrpclib.MultiCall(self.wiki)
    if self.token:
        mc.applyAuthToken(self.token)
    return mc
def fooMethod(self, x):
    mc = self._getMultiCall()
    mc.fooMethod(x)
    return mc()[-1]

但它仍然为我需要实现的每个方法重复相同的三行代码,只需更改调用的方法名。有更好的吗?在


Tags: 方法代码selftokennoneurlifdef
1条回答
网友
1楼 · 发布于 2024-06-16 13:48:28

Python函数是对象,因此可以很容易地将它们传递给其他函数。在

def HandleAuthAndReturnResult(self, method, arg):
    mc = xmlrpclib.MultiCall(self.wiki)
    if self.token:
        mc.applyAuthToken(self.token)
    method(mc, arg)
    return mc()[-1]
def fooMethod(self, x):
    HandleAuthAndReturnResult(xmlrpclib.MultiCall.fooMethod, x)

也许还有别的办法,但我认为应该行得通。当然,arg部分需要与方法所需的一致,但是所有方法都有一个参数。在

编辑:我不明白MultiCall是一个代理对象。即使真正的方法调用最终是ServerProxy中的方法调用,也不应传递此方法对象,以防MultiCall重写(定义)它。在本例中,您可以使用getattribute方法和要调用的方法名,然后调用返回的函数对象。注意处理AttributeError异常。在

方法现在看起来像:

^{pr2}$

相关问题 更多 >