4

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

这被错误地检测为“无论据”案例。

有没有办法检测这种情况?

[编辑:添加了缺少的“自我”参数]

4

2 回答 2

2

是的,但它仍然会有点hacky。诀窍是使用命名参数。除此之外,没有明确的方法来区分不同的可调用对象。

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
于 2013-08-20T10:20:15.607 回答
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]您想要测试的。

于 2013-08-20T10:20:21.933 回答