这里有很多关于如何检测python装饰器是否使用参数的答案。它们通常看起来像这样:
class MyDecorator(object):
def __init__(self, *args):
if len(args) == 1 and callable(args[0]):
# no arguments
else:
# arguments
但现在我有以下用例:
@MyDecorator(lambda x:2*x)
def foo():
pass
错误地将其视为“无争议”案例。
有没有办法检测这种情况?
[编辑:添加缺少'self'参数]
答案 0 :(得分:2)
是的,但它仍然会有点hacky。诀窍是使用命名参数。除此之外,没有干净的方法来区分不同的callables。
class MyDecorator(object):
def __init__(self, *args, **kwargs):
if kwargs:
# arguments
print 'got %r as arguments'
else:
callable, = args
@MyDecorator(some_function=lambda x:2*x)
def foo():
pass
答案 1 :(得分:1)
__init__
方法需要 self
参数:
class MyDecorator(object):
def __init__(self, *args):
if len(args) == 1 and callable(args[0]):
# no arguments
else:
# arguments
如果没有它,总是至少有一个参数,不可以调用;它是装饰器实例。换句话说,如果没有明确的self
,*args
在传入参数时会长两个元素,并且它会是args[1]
你想要的去测试。