Хотя я знаю, что вы не можете ссылаться на self
непосредственно в декораторе, мне было интересно, если это плохая практика, обойти это, вытаскивая его из args[0]
.Я догадываюсь, что это так, но я хочу быть уверенным.
Если говорить более конкретно, я работаю над API для веб-службы.Около половины команд требуют передачи токена, который впоследствии можно будет использовать для его отмены.Я хотел бы сделать этот токен необязательным параметром и, если он не указан, сгенерировать его.Генерация токена требует выполнения аутентифицированного вызова к серверу, который требует данных от объекта.
Хотя я знаю, что мог бы сделать это:
def some_command(self, ..., undo_token = None):
if undo_token = None:
undo_token = self.get_undo_token()
...
return fnord
Я чувствую, что могло бы быть лучшечем иметь один и тот же код в дюжине или около того методов.Я думал написать декоратор:
@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'])
Так что я могу написать более аккуратно
@undoable
def some_command(self, ...):
...
return foo
@undoable
def some_other_command(self, ...):
...
return bar
Я готовлюсь к неприятностям в будущем?