Это плохая практика - использовать себя в декораторах?

Хотя я знаю, что вы не можете ссылаться на 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

Готов ли я к неприятностям в будущем?

5
задан efotinis 19 November 2010 в 21:43
поделиться