五个Python装饰器让你的代码量砍半

通过使用这些包装器来提升您的Python游戏的效率和可读性!
到目前为止,Python是我最喜欢的编程语言,因为它语法简单,而且在机器学习和Web开发等多个领域都有强大的应用。
尽管我已经有五年多的编程经验,但除非绝对必要,装饰器很少出现在我的视线中,比如使用@staticmethod 装饰器来表示类中的静态方法。
然而,在最近的一次合并请求审查中,我的同事为我的一个函数引入了一个定时器装饰器,这改变了我的看法。这激发了我对装饰器所能提供的大量其他功能的好奇心,提升了代码的整洁度和可读性。
因此,在这篇短文中,我们将探讨Python封装器的概念,并介绍可以改善我们Python开发过程的五个示例。

Python 封装器
Python 封装器是添加到另一个函数中的函数,它可以在不直接改变源代码的情况下添加额外的功能或修改其行为。它们通常以装饰器的形式实现,装饰器是一种特殊的函数,它将另一个函数作为输入,并对其功能进行一些修改。
封装函数在各种情况下都很有用:
功能扩展: 通过使用装饰器封装函数,我们可以添加日志记录、性能测量或缓存等功能。
代码重用性: 我们可以将一个封装函数甚至一个类应用于多个实体,这样可以避免代码重复,并确保不同组件的行为一致。
行为修改: 我们可以拦截输入参数,例如,验证输入变量,而无需许多 assert 行。

示例:
让我向您展示一些在日常工作中必须使用封装器的示例:
1 - 计时器Timer
该封装函数用于测量函数的执行时间,并打印执行时间。它对于剖析和优化代码非常有用。
为了在 Python 中创建装饰器,我们需要定义一个叫做 timer 的函数,它接受一个叫做 func 的参数来表示它是一个装饰器函数。在 timer 函数中,我们定义另一个叫做 wrapper 的函数,它接收通常传递给我们要装饰的函数的参数。
在wrapper函数中,我们使用提供的参数调用所需的函数。我们可以这样做:result = func(*args, **kwargs)。
最后,包装函数返回装饰函数的执行结果。装饰函数应该返回对我们刚刚创建的包装函数的引用。
要使用装饰器,可以使用 @ 符号将其应用到所需的函数。
输出:
2- 调试器Debugger
通过打印每个函数的输入和输出,可以创建一个额外的有用的封装函数来方便调试。通过这种方法,我们可以深入了解各种函数的执行流程,而无需在应用程序中使用多个打印语句。
我们可以使用 __name__ 参数获取被调用函数的名称,然后使用 args , kwargsparameters 打印传递给函数的内容。
3 - 异常处理程序Exception Handler
异常处理程序 exception_handler 将捕获 divide 函数中出现的任何异常,并进行相应的处理。
我们可以根据您的要求在封装函数中自定义异常处理,例如记录异常或执行额外的错误处理步骤。
这对于简化我们的代码以及建立统一的异常处理和错误记录程序非常有用。
4 - 输入验证器Input Validator
该封装函数根据指定的条件或数据类型验证函数的输入参数。它可以用来确保输入数据的正确性和一致性。
另一种方法是在我们需要验证输入数据的函数中创建无数的 assert 行。
为了在装饰中添加验证,我们需要用另一个函数来封装装饰器函数,该函数将一个或多个验证函数作为参数。这些验证函数负责检查输入值是否满足某些标准或条件。
现在,validate_input 函数本身就充当了装饰器的角色。在封装函数内部,输入和关键字参数将根据所提供的验证函数进行检查。如果任何参数未通过验证,则会引发一个 ValueError,并给出一条提示无效参数的消息。
为了调用经过验证的输入,我们需要定义验证函数。例如,可以使用两个验证函数。第一个函数 lambda x: x > 0 检查参数 x 是否大于0,第二个函数 lambda y: isinstance(y, str) 检查参数 y 是否为字符串类型。
重要的是要确保验证函数的顺序与它们要验证的参数的顺序一致。
5 - 重试Retry
该封装器会重试执行指定次数的函数,重试之间会有延迟。它在处理网络或API调用时非常有用,这些调用偶尔会由于临时问题而失败。
为了实现这一点,我们可以为我们的装饰器定义另一个封装函数,与之前的示例类似。不过,这次我们可以传递特定的参数,如 max_attemps 和 delay,而不是提供验证函数作为输入变量。
当被装饰的函数被调用时,wrapper 函数被调用。它将记录尝试的次数(从0开始),并进入一个while循环。该循环尝试执行装饰函数,如果成功则立即返回结果。但是,如果出现异常,它将递增尝试计数器,并打印错误消息,指出尝试次数和出现的特定异常。然后使用 time.sleep 等待指定的延迟时间,然后再次尝试执行函数。
为了调用函数,我们可以指定最大尝试次数和每次调用函数之间的持续时间(以秒为单位)。
结论:
Python封装器是强大的工具,可以提升您的Python编程体验。通过使用封装器,你可以简化复杂的任务,提高代码的可读性,并提高工作效率。
在本文中,我们探讨了五个 Python 封装器的示例:
Timer Wrapper
Debugger Wrapper
Exception Handler Wrapper
Input Validator Wrapper
Function Retry Wrapper
将这些封装器集成到您的项目中,将帮助您编写更简洁、更高效的Python代码,并使您的编程技能更上一层楼。

可以关注UP主熬夜整理的视频:【2023版Python训练营】从入门到精通

本文翻译自:
标题:Five Python Decorators That Can Reduce Your Code By Half
地址:https://python.plainenglish.io/five-python-wrappers-that-can-reduce-your-code-by-half-af775feb1d5