Написание хорошего декоратора ничем не отличается от написания хорошей функции. Это означает, в идеале, использование docstrings и обеспечение того, чтобы декоратор был включен в структуру тестирования.
Вы должны обязательно использовать библиотеку decorator
или, что лучше, functools.wraps()
декоратором в стандартной библиотеке (начиная с версии 2.5).
Помимо этого, ваши декораторы лучше всего сфокусированы и хорошо разработаны. Не используйте *args
или **kw
, если ваш декоратор ожидает конкретных аргументов. И делать заливку в какие аргументы вы ожидаете, поэтому вместо того, чтобы:
def keep_none(func):
def _exec(*args, **kw):
return None if args[0] is None else func(*args, **kw)
return _exec
... использование ...
def keep_none(func):
"""Wraps a function which expects a value as the first argument, and
ensures the function won't get called with *None*. If it is, this
will return *None*.
>>> def f(x):
... return x + 5
>>> f(1)
6
>>> f(None) is None
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
>>> f = keep_none(f)
>>> f(1)
6
>>> f(None) is None
True"""
@wraps(func)
def _exec(value, *args, **kw):
return None if value is None else func(value, *args, **kw)
return _exec
Его хорошо ettiquete сделать вики-ответы на свои вопросы. – voyager
, что имеет смысл – Casebash