faif / python-patterns

A collection of design patterns/idioms in Python

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

memento example, why Transactional is defined as a descriptor?

LeiYangGH opened this issue · comments

learning the example patterns/behavioral/memento.py.
Transactional is defined as a descriptor, this looks more complicated

class Transactional:
    def __init__(self, method):
        self.method = method
    def __get__(self, obj, T):
        def transaction(*args, **kwargs):
            state = memento(obj)
            try:
                return self.method(obj, *args, **kwargs)
            except Exception as e:
                state()
                raise e
        return transaction

how about refactor to normal higher-order function?

 def Transactional(method):
    def transaction(obj, *args, **kwargs):
        state = memento(obj)
        try:
            return method(obj, *args, **kwargs)
        except Exception as e:
            state()
            raise e
    return transaction

Sure, any simplification is welcome. Feel free to create a pull request

created #408. test passed. could you review?