草庐IT

ContextManager

全部标签

python - 将两个上下文管理器合二为一

我使用Python2.7,我知道我可以这样写:withA()asa,B()asb:do_something()我想提供一个方便的助手,两者兼而有之。这个助手的用法应该是这样的:withAB()asab:do_something()现在AB()应该同时做:创建上下文A()和创建上下文B()。我不知道如何编写这个便利助手 最佳答案 不要重新发明轮子;这并不像看起来那么简单。上下文管理器被视为一个堆栈,并且应该以与它们进入时相反的顺序退出,例如。如果发生异常,此顺序很重要,因为任何上下文管理器都可以抑制异常,此时其余的管理器甚至不会收到此

python - 将两个上下文管理器合二为一

我使用Python2.7,我知道我可以这样写:withA()asa,B()asb:do_something()我想提供一个方便的助手,两者兼而有之。这个助手的用法应该是这样的:withAB()asab:do_something()现在AB()应该同时做:创建上下文A()和创建上下文B()。我不知道如何编写这个便利助手 最佳答案 不要重新发明轮子;这并不像看起来那么简单。上下文管理器被视为一个堆栈,并且应该以与它们进入时相反的顺序退出,例如。如果发生异常,此顺序很重要,因为任何上下文管理器都可以抑制异常,此时其余的管理器甚至不会收到此

python - 在上下文管理器 __enter__() 中捕获异常

是否可以保证__exit__()方法在__enter__()有异常的情况下被调用?>>>classTstContx(object):...def__enter__(self):...raiseException('Oopsin__enter__')......def__exit__(self,e_typ,e_val,trcbak):...print"Thisisn'trunning"...>>>withTstContx():...pass...Traceback(mostrecentcalllast):File"",line1,inFile"",line3,in__enter__Exc

python - 在上下文管理器 __enter__() 中捕获异常

是否可以保证__exit__()方法在__enter__()有异常的情况下被调用?>>>classTstContx(object):...def__enter__(self):...raiseException('Oopsin__enter__')......def__exit__(self,e_typ,e_val,trcbak):...print"Thisisn'trunning"...>>>withTstContx():...pass...Traceback(mostrecentcalllast):File"",line1,inFile"",line3,in__enter__Exc

python - 上下文管理器中的 __init__ 与 __enter__

据我了解,上下文管理器的__init__()和__enter__()方法只被调用一次,一个接一个,没有任何机会其他要在两者之间执行的代码。将它们分成两种方法的目的是什么,我应该在每种方法中放入什么?编辑:抱歉,没有关注文档。编辑2:实际上,我感到困惑的原因是因为我在考虑@contextmanager装饰器。使用@contextmananger创建的上下文管理器只能使用一次(第一次使用后生成器会耗尽),因此通常使用with语句中的构造函数调用编写它们;如果这是使用with语句的唯一方法,那么我的问题将是有道理的。当然,实际上,上下文管理器比@contextmanager可以创建的更通用;

python - 上下文管理器中的 __init__ 与 __enter__

据我了解,上下文管理器的__init__()和__enter__()方法只被调用一次,一个接一个,没有任何机会其他要在两者之间执行的代码。将它们分成两种方法的目的是什么,我应该在每种方法中放入什么?编辑:抱歉,没有关注文档。编辑2:实际上,我感到困惑的原因是因为我在考虑@contextmanager装饰器。使用@contextmananger创建的上下文管理器只能使用一次(第一次使用后生成器会耗尽),因此通常使用with语句中的构造函数调用编写它们;如果这是使用with语句的唯一方法,那么我的问题将是有道理的。当然,实际上,上下文管理器比@contextmanager可以创建的更通用;

为类拥有的对象组合上下文管理器的 Pythonic 方法

对于某些任务,通常需要多个具有显式释放资源的对象-例如,两个文件;当任务是使用嵌套withblock的函数本地时,这很容易完成,或者-更好的是-单个withblock和多个with_item子句:withopen('in.txt','r')asi,open('out.txt','w')aso:#dostuffOTOH,当此类对象不仅是函数范围的本地对象,而是由类实例拥有时,我仍然很难理解它应该如何工作-换句话说,上下文管理器是如何组成的。理想情况下,我想做这样的事情:classFoo:def__init__(self,in_file_name,out_file_name):self.i

为类拥有的对象组合上下文管理器的 Pythonic 方法

对于某些任务,通常需要多个具有显式释放资源的对象-例如,两个文件;当任务是使用嵌套withblock的函数本地时,这很容易完成,或者-更好的是-单个withblock和多个with_item子句:withopen('in.txt','r')asi,open('out.txt','w')aso:#dostuffOTOH,当此类对象不仅是函数范围的本地对象,而是由类实例拥有时,我仍然很难理解它应该如何工作-换句话说,上下文管理器是如何组成的。理想情况下,我想做这样的事情:classFoo:def__init__(self,in_file_name,out_file_name):self.i

python - 异步上下文管理器

我有一个asynchronousAPI我用它来连接和发送邮件到一个SMTP服务器,该服务器有一些设置和拆除它。所以它非常适合使用Python3的contextlib中的contextmanager。不过,我不知道是否可以写,因为他们都使用生成器语法来写。这可能说明了问题(包含yield-base和async-await语法的混合,以说明异步调用和向上下文管理器屈服之间的区别)。@contextmanagerasyncdefsmtp_connection():client=SMTPAsync()...try:awaitclient.connect(smtp_url,smtp_port)a

python - 异步上下文管理器

我有一个asynchronousAPI我用它来连接和发送邮件到一个SMTP服务器,该服务器有一些设置和拆除它。所以它非常适合使用Python3的contextlib中的contextmanager。不过,我不知道是否可以写,因为他们都使用生成器语法来写。这可能说明了问题(包含yield-base和async-await语法的混合,以说明异步调用和向上下文管理器屈服之间的区别)。@contextmanagerasyncdefsmtp_connection():client=SMTPAsync()...try:awaitclient.connect(smtp_url,smtp_port)a