如何利用上下文管理器扩展Python计时器


本文小编为大家详细介绍“如何利用上下文管理器扩展Python计时器”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何利用上下文管理器扩展Python计时器”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Python 有一个独特的构造,用于在代码块之前和之后调用函数:上下文管理器。上下文管理器长期以来一直是 Python 中重要的一部分。由 PEP 343 于 2005 年引入,并首次在 Python 2.5 中实现。可以使用with关键字识别代码中的上下文管理器:EXPRESSION是一些返回上下文管理器的 Python 表达式。首先上下文管理器绑定到变量名VARIABLE上,BLOCK可以是任何常规的 Python 代码块。上下文管理器保证程序在BLOCK之前调用一些代码,在BLOCK执行之后调用一些其他代码。这样即使BLOCK引发异常,后者也是会照样执行。上下文管理器最常见的用途是处理不同的资源,如文件、锁和数据库连接等。上下文管理器用于使用资源后释放和清理资源。以下示例仅通过打印包含冒号的行来演示timer.py的基本结构。此外,它展示了在 Python 中打开文件的常用习语:注意,使用open()作为上下文管理器,文件指针fp不会显式关闭,可以确认fp已自动关闭:True在此示例中,open("timer.py")是一个返回上下文管理器的表达式。该上下文管理器绑定到名称fp。上下文管理器在print()执行期间有效。这个单行代免费云主机域名码块在fp的上下文中执行。fp是上下文管理器是什么意思?从技术上讲,就是fp实现了上下文管理器协议。Python 语言底层有许多不同的协议。可以将协议视为说明我们代码必须实现哪些特定方法的合同。上下文管理器协议由两种方法组成:进入与上下文管理器相关的上下文时调用.__enter__()。退出与上下文管理器相关的上下文时调用.__exit__()。换句话说,要自己创建上下文管理器,需要编写一个实现.__enter__().__exit__()的类。试试Hello, World!上下文管理器示例:Studio是一个上下文管理器,它实现了上下文管理器协议,使用如下:你好 云朵君
正在忙 …
一会儿见, 云朵君首先,注意.__enter__()在做事之前是如何被调用的,而.__exit__()是在做事之后被调用的。该示例中,没有引用上下文管理器,因此不需要使用as为上下文管理器命名。接下来,注意self.__enter__()的返回值受as约束。创建上下文管理器时,通常希望从.__enter__()返回self。可以按如下方式使用该返回值:你好 云朵君
云朵君 正在忙 …
一会儿见, 云朵君在写__exit__函数时,需要注意的事,它必须要有这三个参数:exc_type:异常类型exc_val:异常值exc_tb:异常的错误栈信息这三个参数用于上下文管理器中的错误处理,它们以sys.exc_info()的返回值返回。当主逻辑代码没有报异常时,这三个参数将都为None。如果在执行块时发生异常,那么代码将使用异常类型、异常实例和回溯对象(即exc_typeexc_valueexc_tb)调用.__exit__()。通常情况下,这些在上下文管理器中会被忽略,而在引发异常之前调用.__exit__():你好 云朵君
一会儿见, 云朵君
Traceback (most recent call last):
File ““, line 2, in
AttributeError: ‘Greeter’ object has no attribute ‘age’
可以看到,即使代码中有错误,还是照样打印了"一会儿见, 云朵君"。现在我们初步了解了上下文管理器是什么以及如何创建自己的上下文管理器。在上面的例子中,我们只是为了构建一个上下文管理器,却写了一个类。如果只是要实现一个简单的功能,写一个类未免有点过于繁杂。这时候,我们就想,如果只写一个函数就可以实现上下文管理器就好了。这个点Python早就想到了。它给我们提供了一个装饰器,你只要按照它的代码协议来实现函数内容,就可以将这个函数对象变成一个上下文管理器。我们按照 contextlib 的协议来自己实现一个上下文管理器,为了更加直观我们换个用例,创建一个我们常用且熟悉的打开文件(with open)的上下文管理器。在被装饰函数里,必须是一个生成器(带有yield),而yield之前的代码,就相当于__enter__里的内容。yield之后的代码,就相当于__exit__里的内容。上面这段代码只能实现上下文管理器的第一个目的(管理资源),并不能实现第二个目的(处理异常)。如果要处理异常,可以改成下面这个样子。Python 标准库中的contextlib包括定义新上下文管理器的便捷方法,以及可用于关闭对象、抑制错误甚至什么都不做的现成上下文管理器!了解了上下文管理器的一般工作方式后,要想知道它们是如何帮助处理时序代码呢?假设如果可以在代码块之前和之后运行某些函数,那么就可以简化 Python 计时器的工作方式。其实,上下文管理器可以自动为计时时显式调用.start().stop()。同样,要让 Timer 作为上下文管理器工作,它需要遵守上下文管理器协议,换句话说,它必须实现.__enter__().__exit__()方法来启动和停止 Python 计时器。从目前的代码中可以看出,所有必要的功能其实都已经可用,因此只需将以下方法添加到之前编写的的Timer类中即可:Timer 现在就是一个上下文管理器。实现的重要部分是在进入上下文时,.__enter__()调用.start()启动 Python 计时器,而在代码离开上下文时,.__exit__()使用.stop()停止 Python 计时器。Elapsed time: 0.7012 seconds此处注意两个更微妙的细节:.__enter__()返回self,Timer实例,它允许用户使用as将Timer实例绑定到变量。例如,使用with Timer() as t:将创建指向Timer对象的变量t.__exit__()需要三个参数,其中包含有关上下文执行期间发生的任何异常的信息。代码中,这些参数被打包到一个名为exc_info的元组中,然后被忽略,此时 Timer 不会尝试任何异常处理。在这种情况下不会处理任何异常。上下文管理器的一大特点是,无论上下文如何退出,都会确保调用.__exit__()。在以下示例中,创建除零公式模拟异常查看代码功能:1 / -3 = -0.333
1 / -2 = -0.500
1 / -1 = -1.000
Elapsed time: 0.0001 seconds
Traceback (most recent call last):
File ““, line 3, in
ZeroDivisionError: division by zero
注意 ,即使代码抛出异常,Timer也会打印出经过的时间。现在我们将一起学习如何使用Timer上下文管理器来计时 “下载数据” 程序。回想一下之前是如何使用 Timer 的:我们正在对requests.get()的调用进行记时监控。使用上下文管理器可以使代码更短、更简单、更易读:读到这里,这篇“如何利用上下文管理器扩展Python计时器”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: css的flex弹性布局怎么应用

本篇内容介绍了“css的flex弹性布局怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!案例基础布局htmlcss因为flex主要方便与移动端布局,所以测…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/17 18:07
下一篇 03/17 18:22

相关推荐