2

クラス内の関数に適用しているデコレータ関数があります。_apiデコレータは、メンバー変数に対してチェックを行うことになっています。ただし、global name 'self' is not definedこれを実行しようとするとエラーが発生します。正しい方法は何ですか?

def requires_api(fn):
    def wrapped(*args, **kwargs):
        if self._api is not None:
            return fn(*args, **kwargs)
        else:
            return None
    return wrapped


@requires_api       
def do_something(self):
...
4

2 に答える 2

5

インスタンスへの参照はラッパー関数に*argsあるため、名前selfは使用できません。を使用するargs[0]か、次のように書き直します。

def wrapper(self, *args, **kwargs):
    # ...

当然、これを行う場合、ラップされた関数への呼び出しには、も含める必要がありますself

于 2012-04-08T16:13:39.300 に答える
1

変化する

if self._api is not None:

if hasattr(args[0], '_api'):

args[0]持っていselfます。 hasattr属性をチェックする正しい方法です。

存在しない属性にアクセスしようとすると(存在self._apiしない場合)、が生成されますAttributeError

于 2012-04-08T16:19:08.313 に答える