我正在编写一个通过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]
但它仍然为我需要实现的每个方法重复相同的三行代码,只需更改调用的方法名。有更好的吗?在
Python函数是对象,因此可以很容易地将它们传递给其他函数。在
也许还有别的办法,但我认为应该行得通。当然,arg部分需要与方法所需的一致,但是所有方法都有一个参数。在
编辑:我不明白MultiCall是一个代理对象。即使真正的方法调用最终是ServerProxy中的方法调用,也不应传递此方法对象,以防MultiCall重写(定义)它。在本例中,您可以使用getattribute方法和要调用的方法名,然后调用返回的函数对象。注意处理AttributeError异常。在
方法现在看起来像:
^{pr2}$相关问题 更多 >
编程相关推荐