簡體   English   中英

使用裝飾器更改已裝飾 function 的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM