faif / python-patterns

A collection of design patterns/idioms in Python
40.2k stars 6.93k forks source link

memento example, why Transactional is defined as a descriptor? #407

Closed LeiYangGH closed 1 week ago

LeiYangGH commented 1 year ago

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
faif commented 1 year ago

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

LeiYangGH commented 1 year ago

created https://github.com/faif/python-patterns/pull/408. test passed. could you review?