解決TypeError: 'NoneType' object is not callable

今天跑代碼發現報錯:
TypeError: ‘NoneType’ object is not callable
翻譯:“NoneType” 對象不可調用

分析解決:
callable(可調用)對象是指一個後面可以加 ‘( ) ’的對象
既然報錯是 ‘不可調用’,那就去掉調用函數的 ‘( )’ 即可。

代碼示例:
看代碼 #後面的註釋就懂了

  # 裝飾器 <== 高階函數 + 嵌套函數
def decorator(func): 
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        timer = end_time - start_time
        print("run time spend :", timer, 's', sep='')
    return wrapper()  # 這裏的'()'會導致報錯'NoneType' object is not callable
                      # 只要去掉wrapper後面的括號即可解決問題

@decorator  # 引用裝飾器,等同於 run_func = decorator(run_func)
def run_func():
    a = int(input("input x:").strip(' '))
    b = int(input("input y:").strip(' '))
    print("%d**%d = %d" % (a, b, a**b))

run_func()  # 裝飾器不改變被裝飾函數的源代碼和調用方式
  # 有人說去掉run_func後面的‘()’也可以解決問題,但我覺得不可取,原因看下面

網上有人說去掉被裝飾函數(原函數)後面的 ‘( )’ ,雖然也可以讓程序不報錯,我卻覺得這違背了裝飾器的意義:裝飾器在不改變被裝飾函數的源代碼和調用方式的情況下增加新的功能,如果去掉原函數的括號那不就是改變調用方式了嗎,所以不可取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章