簡體   English   中英

使用Python裝飾器跟蹤遞歸深度

[英]Tracking recursion depth with Python decorators

我正在嘗試編寫一個裝飾器,以跟蹤Python中遞歸函數的遞歸深度。

以一個遞歸函數為例


def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

通常,要跟蹤遞歸深度,您可以編寫如下內容


    def fib(n, level=0):
        print(level)
        if n == 0:
            return 0
        if n == 1:
            return 1
        else:
            return fib(n-1, level=level+1) + fib(n-2, level=level+1)

但是,在與裝飾者擺弄了一段時間並進行了很多搜索之后,我不確定這是否可能。

我已經嘗試過類似的東西


def visualise(func):
    def modify(*args, **kwargs):
        kwargs["count"] += 1
        print(kwargs["count"])
        return func(*args, **kwargs)

    return modify

@visualise
def fib(n):
    ...

fib(4, count=0)

但是它抱怨count是一個意外的關鍵字參數,我不太理解,因為我覺得包裝器modify替換所有出現的fib但我猜不是嗎?

指針將不勝感激。

您可以為裝飾器指定級別變量,然后在函數調用中使用它,如下所示:

def visualise(func):
     visualise.level = 0
     def wrapper(*args, **kwargs):
         print("In:", visualise.level)
         visualise.level += 1
         result = func(*args, **kwargs)
         visualise.level -= 1
         print("Out:", visualise.level)
         return result
     return wrapper

您是否可以定義以下功能?

def fib(n, count=0):
    # ....

暫無
暫無

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

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