簡體   English   中英

python裝飾器* args和** kwargs

[英]python decorators *args and ** kwargs

我是編碼的新手,我一直在努力吸收盡可能多的東西。 我不了解你們發布的很多技術說明,因此請盡量使用簡單的英語。 我了解裝飾器功能的工作原理,但是我的問題是遵循代碼邏輯-特別是為什么我們必須添加* args和** kwargs。 聲明我們傳入裝飾器函數的任何傳入具有參數的函數是否總是將相同的參數傳遞給包裝函數是正確的,因為它嵌套在裝飾器中? 那就是我在這里想念的。 我不明白原始函數的參數是如何傳遞的。

讓我們舉一個簡單的例子:

def tracing(func):
    @functools.wraps
    def wrapper(*args, **kwargs):
        logging.debug(f'Calling {func.__name__}')
        try:
            return func(*args, **kwargs)
        finally:
            logging.debug(f'Called {func.__name__}')
    return wrapper

@tracing
def spam():
    print('spam')

@tracing
def add3(n):
    return n+3

沒錯,我們需要使用*args, **kwargs是為了使我們可以將相同的*args, **kwargs傳遞給包裝函數。

這稱為“轉發”或“完美轉發”。 這個想法是, tracing不必知道有關其包裝的函數的任何信息,它可以接受任何位置和關鍵字參數集,並返回任何內容,並且包裝器仍然有效。


對於某些裝飾器,這是不合適的。 例如,一個裝飾器旨在使用一個特定的參數作為緩存鍵來緩存所有具有相同API的一組函數, 可以使用*args, **kwargs ,然后仔細檢查列表和字典以查找該特定參數,但是要明確得多:

def caching_spam(func):
    cache = {}
    @functool.wraps
    def wrapper(eggs, beans, spam, cheese):
        if spam not in cache:
            cache[spam] = func(eggs, beans, spam, cheese)
        return cache[spam]
    return wrapper

但是,通用裝飾器要比特定裝飾器多得多。

暫無
暫無

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

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