【发布时间】:2011-09-18 20:54:46
【问题描述】:
我正在编写一些代码来遍历可能具有循环引用的结构。 与其在递归函数的开头明确地进行检查,我认为我会创建一个装饰器,它不允许使用相同的参数多次调用函数。
以下是我想出的。如其所写,这将尝试遍历 Nonetype 并引发异常。我知道我可以通过返回一个空列表来修复它,但我想要更优雅。有没有办法从装饰器中判断被装饰的函数是否是生成器函数?这样,如果它是生成器,我可以有条件地引发 StopIteration,否则就返回 None。
previous = set()
def NO_DUPLICATE_CALLS(func):
def wrapped(*args, **kwargs):
if args in previous:
print 'skipping previous call to %s with args %s %s' % (func.func_name, repr(args), repr(kwargs))
return
else:
ret = func(*args, **kwargs)
previous.add(args)
return ret
return wrapped
@NO_DUPLICATE_CALLS
def foo(x):
for y in x:
yield y
for f in foo('Hello'):
print f
for f in foo('Hello'):
print f
【问题讨论】:
-
inspect模块实际上非常简洁,仔细想想。
标签: python generator decorator