[英]Use decorator to change argument of a decorated function
I want to perform different methods to the same data.我想对相同的数据执行不同的方法。 Different methods are variants of an original method, only with different arguments for param:p3
.不同的方法是原始方法的变体,只有param:p3
的 arguments 不同。
# This is original method
def method(p1,p2,p3,data):
return data + p1 + p2 + p3
method(p1=1, p2=2, p3=3, data=10)
16 16
# By changing param:p3, I can define 3 methods based on original method.
# but it seems stupid and very unclear...
def method1(*args, **kw):
return method(*args, **kw, p3 = 1)
def method2(*args, **kw):
return method(*args, **kw, p3 = 2)
def method3(*args, **kw):
return method(*args, **kw, p3 = 3)
method1(p1=1,p2=2,data =10),\
method2(p1=1,p2=3, data =100)
(14,106) (14,106)
Is there any decorator to revise my original method
to any variant, like method1
?是否有任何装饰器可以将我的原始method
修改为任何变体,例如method1
?
# After decorated, method equals to method1
@decorator(p3 = 1)
def method(p1,p2,p3,data):
return data + p1 + p2 + p3
# After decorated, method equals to method2
@decorator(p3 = 2)
def method(p1,p2,p3,data):
return data + p1 + p2 + p3
Or, Shouldn't I use a decorator to satisfy my demand, maybe a class instead?或者,我不应该使用装饰器来满足我的需求,也许是 class 吗?
To flesh out rchome's comment, you can use functools.partial as follows:要充实 rchome 的注释,您可以使用 functools.partial 如下:
>>> from functools import partial
>>> def method(p1,p2,p3,data):
... return data + p1 + p2 + p3
>>> method1 = partial(method, p3=1)
>>> method2 = partial(method, p3=2)
>>> method3 = partial(method, p3=3)
>>> method1(p1=1,p2=2,data=10)
14
>>> method2(p1=1,p2=2,data=10)
15
>>> method3(p1=1,p2=2,data=10)
16
We can use decorator to do the same thing as follows:我们可以使用装饰器来做同样的事情,如下所示:
# this is a decorator factory
def de_fac(**out_kw):
def my_decorator(f):
def wrapper(*args, **kw):
print('inside function arguments:',{*args})
print('inside function keywords:',{**kw})
print("outside decorator factory\'s arguments:", {**out_kw})
# override {**kw} with {**out_kw}
return f(*args, **{**kw, **out_kw})
return wrapper
return my_decorator
@de_fac(p3=1)
def method_to_be_dec(p1,p2,p3,data):
return data + p1 + p2 + p3
# it's same
method_to_be_dec(p1=1, p2=2, data=10), method1(p1=1, p2=2, data=10)
inside function arguments: set() function arguments 内部:设置()
inside function keywords: {'p1': 1, 'p2': 2, 'data': 10} function 里面的关键字:{'p1': 1, 'p2': 2, 'data': 10}
outside decorator factory's arguments: {'p3': 1}外部装饰厂的 arguments: {'p3': 1}
(14, 14) (14, 14)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.