Function decorator having arguments is complicated

Ethan Furman ethan at stoneleaf.us
Mon Apr 27 00:24:26 EDT 2015


On 04/27, Makoto Kuwata wrote:
>> I feel that function decorator having arguments is complicated,
> because three 'def' are nested:
>> def multiply(n):
> def deco(func):
> def newfunc(*args, **kwargs):
> return n * func(*args, **kwargs)
> return newfunc
> return deco

When I have to write an argument-taking decorator, I use a class:
 class multiply(object): # don't need 'object in 3.x'
 def __init__(self, n):
 self.n = n
 def __call__(self, func):
 def newfunc(*args, **kwargs):
 return self.n * func(*args, **kwargs)
 return newfunc
> @multiply(4)
> def f1(x, y):
> return x+y
>> print(f1(2, 3)) #=> 20 (= 4 * (2+3))

This all works the same.
>>> If function decorator notation could take arguments,
> decorator definition would be more simple:
>> def multiply(func, n):
> def newfunc(*args, **kwargs):
> return n * func(*args, **kwargs)
> return newfunc
>> @multiply 4 # ex: @decorator arg1, arg2, arg3
> def f1(x, y):
> return x+y
>>> How do you think about this idea?

It's unnecessary, just use a class instead of a function to get more
clarity.
--
~Ethan~


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /