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

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

Python3 帶有參數(shù)的“重復(fù)”裝飾器:@repeat(n)

Python3 帶有參數(shù)的“重復(fù)”裝飾器:@repeat(n)

蝴蝶刀刀 2022-01-18 16:38:37
我已經(jīng)看到(很多)教程和帶參數(shù)和不帶參數(shù)的裝飾器片段,包括那些我認(rèn)為是規(guī)范答案的兩個:帶參數(shù)的裝飾器,帶@語法的python裝飾器參數(shù),但我不明白為什么我的代碼中出現(xiàn)錯誤。下面的代碼位于文件中decorators.py:#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Description: decorators"""import functoolsdef repeat(nbrTimes=2):    '''    Define parametrized decorator with arguments    Default nbr of repeats is 2    '''    def real_repeat(func):        """        Repeats execution 'nbrTimes' times        """        @functools.wraps(func)        def wrapper_repeat(*args, **kwargs):            while nbrTimes != 0:                nbrTimes -= 1                return func(*args, **kwargs)        return wrapper_repeat    return real_repeat我從語法檢查器中得到的第一個警告nbrTimes是“未使用的參數(shù)”。我在 python3 交互式控制臺中測試了上述內(nèi)容:>>> from decorators import repeat>>> @repeat(nbrTimes=3)>>> def greetings():>>>     print("Howdy")>>>>>> greetings()Traceback (most recent call last):  File "<stdin>", line 1 in <module>  File path/to/decorators.py, line xx in wrapper_repeat   '''UnboundLocalError: local variable 'nbrTimes' referenced before assignment.我只是不明白我在哪里搞砸了。在其他示例中,傳遞的參數(shù)(此處nbrTimes)直到稍后在內(nèi)部函數(shù)中才“使用” ,因此“未使用的參數(shù)”警告和執(zhí)行時的錯誤讓我有點興奮。對 Python 來說還是比較新的。非常感謝幫助。編輯:(響應(yīng)@recnac的重復(fù)標(biāo)志) 根本不清楚您聲稱的副本中的 OP 想要實現(xiàn)什么。我只能推測他/她打算從全局范圍訪問裝飾器包裝器中定義的計數(shù)器,但未能將其聲明為nonlocal. 事實上,我們甚至不知道 OP 是處理 Python 2 還是 Python 3,盡管這在很大程度上無關(guān)緊要。我向您承認(rèn),錯誤消息非常相似,如果不相等,即使不一樣。但是,我的意圖不是從全局范圍訪問包裝器內(nèi)定義的計數(shù)器。我打算讓這個柜臺純粹是本地的,并且做到了。我的編碼錯誤完全在別處。事實證明,Kevin(下)提供的出色討論和解決方案是一種性質(zhì),與僅nonlocal <var>在包裝器定義塊中添加一個完全不同(在 Python 3.x 的情況下)。我不會重復(fù)凱文的論點。它們是清晰的,可供所有人使用。最后,我冒昧地說,錯誤消息可能是這里最不重要的,即使它顯然是我的錯誤代碼的結(jié)果。為此我進(jìn)行了修正,但這篇文章絕對不是對提議的“重復(fù)”的重新討論。
查看完整描述

1 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗 獲得超6個贊

提出的重復(fù)問題,python 裝飾器中的變量范圍 - 更改參數(shù)提供了有用的信息,解釋了為什么wrapper_repeat認(rèn)為nbrTimes是局部變量,以及如何nonlocal使用它來識別nbrTimes由repeat. 這將解決異常,但我認(rèn)為這不是您的情況的完整解決方案。您的裝飾功能仍然不會重復(fù)。


import functools


def repeat(nbrTimes=2):

    '''

    Define parametrized decorator with arguments

    Default nbr of repeats is 2

    '''

    def real_repeat(func):

        """

        Repeats execution 'nbrTimes' times

        """

        @functools.wraps(func)

        def wrapper_repeat(*args, **kwargs):

            nonlocal nbrTimes

            while nbrTimes != 0:

                nbrTimes -= 1

                return func(*args, **kwargs)

        return wrapper_repeat

    return real_repeat


@repeat(2)

def display(x):

    print("displaying:", x)


display("foo")

display("bar")

display("baz")

結(jié)果:


displaying: foo

displaying: bar

"foo" 和 "bar" 分別只顯示一次,而 "baz" 顯示零次。我認(rèn)為這不是理想的行為。


由于循環(huán)內(nèi)部,前兩個調(diào)用display無法重復(fù)。return 語句導(dǎo)致立即終止,并且不會發(fā)生進(jìn)一步的迭代。所以沒有裝飾功能會重復(fù)一次以上。一種可能的解決方案是刪除并調(diào)用該函數(shù)。return func(*args, **kwargs)whilewrapper_repeatwhilereturn


import functools


def repeat(nbrTimes=2):

    '''

    Define parametrized decorator with arguments

    Default nbr of repeats is 2

    '''

    def real_repeat(func):

        """

        Repeats execution 'nbrTimes' times

        """

        @functools.wraps(func)

        def wrapper_repeat(*args, **kwargs):

            nonlocal nbrTimes

            while nbrTimes != 0:

                nbrTimes -= 1

                func(*args, **kwargs)

        return wrapper_repeat

    return real_repeat


@repeat(2)

def display(x):

    print("displaying:", x)


display("foo")

display("bar")

display("baz")

結(jié)果:


displaying: foo

displaying: foo

“foo”被顯示了兩次,但現(xiàn)在“bar”和“baz”都沒有出現(xiàn)。這是因為nbrTimes在裝飾器的所有實例之間共享,這要歸功于nonlocal. 一旦display("foo")遞減nbrTimes到零,即使在調(diào)用完成后它也保持為零。display("bar")并將display("baz")執(zhí)行他們的裝飾器,看到它nbrTimes是零,并終止而不調(diào)用裝飾函數(shù)。


所以事實證明你不希望你的循環(huán)計數(shù)器是非本地的。但這意味著您不能nbrTimes用于此目的。嘗試根據(jù)nbrTimes' 值創(chuàng)建一個局部變量,然后將其遞減。


import functools


def repeat(nbrTimes=2):

    '''

    Define parametrized decorator with arguments

    Default nbr of repeats is 2

    '''

    def real_repeat(func):

        """

        Repeats execution 'nbrTimes' times

        """

        @functools.wraps(func)

        def wrapper_repeat(*args, **kwargs):

            times = nbrTimes

            while times != 0:

                times -= 1

                func(*args, **kwargs)

        return wrapper_repeat

    return real_repeat


@repeat(2)

def display(x):

    print("displaying:", x)


display("foo")

display("bar")

display("baz")

結(jié)果:


displaying: foo

displaying: foo

displaying: bar

displaying: bar

displaying: baz

displaying: baz

...當(dāng)您使用它時,您也可以使用for循環(huán)而不是while.


import functools


def repeat(nbrTimes=2):

    '''

    Define parametrized decorator with arguments

    Default nbr of repeats is 2

    '''

    def real_repeat(func):

        """

        Repeats execution 'nbrTimes' times

        """

        @functools.wraps(func)

        def wrapper_repeat(*args, **kwargs):

            for _ in range(nbrTimes):

                func(*args, **kwargs)

        return wrapper_repeat

    return real_repeat


@repeat(2)

def display(x):

    print("displaying:", x)


display("foo")

display("bar")

display("baz")


查看完整回答
反對 回復(fù) 2022-01-18
  • 1 回答
  • 0 關(guān)注
  • 575 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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