首页 > 编程知识 正文

python3中标准数据类型,python3 标准数据类型包括

时间:2023-05-04 09:37:17 阅读:170796 作者:977

在任何编程语言中,资源的使用(如文件操作和数据库连接)都是常见的。 但是,这些资源的供应有限。 因此,主要问题是确保在使用后释放这些资源。 如果不释放它们,资源可能会泄漏,导致系统变慢或崩溃。 如果用户有自动配置和删除资源的机制,这将非常有用。 在Python3中,可以通过使用上下文管理器上下文管理器来实现,它有助于正确处理资源。上下文管理器是一个对象。

在Python3中,可以通过上下文管理器来管理资源上下文管理器可以通过三种方式创建:基于类的上下文管理器、基于生成器的上下文管理器和基于函数装饰的上下文管理器。

http://www.Sina.com/http://www.Sina.com/_ _ enter _ ()返回要管理的资源。 __exit__ ()执行清理操作而不返回任何内容。

上下文管理器通常使用with语句调用,但也可以在直接调用方法中使用。 上下文管理器定义执行with语句时要建立的运行时上下文,并处理进入entry into,exit from以执行代码块所需的运行时上下文。

执行文件操作的最常见方法是使用with关键字。 Python的with语句支持上下文管理器定义的运行时上下文的概念。 这是使用__enter__,__exit__对实现的。 通过这些方法,可以使用用户定制的类在执行正文主体之前进入并在语句结束时退出的运行时上下文。

with语法:

with expression [ as target ] : suite http://www.Sina.com /

(1) .为了取得上下文管理者而评价上下文公式

(2) .上下文管理器的__enter__ ) )被加载以供以后使用;

(3) .上下文管理器(__exit__ ) )被加载以供稍后使用;

(4) .调用上下文管理器的__enter__ )方法;

(5).TARGET包含在with语句中时,__enter__ ) )的返回值代入其中。 with语句确保如果无错误地返回__enter__ ()方法,则始终调用__exit__ ()。 因此,如果在向TARGET列表赋值时发生错误,则它将被视为在SUITE中发生的错误。 __enter__ ()方法可以具有也可以不具有返回值,如果没有返回值,则缺省情况下返回None。

(6).SUITE被执行

(7) .调用上下文管理器的__exit__ )方法。 如果SUITE由于异常而终止,则其类型、值和回溯参数为__exit__ (); 否则,就给你三个None。 __exit__ ()方法也可以具有返回值。 此返回值必须为布尔True或False,默认值为None (即False )。 如果为False,则抛出异常,并且用户必须进行异常处理。 如果为True,则忽略异常。

如果SUITE异常终止,并且从__exit__ ()方法返回的值为False,则将发生异常。 如果返回值为True,则隐藏异常,并继续执行with语句之后的语句。

ext-align:justify;">      如果SUITE因异常以外的任何原因退出,则__exit__()的返回值将被忽略,并在所采取的退出类型的正常位置继续执行。

      contextmanager.__enter__():输入运行时上下文并返回此对象或与运行时上下文相关的另一个对象。此方法返回的值绑定到使用此上下文管理器的with语句的as子句中指定的目标(如果有)。返回自身的上下文管理器的一个示例是文件对象。文件对象从__enter__()返回自身以允许open()用作with语句中的上下文表达式。

      contextmanager.__exit__(exc_type, exc_val, exc_tb):退出运行时上下文并返回一个布尔标志,指示是否应抑制发生的任何异常。如果在执行with语句主体时发生异常,则参数包含异常类型、值和回溯信息(traceback information)。否则,所有三个参数都是None。从此方法返回True将导致with语句抑制异常并继续执行紧跟在with语句之后的语句。否则,此方法执行完毕后,异常将继续传播。执行此方法期间发生的异常将替换with语句主体中发生的任何异常。传入的异常不应显式重新引发,相反,此方法应返回False以指示该方法成功完成并且不想抑制引发的异常。这允许上下文管理代码轻松检测__exit__()方法是否实际失败。

      上下文管理器的典型用途包括保存和恢复各种全局状态、锁定和解锁资源、关闭打开的文件等。

      何时使用上下文管理器:qcdl的代码必须打开和关闭连接作为其流程的一部分时;qcdl的代码必须使用前置条件和后置条件(preconditions and post-conditions)时;以及qcdl尝试管理系统上的有限资源时,上下文管理器是一个不错的选择。

      以上内容主要参考:

      1. https://docs.python.org/3/reference/datamodel.html#context-managers

      2. https://www.geeksforgeeks.org/context-manager-in-python/

      以下为测试代码:

import contextlibvar = 3if var == 1: # reference: https://www.geeksforgeeks.org/context-manager-in-python/ # 基于类的上下文管理器 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) # Trueelif var == 2: # https://medium.com/swlh/3-ways-to-create-context-managers-in-python-a88e3ba536f3 # 基于生成器的上下文管理器:代替__enter__和__exit__方法,生成器和@contextlib.contextmanager装饰器将在yield语句之前运行所有内容,就好像它是__enter__方法的一部 # 分一样,产生的值可能是__enter__方法将返回的结果.之后,将运行with块中的内容,作为最后一步,将运行yield语句之后的代码,就好像它是__exit__方法一样 @contextlib.contextmanager def file_hanlder(file_name, file_mode): file = open(file_name, file_mode) print("open file") yield file # yeild之前的代码会在上下文管理器中作为__enter__方法执行,并将结果通过yield返回,所有在yield之后的代码会作为__exit__方法执行 file.close() print("close file") with file_hanlder("test.txt", "w") as f: f.write("Test2") print("write file") print(f.closed) # Trueelif var == 3: # https://medium.com/swlh/3-ways-to-create-context-managers-in-python-a88e3ba536f3 # 基于函数装饰器的上下文管理器:函数装饰器方法的问题之一是无法访问__enter__方法的返回值 class file_handler_mixin(contextlib.ContextDecorator): def __init__(self, file_name, file_mode): self._file_name = file_name self._file_mode = file_mode self._file = None def __enter__(self): print(f"Enter Method: File Name {self._file_name}") self._file = open(self._file_name, self._file_mode) # 无法从装饰函数访问文件对象 return self._file def __exit__(self,exc_type,exc_value,exc_traceback): print(f"Exit Method: File Mode {self._file_mode}") self._file.close() @file_handler_mixin("test.txt", "w") def write_to_file(): print("Not access to the value returned by the __enter__ method") write_to_file()print("test finish")

      GitHub:https://github.com/fengbingchun/Python_Test

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。