在编写接受可选参数的装饰器时如何避免“()”?

时间:2011-06-11 19:08:39

标签: python decorator

我已经编写了这个装饰器来弃用一个函数,并且(可选)提供一个可调用的替换

 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 个答案:

答案 0 :(得分:3)

由于deprecated()的参数是一个函数,因此没有可靠的方法来确定这是否是要用作替换的函数,还是要弃用的函数。因此,没有办法做你想做的事情而不改变它来取代字符串。