第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數(shù)包裝是做什么的?

函數(shù)包裝是做什么的?

三國紛爭 2019-07-03 18:50:22
函數(shù)包裝是做什么的?在對此的評論中回答另一個問題有人說他們不確定functools.wraps在做什么。因此,我提出這個問題,以便在StackOverflow上有一個記錄,供將來參考:functools.wraps真的嗎?
查看完整描述

3 回答

?
慕勒3428872

TA貢獻1848條經(jīng)驗 獲得超6個贊

當您使用裝飾器時,您將一個函數(shù)替換為另一個函數(shù)。換句話說,如果你有一個裝飾師

def logged(func):
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

當你說

@loggeddef f(x):
   """does some math"""
   return x + x * x

這和說

def f(x):
    """does some math"""
    return x + x * x
f = logged(f)

以及你的功能f將其替換為_LOGING函數(shù)。不幸的是,這意味著如果你說

print(f.__name__)

它會打印出來with_logging因為這是你新功能的名字。實際上,如果您查看docstringf,它將是空白的,因為with_logging沒有docstring,所以您編寫的docstring將不再存在。另外,如果您查看該函數(shù)的pydoc結(jié)果,它將不會被列為接受一個參數(shù)x相反,它將被列為*args**kwargs因為這就是日志記錄所需要的。

如果使用裝飾器總是意味著丟失有關(guān)函數(shù)的信息,那么這將是一個嚴重的問題。所以我們才有functools.wraps..這使用了一個在裝飾器中使用的函數(shù),并添加了對函數(shù)名、docstring、參數(shù)列表等進行復制的功能。wraps它本身就是一個裝飾器,下面的代碼做的是正確的事情:

from functools import wrapsdef logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging@loggeddef f(x):
   """does some math"""
   return x + x * xprint(f.__name__)  # prints 'f'print(f.__doc__)   # prints 'does some math'


查看完整回答
反對 回復 2019-07-03
?
倚天杖

TA貢獻1828條經(jīng)驗 獲得超3個贊

我經(jīng)常使用類,而不是函數(shù),作為我的裝飾師。我在這方面遇到了一些問題,因為一個對象不會擁有函數(shù)所期望的所有相同的屬性。例如,對象將不具有屬性__name__..我對此有一個特定的問題,很難跟蹤Django報告的錯誤“Object無屬性”__name__“。不幸的是,對于類風格的裝飾師,我不認為@PARY能夠勝任這項工作。相反,我創(chuàng)建了一個基本的裝飾類,如下所示:

class DecBase(object):
    func = None

    def __init__(self, func):
        self.__func = func    def __getattribute__(self, name):
        if name == "func":
            return super(DecBase, self).__getattribute__(name)

        return self.func.__getattribute__(name)

    def __setattr__(self, name, value):
        if name == "func":
            return super(DecBase, self).__setattr__(name, value)

        return self.func.__setattr__(name, value)

這個類代理所有屬性調(diào)用正在被修飾的函數(shù)。因此,您現(xiàn)在可以創(chuàng)建一個簡單的裝飾器,檢查是否指定了2個參數(shù),如下所示:

class process_login(DecBase):
    def __call__(self, *args):
        if len(args) != 2:
            raise Exception("You can only specify two arguments")

        return self.func(*args)


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關(guān)注
  • 887 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號