一个用于装饰器、包装器和猴子补丁的Python模块。
wrapt 模块为Python提供了一个透明的对象代理,可用于构建函数包装器和装饰器函数。
wrapt 模块非常关注正确性。它远远超越了现有的机制,如 functools.wraps(),以确保装饰器能够保留内省性、签名、类型检查能力等。使用此模块构建的装饰器比典型的装饰器能在更多场景下工作,并提供更可预测和一致的行为。
为了尽可能地减少开销,性能关键组件使用了C扩展模块。当目标系统没有编译器来编译C扩展时,还提供了纯Python实现的自动回退。
- 通用装饰器,适用于函数、方法、类方法、静态方法和类
- 透明对象代理,用于高级包装场景
- 猴子补丁工具,用于安全的运行时修改
- C扩展,实现最佳性能,并支持Python回退
- 全面的内省性保留(签名、注解等)
- 线程安全的装饰器实现
pip install wraptimport wrapt
@wrapt.decorator
def pass_through(wrapped, instance, args, kwargs):
return wrapped(*args, **kwargs)
@pass_through
def function():
passimport wrapt
def with_arguments(myarg1, myarg2):
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
print(f"Arguments: {myarg1}, {myarg2}")
return wrapped(*args, **kwargs)
return wrapper
@with_arguments(1, 2)
def function():
passimport inspect
import wrapt
@wrapt.decorator
def universal(wrapped, instance, args, kwargs):
if instance is None:
if inspect.isclass(wrapped):
# Decorator was applied to a class
print("Decorating a class")
else:
# Decorator was applied to a function or staticmethod
print("Decorating a function")
else:
if inspect.isclass(instance):
# Decorator was applied to a classmethod
print("Decorating a classmethod")
else:
# Decorator was applied to an instancemethod
print("Decorating an instance method")
return wrapped(*args, **kwargs)有关全面的文档、示例和高级用法,请访问:
- Python 3.9+
- CPython
- PyPy
我们欢迎贡献!这是一个相当随意的过程 - 如果您有兴趣提出更改、改进或发现了错误,请通过GitHub issue tracker联系。无论是小的修复、新功能的想法,还是只是关于某个功能如何工作的疑问,都请随时开始讨论。
请注意,wrapt现在被认为是一个成熟的项目。我们不期望有任何重大的新开发或主要的特性添加。主要重点是确保该包在新版本的Python中继续正常工作,并随着Python生态系统的发展保持兼容性。
有关运行测试的信息,包括Python版本特定的测试约定和可用的测试命令,请参阅TESTING.md。
本项目根据BSD许可证授权 - 有关详细信息,请参阅LICENSE文件。
- 文档: https://wrapt.readthedocs.io/
- PyPI: https://pypi.python.org/pypi/wrapt
- 问题: https://github.com/GrahamDumpleton/wrapt/issues/
- 变更日志: https://wrapt.readthedocs.io/en/latest/changes.html
本仓库还包含一系列解释wrapt的设计和实现的博客文章: