簡體   English   中英

裝飾器,用於轉換函數的參數

[英]A decorator to convert arguments of a function

我想使用裝飾器來轉換函數的參數。

所以不要這樣做:

def get_data(dt, symbol, depth, session):
    dt = to_date(dt)
    ...

要么

def get_data(dt, symbol, depth, session):
    dt = convert(dt, to_date)
    ...

我希望能夠寫類似

@convert('dt', to_date)
def get_data(dt, symbol, depth, session):
    ...

但是我對此功能不太滿意。

怎么寫這樣的裝飾器?

稍微弄弄它,並學到了很多有關發電機的知識:

def convert(arg, mod):
    def actual_convert(fn):
        if arg not in fn.__code__.co_varnames:
            return fn
        else:
            def new_function(*args, **kwargs):
                l_args = list(args)
                index = fn.__code__.co_varnames.index(arg)
                l_args[index] = mod(l_args[fn.__code__.co_varnames.index(arg)])
                args = tuple(l_args)
                return fn(*args, **kwargs)
            return new_function
    return actual_convert

@convert('x',lambda x: x+1)
def add(x,y):
    return x + y

print("Should be 5:",add(3,1))

目前,這僅適用於普通參數,不適用於關鍵字參數。 不過,這樣做也很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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