簡體   English   中英

python用類寫一個裝飾器

[英]python writing a decorator with class

這是我寫一個幫手裝飾模塊的努力:

# -*- coding: utf8 -*-

import time
def timer(func):
    def timed(*args, **kwargs):
        init = time.clock()
        result = func(*args, **kwargs)
        print (time.clock()-init)*1000, 'ms'

        return result    
    return timed

class memo(object):
    def __init__(self, func):
        self.func = func
        self.memo = {}
        self.memohit = 0   

    def memoizedf(self, *args):
        key = tuple(args)
        print key
        lookup = self.memo.setdefault(key, None)
        if lookup:
            self.memohit += 1 
            return lookup

        result = self.func(*args)
        self.memo[key]=result
        return result

    def __call__(self, *args):
        return self.memoizedf(*args)

所以,用法:

@timer
def foo():
    print 'foo'

'foo'
00023.1231203879 ms


@memo
def bar(fooobject):
    print fooobject

問題來自這里:

>>bar({'foo':'bar'})

traceback : ...........
    lookup = self.memo.setdefault(key, None)
TypeError: unhashable type: 'dict'

列表,字典或其他可變集合的每個輸入都會調用此類錯誤。 我嘗試了所有的args,但顯然這沒有幫助。 我應該如何重寫我的代碼,以便我的裝飾器可以使用任何(好吧,只是字典,列表,元組,集合,整數​​,字符串...會沒關系)這種輸入?

我建議在散列之前序列化可變參數,例如使用pickle模塊。 任何字典,列表,或在功能參數類似的內容必須是picklable,否則PicklingError將提高。 memoizedf的定義中,您可以使用以下代碼:

key = pickle.dumps((args,kwargs))
lookup = self.memo.setdefault(key, None)

很多對象都是可選擇的,但不是可以刪除的,所以這應該擴展你可以處理的參數類。

這樣就可以了:

key = str(tuple(args))

暫無
暫無

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

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