Python装饰器,带有可选的可调参数

时间:2013-08-20 10:16:13

标签: python

这里有很多关于如何检测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'参数]

2 个答案:

答案 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]你想要的去测试。