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

これは、「引数なし」のケースとして誤って検出されます。

この状況も検出する方法はありますか?

[編集: 不足していた「self」パラメータを追加]

4

2 に答える 2

2

はい。ただし、少しハックなままです。秘訣は、名前付き引数を使用することです。それに加えて、異なる callable を明確に区別する方法はありません。

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

それがなければ、常に少なくとも1 つの引数があり、呼び出し可能ではありません。代わりにデコレータのインスタンスです。つまり、明示的なself*argsなければ、引数を渡すと2 つのargs[1]要素の長さになり、テストしたくなるでしょう。

于 2013-08-20T10:20:21.933 に答える