[Python-ideas] DBC (Re: Explicit variable capture list)

Paul Moore p.f.moore at gmail.com
Tue Jan 26 10:06:48 EST 2016


On 26 January 2016 at 14:26, Steven D'Aprano <steve at pearwood.info> wrote:
> class myfunction(metaclass=DBC):
>     def myfunction(args):
>         # function implementation
>         ...
>     def requires():
>         ...
>     def ensures():
>         ...
>
>
> The duplication of the name is a bit ugly, and it looks a bit funny for
> the decorator/metaclass to take a class as input and return a function,
> but we don't really have anything else that makes a good namespace

Well, classes can be callable already, so how about

@DBC
class myfunction:
    def __call__(self, args):
        ...
    @precondition
    def requires(self):
        ...
    @postcondition
    def ensures(self, result):
        ...

The DBC class decorator does something like

def DBC(cls):
    def wrapper(*args, **kw):
        fn = cls()
        fn.args = args
        fn.kw = kw
        for pre in fn.__preconditions__:
            pre()
        result = fn(*args, **kw)
        for post in fn.__postconditions__:
            post(result)
    return wrapper

Pre and post conditions can access the args via self.args and self.kw.
The method decorators would let you have multiple pre- and
post-conditions. Or you could use "magic" names and omit the
decorators.

Paul


More information about the Python-ideas mailing list