gpt4 book ai didi

python 用类写一个装饰器

转载 作者:行者123 更新时间:2023-11-28 19:25:54 25 4
gpt4 key购买 nike

这是我编写辅助装饰器模块的成果:

# -*- 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模块。函数参数中任何字典、列表或类似内容的内容都必须是可挑选的,否则将引发 PicklingError。在 memoizedf 的定义中,您可以使用以下代码:

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

许多对象是可挑选的,但不是可散列的,因此这应该扩展您可以显着处理的参数类。

关于python 用类写一个装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com