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

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

我的裝飾器適用于常規(guī)功能,但不適用于實例

我的裝飾器適用于常規(guī)功能,但不適用于實例

浮云間 2021-11-02 16:14:14
我有一個工作裝飾器,用于在一段時間內(nèi)運行一個方法 True 并且它在常規(guī)函數(shù)上運行良好。當(dāng)我嘗試裝飾實例的函數(shù)時會出現(xiàn)問題。這是裝飾器:from threading import Threaddef run_in_while_true(f):    def decorator(break_condition=False):        def wrapper(*args, **kwargs):            while True:                if break_condition:                    return                f(*args, **kwargs)         return wrapper    return decoratorclass A(object):    @run_in_while_true    def print_ch(self, ch):         print ch@run_in_while_truedef print_with_dec(ch):     print chprint_with_dec()('f')  # Call 1# If i would want to pass a break condition i would write thisprint_with_dec(1==1 and 2*2==4)('f')a = A()a.print_ch()('4')  # Call 2`Call 1 按預(yù)期運行并打印了很多。出于某種原因,調(diào)用 2 獲取了 break_condition 所在的 self 參數(shù),因為對 break_condition 的檢查為真并且函數(shù)返回。我需要以何種方式更改裝飾器才能使其也適用于對象?提前致謝
查看完整描述

2 回答

?
慕桂英3389331

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

您生成的代碼看起來很奇怪:


a.print_ch()('4')  # Call 2

這是因為您的裝飾器中有一個額外的層:


def run_in_while_true(f):

    def decorator(break_condition=False):

        def wrapper(*args, **kwargs):

該@run_in_while_true裝飾是要回報decorator,其中有被稱為返回wrapper,其中有被稱為評估結(jié)果。該@run_in_while_true作為裝飾的一部分被自動調(diào)用。另外兩個需要兩組括號,如您的代碼所示。


這是一個問題,因為方法調(diào)用,如a.print_ch(),會自動將調(diào)用者傳遞給第一次調(diào)用:


a.print_ch()('4')

# is much the same as

# A.print_ch(self=a)('4')

這解釋了為什么你在你的 break_condition.


我建議您嘗試統(tǒng)一兩個內(nèi)部功能。只需將命名參數(shù)(如break_condition或break_when或)break_if傳遞給函數(shù)/方法,并讓包裝器攔截該值:import functools


def run_until_done(func):

    @functools.wraps

    def wrapper(*args, break_if=None, **kwargs):

        done = break_if if callable(break_if) else lambda: break_if


        while not done():

            func(*args, **kwargs)

     return wrapper


@run_until_done

def print_with_dec(ch):

    print ch


print_with_dec('4', break_if=lambda: 1==1 and is_done())


查看完整回答
反對 回復(fù) 2021-11-02
?
明月笑刀無情

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

感謝大家的幫助,在研究了更多關(guān)于從對象調(diào)用函數(shù)的方式之后,我編寫了這些最終的裝飾器。它們都適用于對象的常規(guī)函數(shù)和方法。一個在循環(huán)中運行函數(shù)直到滿足條件,另一個在線程中運行第一個函數(shù),因此程序不會等待。


裝飾者

def loop_in_while_oop(f):

    """ Runs a function in a loop, params have to be passed by name"""

    def decorated(self=None, break_if=None, *args,**kwargs):

        """

        :param self: Will be passed automatically if needed

        :param break_if: Lambada expression for when to stop running the while loop

        """

        done = break_if if callable(break_if) else lambda: break_if

        while not done():

            if self is not None:

                f(self, *args, **kwargs)

            else:

                f(*args, **kwargs)

    return decorated


def loop_in_thread_oop(f):

    """ Runs function in a loop in a thread, MUST: pass arguments by name"""

    def decorated(self=None, break_if=lambda: False, *args, **kwargs):

        """

        :param self: Will be passed automatically if needed

        :param break_if: Lambada expression for when to stop running the while loop, if value not passed will run forever

        """

        f1 = loop_in_while_oop(f)

        t = Thread(target=f1, args=args, kwargs=dict(self=self, break_if=break_if, **kwargs))

        t.start()

    return decorated

使用裝飾器

class SomeObj(object):


    @loop_in_thread_oop

    def print_c(self, c):

        print c



@loop_in_thread_oop

def p1(f):

    print f



@loop_in_thread_oop

def p2(f):

    print f


if __name__ == '__main__':

    a = SomeObj()

    start = time.time()

    a.print_c(c='a')  # Will run forever because break_if was not specified

    p1(f='3', break_if=lambda: time.time() - start > 3)  # Will stop after 3 seconds

    p2(f='5', break_if=lambda: time.time() - start > 5)  # Will stop after 5 seconds

輸出:


0-3 秒之間:打印a35(順序不固定)

3-5 秒之間:打印a5(順序不固定)

3-5 秒之間:打印a


查看完整回答
反對 回復(fù) 2021-11-02
  • 2 回答
  • 0 關(guān)注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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