2012-04-08 13 views
2

Ich habe eine Decorator-Funktion, die ich auf Funktionen innerhalb einer Klasse anwende. Der Decorator soll eine Membervariable _api überprüfen. Allerdings bekomme ich einen global name 'self' is not defined Fehler, wenn ich das versuche. Was ist der richtige Weg?Zugriff auf das self innerhalb der Decorator-Funktion innerhalb einer Python-Klasse

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): 
... 

Antwort

5

Der Verweis auf die Instanz ist in Ihrem Wrapper die Funktion *args so der Name self nicht avaialble ist. Verwenden Sie args[0] oder einfach umschreiben als:

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

Natürlich, wenn Sie dies tun, Ihr Anruf bis zur gewickelten Funktion auch self enthalten soll.

+0

kindall- macht Sinn- danke – Yarin

1

ändern

if self._api is not None: 

zu

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

args[0] hat self. hasattr ist der richtige Weg, um nach einem Attribut zu suchen. Wenn Sie versuchen, auf ein nicht vorhandenes Attribut zuzugreifen (wenn self._api nicht existiert), generieren Sie eine AttributeError.

+1

Danke, du bist richtig, das war eine falsche Aussage meinerseits- sollte ein Kommentar sein, obwohl – Yarin

+0

@Yarin: Was sollte ein Kommentar sein? –

+0

@JoelCornett: Danke für die Bearbeitung. Ich fand es gerade, als ich mich darauf vorbereitete, dasselbe zu schreiben. :) –

Verwandte Themen