Chociaż zdaję sobie sprawę, że nie można odwoływać się do self
bezpośrednio w dekoratorze, zastanawiałem się, czy to nie jest dobra praktyka, aby obejść to, ciągnąc go od args[0]
. Moje przeczucie jest takie, ale chcę być tego pewien.Czy to jest zła praktyka używać siebie w dekoratorów?
Mówiąc dokładniej, pracuję nad API dla usługi internetowej. Około połowa poleceń wymaga podania tokena, który później można wykorzystać do jego cofnięcia. Chciałbym, aby ten token był parametrem opcjonalnym, a jeśli żaden nie został podany, by go wygenerować. Generowanie tokena wymaga uwierzytelnionego połączenia z serwerem, który potrzebuje danych z obiektu.
Choć wiem, że mogę to zrobić:
def some_command(self, ..., undo_token = None):
if undo_token = None:
undo_token = self.get_undo_token()
...
return fnord
Czuję, że może być lepszy sposób niż mieć taki sam kod w kilkunastu metod. Moja myśl była napisać dekorator:
@decorator
def undoable(fn, *args, **kwargs):
if 'undo_token' not in kwargs:
kwargs['undo_token'] = args[0].get_undo_token()
return (fn(*args, **kwargs), kwargs['undo_token'])
Więc mogę więcej pisać czysto
@undoable
def some_command(self, ...):
...
return foo
@undoable
def some_other_command(self, ...):
...
return bar
jestem ustawiania się w górę na kłopoty w dół linii?
+1 za użycie wzoru dekoratora do zaimplementowania "cofania". –
Nic nie jest nie tak z dekoratorem, który ma wymagania dotyczące parametrów dekorowanej funkcji; tylko upewnij się, że jest to udokumentowane. –