Хотя я знаю, что вы не можете ссылаться на 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
Готов ли я к неприятностям в будущем?