Доступ к подмножеству функций класса Python - PullRequest
3 голосов
/ 06 февраля 2010

Использование класса с прокси-сервером xmlrpc в качестве одного из свойств его объекта

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 не подходит для моего случая использования. Статический список в классе, который отслеживает доступные, слишком подвержен ошибкам. Поэтому я ищу хорошие идеи о том, как лучше всего получить список функций-оболочек?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

Я не уверен на 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']
2 голосов
/ 06 февраля 2010

Используйте xml-rpc introspection, чтобы получить список серверов и пересечь его со свойствами вашего объекта. Что-то вроде:

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