[Python-ideas] __before__ and __after__ attributes for functions

Suresh V. suresh_vv at yahoo.com
Thu Jan 23 10:17:50 CET 2014


On Thursday 23 January 2014 02:22 PM, David Townshend wrote:
> Maybe I'm missing something, but what's the use case, and why aren't
> plain old decorators suitable?

May be they are.

Let us say I want to alter the way the smtplib.SMTP.sendmail method 
works. I would like it to call a function that I define.I can then add 
this function to the __before__ attribute of this library function.

Can this be done with decorators?

>
>
> On Thu, Jan 23, 2014 at 10:31 AM, Suresh V.
> <suresh_vv at yahoo.com
> <mailto:suresh_vv at yahoo.com>> wrote:
>
>     Nicely done :-)
>
>     "foo" may come from a library or something, so rather than a
>     decorator we may have to monkey patch it. Unless there is a nicer
>     solution.
>
>     Will functools be a good place for something like this?
>
>
>     On Thursday 23 January 2014 01:50 PM, Chris Angelico wrote:
>
>         On Thu, Jan 23, 2014 at 7:11 PM, Suresh V.
>         <suresh_vv at yahoo.com
>         <mailto:suresh_vv at yahoo.com>> wrote:
>
>             On Thursday 23 January 2014 01:22 PM, Chris Angelico wrote:
>
>
>                 On Thu, Jan 23, 2014 at 6:20 PM, Suresh V.
>                 <suresh_vv at yahoo.com
>                 <mailto:suresh_vv at yahoo.com>> wrote:
>
>
>                     Can we add these two attributes for every
>                     function/method where each is a
>                     list of callables with the same arguments as the
>                     function/method itself?
>
>                     Pardon me if this has been discussed before.
>                     Pointers to past discussions
>                     (if any) appreciated.
>
>
>
>                 I'm not exactly sure what you're looking for here. What
>                 causes a
>                 callable to be added to a function's __before__ list,
>                 and/or what will
>                 be done with it?
>
>
>
>             These are modifiable attributes, so something can be
>             added/deleted from the
>             __before__ or __after__ lists.
>
>
>
>                 If you mean that they'll be called before and after the
>                 function
>                 itself, that can be more cleanly done with a decorator.
>
>
>
>             Yes. Each item in the list will be called in order
>             immediately before/after
>             each invocation of the function. This is kinda like
>             decorators, but more
>             flexible and simpler. Scope for abuse may be higher too :-)
>
>
>         def prepostcall(func):
>               def wrapper(*args,**kwargs):
>                   for f in wrapper.before: f(*args,**kwargs)
>                   ret = func(*args,**kwargs)
>                   for f in wrapper.after: f(*args,**kwargs)
>                   return ret
>               wrapper.before = []
>               wrapper.after = []
>               return wrapper
>
>         @prepostcall
>         def foo(x,y,z):
>               return x*y+z
>
>         foo.before.append(lambda x,y,z: print("Pre-call"))
>         foo.after.append(lambda x,y,z: print("Post-call"))
>
>         Now just deal with the question of whether the after functions
>         should
>         be called if the wrapped function throws :)
>
>
>
>
>
>         ChrisA
>         _________________________________________________
>         Python-ideas mailing list
>         Python-ideas at python.org
>         <mailto:Python-ideas at python.org>
>         https://mail.python.org/__mailman/listinfo/python-ideas
>         <https://mail.python.org/mailman/listinfo/python-ideas>
>         Code of Conduct: http://python.org/psf/__codeofconduct/
>         <http://python.org/psf/codeofconduct/>
>
>
>
>     _________________________________________________
>     Python-ideas mailing list
>     Python-ideas at python.org
>     <mailto:Python-ideas at python.org>
>     https://mail.python.org/__mailman/listinfo/python-ideas
>     <https://mail.python.org/mailman/listinfo/python-ideas>
>     Code of Conduct: http://python.org/psf/__codeofconduct/
>     <http://python.org/psf/codeofconduct/>
>
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>




More information about the Python-ideas mailing list