川石教育
全国咨询热线:136-9172-9932
  1. 首页 > 资讯与干货 > IT资讯

有效使用Python 中的 with 关键字

作者:川石学院 日期:2022-05-13 13:48:41 点击数:

一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“Python 中的 with 关键字”。

自动化测试:Python常见的几种编程模式(图1)

  我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段:

  with open('Hi.text', 'w') as f:

  f.write("Hello, there")

  但是,我们中的一些人不知道 with 有什么用,以及为什么我们需要在这里使用它。在此阅读中,您将找到关于 with 可解决的几乎所有问题。让我们开始吧!

  首先,让我们考虑一下如果不使用 with 关键字我们需要做什么。在这种情况下,我们需要先打开文件并尝试执行 write。不管成功与否,我们最好在最后关闭它,所以我们的代码将如下所示:

  f = open('Hi.text', 'w')

  try:

  f.write('Hello, there')

  finally:

  f.close()

  那么,with 关键字有什么用呢?它只是有助于将我们的 try..finally 代码缩短为 with... 的单个语句!这就是 with 语句用法。

  那么,它到底是什么?事实上,with 语句本身在 Python 中并没有什么特别之处,它只是 Python 中上下文管理器的一个特性。上下文管理器,引用自 Python 官方文档,是一种让您在需要时准确分配和释放资源的方法,或者简单来说:当您在某些资源上做某事时缩短您的代码片段,这意味着您可以自己定义 with 语句的用法!

  我们如何做到这一点?嗯,很简单,你只需要实现两个魔术函数:一个叫做 __enter__,另一个叫做 __exit__。第一种方法是编写一个实现这两个函数的类,如下所示:

  class My_file:

  def __init__(self, fname):

  self.fname = fname

  def __enter__(self):

  self.file = open(self.fname, 'w')

  return self.file

  def __exit__(self, exc_type, exc_val, exc_trace_back):

  if self.file:

  self.file.close()

  在这里,我们创建了一个普通的 Python 类,实现了两个魔术函数。注意这两个函数的签名:__enter__ 只接受 self ,而 __exit__ 将接受更多参数,示例中的这三个是标准形式。这样,我们就可以直接使用:

  with My_file('hello.txt') as f:

  f.write('hello, world!')

  这里的 with 语句会先调用 __init__ 构造一个新对象,然后再调用 __enter__ 方法;最后,它会在代码块完成之前触发 __exit__ 方法。所以,上面代码的大致等价如下:

  myfile = My_file('hello.txt')

  f = myfile.__enter__()

  f.write('hello, world!')

  myfile.__exit(...)

  实现上下文管理器的第二种方法是通过装饰器,如下:

  1、你import contextmanager from contextlib。

  2、你写一个函数来实现你想要的with语句。

  3、在函数上方添加一个装饰器@contextmanager。

  4、使用你的with your_function!

  根据上面的介绍,让我们写一个装饰器上下文管理器!

  from contextlib import contextmanager

  @contextmanager

  def my_file_open(fname):

  try:

  f = open(fname, 'w')

  yield f

  finally:

  print('Closing file')

  f.close()

  with file_open('hi.txt') as f:

  f.write('hello world')

  以上几乎涵盖了 with 语句和上下文管理器的所有基础知识,但是如果您想了解更多信息,请继续...!

  contextlib 中有一些方便的工具供您使用。第一个是 closing 。closing 基本上会用你在退出之前实现的另一个函数来包装你的代码块。

  @contextmanager

  def closing(f):

  try:

  f.write("Finish writing")

  finally:

  f.close()

  with closing(open("hi.text")):

  f.write("hello world")

  例如,在上面的代码中,我们可以直接调用 close(your_way_of_getting_resource) ,在你下面写的代码块即将完成之前(f.write("hello world")),它会执行 try..finally 我们在上面定义的块。

  另一个是使用 suppress 工具。我们知道,在很多情况下,如果我们尝试获取一些资源,很可能在打开文件时会出现 FileNotFoundException 等错误。在某些情况下,我们希望捕获错误或抑制错误,以便程序继续正常运行。suppress 是我们可以抑制警告的一种方式。你需要做的就是弄清楚你想要抑制哪个异常,并编写with suppress(your_choice_of_exception),Python 将从这里开始处理它。

  在其他情况下,您可能只想在输入 with 代码块时执行某些操作。在这种情况下,nullcontext 对你来说会很方便。nullcontext 只会返回你在 __enter__ 函数中定义的东西,而不会做任何其他事情。如果您在 Python 中处理 async 操作以访问资源,则 aclosure 是处理这种情况的实用工具。


相关文章
  • 亚马逊运营成功转行软件测试,薪资13K表示很满意!2022-05-13 13:48:41
  • 西安川石的兰朋友喊你来当他的学弟学妹啦!2022-05-13 13:48:41
  • 国外的月亮也不一定比国内测试猿的年薪美~2022-05-13 13:48:41
  • 建筑工程专业朱同学成功转行为软件测试人!2022-05-13 13:48:41
  • 财务管理专业转行软件测试月薪甩会计几条街!2022-05-13 13:48:41
  • 只有技术沉淀才能成功上岸,深圳就业薪资13K!2022-05-13 13:48:41
  • 薪资11K!实现自我价值,从掌握一门IT技术开始...2022-05-13 13:48:41
  • 文科生转行软件测试照样拿下高薪15K!2022-05-13 13:48:41
  • 恭喜罗同学喜提19.5K,成功入行软件测试!2022-05-13 13:48:41
  • 毕业1年,迷茫的他最终选择转行软件测试2022-05-13 13:48:41