[英]Use decorator to change argument of a decorated function
我想對相同的數據執行不同的方法。 不同的方法是原始方法的變體,只有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
# 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)
是否有任何裝飾器可以將我的原始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
或者,我不應該使用裝飾器來滿足我的需求,也許是 class 嗎?
要充實 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
我們可以使用裝飾器來做同樣的事情,如下所示:
# 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)
function arguments 內部:設置()
function 里面的關鍵字:{'p1': 1, 'p2': 2, 'data': 10}
外部裝飾廠的 arguments: {'p3': 1}
(14, 14)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.