J'écris une classe interface à un wiki MoinMoin via xmlrpc (code simplifié ci-dessous):façon pythonique pour envelopper xmlrpclib appelle à multicalls similaires
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):
maintenant chacun de mes méthodes doit appeler la xmlrpc pertinente méthode seule s'il n'y a pas d'authentification impliquée, ou pour l'envelopper dans un multicall s'il y a auth. Exemple:
def getPage(self, page):
if not self.token:
result = self.wiki.getPage(page)
else:
mc = xmlrpclib.MultiCall(self.wiki) # build an XML-RPC multicall
mc.applyAuthToken(self.token) # call 1
mc.getPage(page) # call 2
result = mc()[-1] # run both, keep result of the latter
return result
est-il plus belle façon de le faire autre que de répéter ce genre de choses pour chaque méthode? Puisque je dois appeler des méthodes arbitraires, les emballer avec des trucs, puis appeler la méthode nommée identiquement sur une autre classe, sélectionner les résultats pertinents et les rendre, je soupçonne que la solution impliquerait des méta-classes ou similaire ésotérique (pour moi) des trucs. Je devrais probablement regarder les sources de xmlrpclib et voir comment c'est fait, alors peut-être sous-classer leur MultiCall pour ajouter mes trucs ...
Mais peut-être qu'il me manque quelque chose de plus facile. Le meilleur que je suis venu avec est quelque chose comme:
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]
mais il répète toujours les mêmes trois lignes de code pour chaque méthode que je dois mettre en œuvre, en changeant juste le nom de la méthode appelée. Rien de mieux?
ne fonctionne pas. fooMethod() est une méthode distante, non présente dans la classe xmlrpclib.MultiCall (vous obtenez une AttributeError). Les instances de cette classe gèrent des noms de méthodes arbitraires car elles sont simplement transmises à l'extrémité distante, mais cela me laisse toujours dans une solution comme _getMultiCall() que j'ai décrite dans la question. – Luke404
Mettez à jour la réponse pour qu'elle fonctionne avec l'objet MultiCall qui met en file d'attente les appels de fonction. –