Как избежать "()" при написании декоратора, принимающего необязательные аргументы? - PullRequest
2 голосов
/ 11 июня 2011

Я написал этот декоратор для устаревания функции и (опционально) для обеспечения возможности вызова в качестве замены

 def deprecated(repfun=None):
    """A decorator which can be used to mark functions as deprecated.
    Optional repfun is a callable that will be called with the same args
    as the decorated function.
    """
    def outer(fun):
        def inner(*args, **kwargs):
            msg = "%s is deprecated" % fun.__name__
            if repfun is not None:
                msg += "; use %s instead" % (repfun.__name__)
            warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
            if repfun is not None:
                return repfun(*args, **kwargs)
            else:
                return fun(*args, **kwargs)
        return inner
    return outer

Теперь я могу использовать свой декоратор как таковой:

@deprecated()
def foo():
    return 0

... или укажите необязательный аргумент:

@deprecated(some_function)
def foo():
    return 0

... но я не знаю, как изменить его так, чтобы я мог опустить скобки:

@deprecated
def foo():
    return 0

Любая подсказка?

1 Ответ

3 голосов
/ 11 июня 2011

Поскольку аргумент deprecated() является функцией, нет надежного способа определить, является ли эта функция заменой или устаревшей. Следовательно, нет способа сделать то, что вы хотите, не меняя его вместо строки.

...