2010-02-06 4 views
3

En utilisant une classe qui a un proxy xmlrpc comme un de ses propriétés de son objetAccédez à un sous-ensemble des fonctions d'une classe Python

def __init__(self): 
    self.proxy = ServerProxy(...) 
    # ... 

Je suis en train de faciliter l'utilisation de certaines fonctions du proxy. Seul un sous-ensemble des fonctions de proxy sont censés être utilisés et je pensais donc de créer un ensemble de fonctions minuscules wrapper pour eux comme

def sample(self): 
    """ A nice docstring for a wrapper function. """ 
    self.proxy.sample() 

est-il un bon moyen d'obtenir une liste de toutes les fonctions wrapper? Je pense à quelque chose comme dir(), mais alors je devrais filtrer pour les fonctions de l'encapsuleur de l'objet. L'introspection de xmlrpc (http://xmlrpc-c.sourceforge.net/introspection.html) n'aide pas beaucoup puisque je ne veux pas utiliser/fournir toutes les fonctions du serveur.

réglage Peut-être un attribut sur les emballages avec un get_wrappers @staticmethod() ferait l'affaire. Avoir un suffixe _wrapper n'est pas approprié pour mon cas d'utilisation. Une liste statique dans la classe qui garde la trace de la disponibilité est trop sujette aux erreurs. Donc, je cherche de bonnes idées sur la meilleure façon d'obtenir une liste des fonctions d'emballage?

Répondre

3

Je ne suis pas 100% sûr que ce soit ce que vous voulez, mais il fonctionne:

def proxy_wrapper(name, docstring): 
    def wrapper(self, *args, **kwargs): 
     return self.proxy.__getattribute__(name)(*args, **kwargs) 
    wrapper.__doc__ = docstring 
    wrapper._is_wrapper = True 
    return wrapper 

class Something(object): 
    def __init__(self): 
     self.proxy = {} 

    @classmethod 
    def get_proxy_wrappers(cls): 
     return [m for m in dir(cls) if hasattr(getattr(cls, m), "_is_wrapper")] 

    update = proxy_wrapper("update", "wraps the proxy's update() method") 
    proxy_keys = proxy_wrapper("keys", "wraps the proxy's keys() method")  

Puis

>>> a = Something() 
>>> print a.proxy 
{} 
>>> a.update({1: 42}) 
>>> print a.proxy 
{1: 42} 
>>> a.update({"foo": "bar"}) 
>>> print a.proxy_keys() 
[1, 'foo'] 
>>> print a.get_proxy_wrappers() 
['proxy_keys', 'update'] 
+0

Merci, cela semble juste. Je vais essayer le lundi :) –

2

Utilisez l'introspection xml-rpc pour obtenir la liste des serveurs et recouper ce avec les propriétés de votre objet. Quelque chose comme:

loc = dir(self) 
rem = proxy.listMethods() # However introspection gets a method list 
wrapped = [x for x in rem if x in loc] 
Questions connexes