Python 模仿django.utils.functional.py中的memoize()时出错
我的分析是:Python 模仿django.utils.functional.py中的memoize()时出错,python,caching,Python,Caching,我的分析是: def curry(_curried_func, *args, **kwargs): def _curried(*moreargs, **morekwargs): return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs)) return _curried WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
def curry(_curried_func, *args, **kwargs):
def _curried(*moreargs, **morekwargs):
return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
return _curried
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper,
wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
for attr in assigned:
try:
setattr(wrapper, attr, getattr(wrapped, attr))
except TypeError: # Python 2.3 doesn't allow assigning to __name__.
pass
for attr in updated:
getattr(wrapper, attr).update(getattr(wrapped, attr))
return wrapper
def wraps(wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
return curry(update_wrapper, wrapped=wrapped,
assigned=assigned, updated=updated)
### End from Python 2.5 functools.py ##########################################
def memoize(func, cache, num_args):
def wrapper(*args):
mem_args = args[:num_args]
if mem_args in cache:
return cache[mem_args]
result = func(*args)
cache[mem_args] = result
return result
return wraps(func)(wrapper)
您的代码(在x+y
中,x
是a
而y
是b
)试图对两个函数求和(例如,不是调用它们并对它们的结果求和):函数对象不能求和,因此您的代码会引发一个exeption
您在args+moreargs
中引用的代码是对两个tuple
s进行求和:tuple当然可以很好地求和,这意味着将它们连接起来。绝对不与你的代码尝试的荒谬的“两个函数之和”有任何关系。你的代码(在x+y
中,x
是a
和y
是b
)试图对两个函数求和(例如,不是调用它们并对它们的结果求和):无法对函数对象求和,因此代码将引发一个exeption
您在
args+moreargs
中引用的代码是对两个tuple
s进行求和:tuple当然可以很好地求和,这意味着将它们连接起来。绝对没有与您的代码尝试的荒谬的“两个函数之和”有任何关系。zjm1126,请接受一条建议:如果您的问题与您看到的错误有关,请将错误包括在问题中。zjm1126,请接受一条建议:如果您的问题与您看到的错误有关,然后在问题中加入错误。
def curry(_curried_func, *args, **kwargs):
def _curried(*moreargs, **morekwargs):
return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
return _curried
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper,
wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
for attr in assigned:
try:
setattr(wrapper, attr, getattr(wrapped, attr))
except TypeError: # Python 2.3 doesn't allow assigning to __name__.
pass
for attr in updated:
getattr(wrapper, attr).update(getattr(wrapped, attr))
return wrapper
def wraps(wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
return curry(update_wrapper, wrapped=wrapped,
assigned=assigned, updated=updated)
### End from Python 2.5 functools.py ##########################################
def memoize(func, cache, num_args):
def wrapper(*args):
mem_args = args[:num_args]
if mem_args in cache:
return cache[mem_args]
result = func(*args)
cache[mem_args] = result
return result
return wraps(func)(wrapper)
def curry(update_wrapper, *args, **kwargs):
def _curried(*wrapper, **morekwargs):
return update_wrapper(wrapper,{wrapped:func})#this is the result
return _curried
def update_wrapper(wrapper,wrapped)
def wraps(func):
return curry(update_wrapper, wrapped=func)
wraps(func)(wrapper)