使用通用装饰器装饰函数时会出现问题,该装饰器会更改函数的参数,例如类型转换、日志记录或记忆化。修饰函数无法继承原始函数的文档和签名,这使得理解其行为变得困难。
为了解决这个问题,已经提出了多种解决方法:
使用 pip 安装“装饰器”模块并修改装饰器定义以包含decorator.decorator注释。这确保了装饰器在保留函数签名的同时保持通用性:
<code class="python">import decorator @decorator.decorator def args_as_ints(f, *args, **kwargs): # Perform argument conversion return f(*args, **kwargs)</code>
对于 Python 3.4 及更高版本,'functools.wraps( )' 提供了一种自动保留函数签名和文档的替代解决方案:
<code class="python">import functools def args_as_ints(func): @functools.wraps(func) def wrapper(*args, **kwargs): # Perform argument conversion return func(*args, **kwargs) return wrapper</code>
两种方法都有效地保留了原始函数的签名和文档。 “decorator”模块适用于 Python 2 和 3,而“functools.wraps()”仅适用于 Python 3.4 及更高版本。
以上是如何保留装饰函数的签名的详细内容。更多信息请关注PHP中文网其他相关文章!