Python上下文管理器

Python上下文管理器

Python上下文管理器

  如果您使用过Python中的with语句,那么您很可能已经使用过上下文管理器。Python中的with语句是一个非常有用的工具,可用于正确管理程序中的外部资源。它允许您在处理外部资源或需要这些阶段的操作时利用现有的上下文管理器自动处理设置和拆卸阶段。本文,晓得博客为你介绍Python上下文管理器。

Python上下文管理器

  此外,上下文管理协议允许您创建自己的上下文管理器,以便您可以自定义处理系统资源的方式。上下文管理器通常负责设置一些资源,例如打开一个连接,并在我们完成后自动处理清理工作。最常见的用例是打开文件。

with open('/path/to/file.txt', 'r') as f:
  for line in f:
    print(line)

是否需要Python上下文管理器

  现在,您可以在不使用WITH()的情况下打开文件但你必须自己清理。下面的示例是使用内置Open()函数

f = open('/path/to/file.txt', 'r')
for line in f:
    print(line)
f.close()  # must remember to close f

  除了这需要额外的代码行之外,还有其他一些缺点。即,

  • 更容易忘记关闭文件,
  • f.close()如果代码前面的某个地方出现异常,则不会被调用。

  使用with声明我们需要更多的代码来确保即使在发生异常的情况下也能关闭文件。

f = open('/path/to/file.txt', 'r')try:
  for line in f:
    print(line)
finally:
  f.close()  # runs no matter what happens

  应该关心正确关闭文件,除其他外,如果您打开太多文件,您将得到一个OSError.了解上下文管理器,可以帮助您决定何时将计划实现更易于阅读且更易于安全使用的内容构建为上下文管理器时让我们学习如何实现它们!

  推荐:Python中的 html5lib 和 lxml 解析器

使用上下文管理器管理资源

使用上下文管理器管理资源

  假设一个代码块引发了一个异常,或者如果它有一个具有多个返回路径的复杂算法,那么在所有地方关闭一个文件变得很麻烦。

  通常在其他语言中处理文件时try-except-finally用于确保文件资源在使用后关闭,即使出现异常。Python提供了一种简单的资源管理方法:上下文管理器。使用with关键字。当它被评估时,它应该产生一个执行上下文管理的对象。上下文管理器可以使用类或函数(带有装饰器)来编写。

  创建上下文管理器:

  使用类创建上下文管理器时,用户需要确保该类具有方法:enter()和exit()。enter()返回需要管理的资源,而exit()不返回任何内容,而是执行清理操作。

  首先,让我们创建一个简单的类ContextManager来了解使用类创建上下文管理器的基本结构,如下所示:

# Python program creating a
# context manager

class ContextManager():
	def __init__(self):
		print('init method called')
		
	def __enter__(self):
		print('enter method called')
		return self
	
	def __exit__(self, exc_type, exc_value, exc_traceback):
		print('exit method called')


with ContextManager() as manager:
	print('with statement block')
init method called
enter method called
with statement block
exit method called

  在这种情况下,会创建一个 ContextManager 对象。这是在as关键字 ie manager之后分配给变量的。在运行上述程序时,将依次执行以下命令:

  • __init__()
  • __enter__()
  • 语句块(with块内的代码)
  • __exit__()[此方法中的参数用于管理异常]

使用上下文管理器进行文件管理

  让我们应用上述概念来创建一个有助于文件资源管理的类。 FileManager 类有助于打开文件写入/读取内容然后关闭它。

# Python program showing
# file management using
# context manager

class FileManager():
	def __init__(self, filename, mode):
		self.filename = filename
		self.mode = mode
		self.file = None
		
	def __enter__(self):
		self.file = open(self.filename, self.mode)
		return self.file
	
	def __exit__(self, exc_type, exc_value, exc_traceback):
		self.file.close()

# loading a file
with FileManager('test.txt', 'w') as f:
	f.write('Test')

print(f.closed)

  输出:

Ture

  使用上下文管理器和 with 语句进行文件管理:

  在执行with块时,依次发生以下操作:

  • 执行__init__ 方法时,使用test.txt作为文件名和w (写入)作为模式创建FileManager对象。
  • __enter__ 方法以写入模式(设置操作)打开test.txt文件并将FileManager对象返回给变量f
  • 文本“测试”被写入文件中。
  • __exit__ 方法负责在退出with块(拆卸操作)时关闭文件。运行print(f.closed)
    时,输出为True,因为FileManager已经负责关闭文件,否则需要显式完成。

总结

  以上是晓得博客为你介绍的Python上下文管理器的全部内容,希望对你的Python学习有帮助。

  推荐:零基础如何开始学习Python


晓得博客,版权所有丨如未注明,均为原创
晓得博客 » Python上下文管理器

转载请保留链接:https://www.pythonthree.com/python-context-managers/

滚动至顶部