2010-02-06 2 views
3

Использование класса, который имеет XmlRpc прокси в качестве одного из свойств это объектаДоступ подмножество функций класса Python

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

Я пытаюсь облегчить использование некоторых функций прокси. Только подмножество функций прокси должны быть использованы и, таким образом, я думал о создании набора крошечных функций-оболочек для них нравится

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

Есть хороший способ получить список всех функций-оболочек? Я думаю о чем-то вроде dir(), но тогда мне нужно будет фильтровать функции обертки объекта. Интроспекция xmlrpc (http://xmlrpc-c.sourceforge.net/introspection.html) не очень помогает, поскольку я не хочу использовать/предоставлять все функции сервера.

Возможно, установка атрибута на обертках вместе с методом @staticmethod get_wrappers() сделает трюк. Наличие суффикса _wrapper не подходит для моего варианта использования. Статический список в классе, который отслеживает доступность, слишком подвержен ошибкам. Итак, я ищу хорошие идеи о том, как лучше всего получить список функций обертки?

ответ

3

Я не 100% уверен, что это то, что вы хотите, но это работает:

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")  

Тогда

>>> 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

Спасибо, это выглядит как раз. Я попробую в понедельник :) –

2

Использование XML-RPC самоанализа, чтобы получить список серверов и пересекают с вашими свойствами объекта. Что-то вроде:

loc = dir(self) 
rem = proxy.listMethods() # However introspection gets a method list 
wrapped = [x for x in rem if x in loc] 
Смежные вопросы