Накрутка связанных методов


Я написал небольшой класс в Python, который обертывает связанных методов, но не предотвратить удаление собственной.

  1. У вас есть какие-то мысли на мой код?
  2. Вы думаете, что я должным образом обрабатывать ошибки?
  3. Разве что-нибудь пропало?
  4. Что нужно сделать, чтобы сделать его более надежным?
  5. Документация достаточно ясно?

import weakref

class WeakBoundMethod:
    """
    Wrapper around a method bound to a class instance. As opposed to bare
    bound methods, it holds only a weak reference to the `self` object,
    allowing it to be deleted.

    This can be useful when implementing certain kinds of systems that
    manage callback functions, such as an event manager.

    """
    def __init__(self, meth):
        """
        Initializes the class instance. It should be ensured that methods
        passed through the `meth` parameter are always bound methods. Static
        methods and free functions will produce an `AssertionError`.

        """
        assert (hasattr(meth, '__func__') and hasattr(meth, '__self__')),\
               'Object is not a bound method.'

        self._self = weakref.ref(meth.__self__)
        self._func = meth.__func__

    def __call__(self, *args, **kw):
        """
        Calls the bound method and returns whatever object the method returns.
        Any arguments passed to this will also be forwarded to the method.

        In case an exception is raised by the bound method, it will be
        caught and thrown again to the caller of this `WeakBoundMethod` object.

        Calling this on objects that have been collected will result in
        an `AssertionError` being raised.

        """        
        assert self.alive(), 'Bound method called on deleted object.'

        try:
            return self._func(self._self(), *args, **kw)
        except Exception, e:
            raise e

    def alive(self):
        """
        Checks whether the `self` object the method is bound to has
        been collected.

        """
        return self._self() is not None


1004
4
задан 4 сентября 2011 в 06:09 Источник Поделиться
Комментарии
1 ответ

class WeakBoundMethod:

Я предлагаю сделать это новый стиль класс, наследующий от объекта.

    assert (hasattr(meth, '__func__') and hasattr(meth, '__self__')),\
'Object is not a bound method.'

Не делай этого. Пусть неверный параметр видах атрибут ошибки при попытке получения __функции__ и __собственной__. Вы ничего не получаете, проверив их заранее.

assert self.alive(), 'Bound method called on deleted object.'

Повышение здесь утверждение-это плохой выбор. Утверждения, что этого не должно случиться, но имеющие базового объекта самоочиститься до не считается. Вызывает исключение, как weakref.ReferenceError. Таким образом, абонент может разумно обнаружить ошибку.

В документации очень понятно, молодцы.

Редактировать

    try:
return self._func(self._self(), *args, **kw)
except Exception as e:
raise e

Почему ты ловя исключение только выдали его? Это действительно бессмысленно.

Я мог бы написать всю функцию как:

def __call__(self, *args, **kw):
_self = self._self()
if _self is None:
raise weakref.ReferenceError()

return self._func(_self, *args, **kw)

3
ответ дан 4 сентября 2011 в 01:09 Источник Поделиться