簡體   English   中英

裝飾器/包裝器:將位置/關鍵字args全部分配給包裝函數的參數后,如何處理參數?

[英]Decorator/wrapper: How to deal with arguments after positional/keyword args are all assigned to wrapped function's parameters?

我想知道在Python中是否有一種方法可以讓包裝器在將函數的參數解析為參數后對其進行訪問。 因此,例如,我想包裝兩個具有不同(數量)參數的函數:

def fn_1(a, b=None, config=None):
    ...

def fn_2(b=None, config=None):
    ...

對我的包裝,看是否config並具有價值,如果沒有,從別的地方加載它:

class with_config(object):
    def __init__(self, f):
       self.f = f
    def __call__(self, *args, **kwargs):
       if config not in kwargs:
           kwargs[config] = load_config_from_some_default_location()

但我不知道如何確定config是否已按位置傳遞,因為它在args列表中的位置因函數而異。

如果我已經根據參數給位置參數指定了名稱(例如,將第一個位置分配給a ,將第二個位置分配給b ,第三個位置分配給config ),然后可以保留這些參數那么我會答應。

情況比這要復雜得多,但是我認為這使我的問題更容易理解。

有小費嗎?

這可以幫助您:

import inspect

def func(a, b=None, config=None):
    args, _, _, values = inspect.getargvalues(inspect.currentframe())
    print args # prints 'a', 'b', 'config'
    print values # prints {'a':12, 'b':None, 'config':None}
    if values['config'] == None:
        # Load config from somewhere else

if __name__ == '__main__':
    func(12)

我終於從Nadia Alramli那里得到了這個解決方案

class with_config(object): def __init__ (self, f): self.f = f def __call__ (self, *args, **kwargs): kwargs.update(dict(zip(self.f.func_code.co_varnames, args))) if config not in kwargs: kwargs[config] = load_config_from_some_default_location() return self.f(**kwargs)

暫無
暫無

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

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