jjzjj

contextmanager

全部标签

python - python中的"with"语句,为什么"as"段必须是单个对象

用Python可以说:a,b,c=something_that_returns_a_3_tuple()但是with语句如下:classthing(object):def__enter__(self):return(1,2,3)def__exit__(self,a,b,c):passwiththing()asa,b,c:printaprintbprintc不会工作必须具备:classthing(object):def__enter__(self):return(1,2,3)def__exit__(self,a,b,c):passwiththing()as(a,b,c):printapri

python - 编写一个只能用作上下文管理器的 Python 类

这个问题在这里已经有了答案:Howtocheckifanobjectiscreatedwith`with`statement?(6个答案)关闭7年前。在Python中有没有一种方法可以编写一个除非与with语句一起使用就会出错的类?#Okay:withFoo()asf1:f1.func1()f1.func2()#Notokay:f2=Foo()f2.func1()我可以手动完成:让__enter__设置一个标志并让所有其他方法检查该标志。但是有更好的方法吗?这是非自从方法的代码:classFoo(object):def__init__(self):self._entered=False

python - 没有 Yield 的上下文管理器

我能否有一个偶尔不产生的上下文管理器,在这种情况下,with语句中的代码根本不会执行?importcontextlib@contextlib.contextmanagerdefMayNotYield(to_yield):ifto_yield:yieldwithMayNotYield(True):print'Thisworks.'withMayNotYield(False):print'Thiserrors.'我可以要求用户用try-catch包装with语句,但这不是首选。我也可以执行以下操作,但它也很丑陋。importcontextlib@contextlib.contextmana

python - 在 Python 中临时更改变量的值

Python3.4提供了这个简洁的工具来临时重定向标准输出:#Fromhttps://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdoutwithredirect_stdout(sys.stderr):help(pow)Thecode不是super复杂,但我不想一遍又一遍地写它,特别是因为一些想法已经进入它以使其可重入:classredirect_stdout:def__init__(self,new_target):self._new_target=new_target#Weusealistofo

带线程的 Python 超时上下文管理器

我有timeout上下文管理器,它可以完美地处理信号,但它会在多线程模式下引发错误,因为信号仅在主线程中工作。deftimeout_handler(signum,frame):raiseTimeoutException()@contextmanagerdeftimeout(seconds):old_handler=signal.signal(signal.SIGALRM,timeout_handler)signal.alarm(seconds)try:yieldfinally:signal.alarm(0)signal.signal(signal.SIGALRM,old_handler

python - 在上下文处理程序中重新引发异常

来自datamodeldocs关于上下文管理器:Notethat__exit__()methodsshouldnotreraisethepassed-inexception;thisisthecaller’sresponsibility.我有一个临时文件,我想用close释放它的文件描述符,但不向磁盘写入任何内容。我的直觉解决方案是传递异常,但那是discouragedinthedocs-当然有充分的理由。classProcessor(object):...defwrite(self,*args,**kwargs):ifsomething_bad_happens:raiseRuntim

python:sudo上下文管理器?

是否有任何可能的方法来实现sudo上下文管理器,它使用sudoers系统作为另一个用户运行封闭范围?system('whoami')#sameresultasecho$USERwithsudo():system('whoami')#root我怀疑sudo(8)可执行文件是否能帮到我,但也许有一些我可以绑定(bind)到的C级接口(interface)?动机:我几乎可以将这个shell脚本完全移植到python而无需任何子进程,除了我目前必须system('sudosh-c"echo%i>/dev/thatfile"'%值)。如果我可以withsudo(),open('/dev/that

python - 在 Python 中使用和关闭文件

我读过,这样打开的文件在离开withblock时会自动关闭:withopen("x.txt")asf:data=f.read()dosomethingwithdata然而当从网络打开时,我需要这个:fromcontextlibimportclosingfromurllib.requestimporturlopenwithclosing(urlopen('http://www.python.org'))aspage:forlineinpage:print(line)为什么以及有什么区别?(我使用的是Python3) 最佳答案 细节有点

Python:标准函数和上下文管理器?

在python中,有许多函数既可以用作标准函数,也可以用作上下文管理器。例如open()可以这样调用:my_file=open(filename,'w')或withopen(filename,'w')asmy_file:两者都为您提供一个my_file对象,可用于执行您需要的任何操作。一般来说,后者更可取,但有时也可能想做前者。我已经能够弄清楚如何编写上下文管理器,方法是使用__enter__和__exit__函数创建一个类,或者使用@函数上的contextlib.contextmanager装饰器和yield而不是return。但是,当我这样做时,我不能再直接使用函数-例如,使用装饰

python - 有没有一种有意义的方法可以在生成器中使用上下文管理器?

fromcontextlibimportcontextmanager@contextmanagerdefcontext():print"entering"yieldprint"exiting"deftest():withcontext():forxinrange(10):yieldxforxintest():ifx==5:break#orraise输出:entering有没有办法让python在for循环中断时自动调用context()的__exit__方法?或者其他实现相同目标的方法?我对生成器和上下文管理器的了解让我怀疑这是不可能的,但这使得上下文管理器在生成器内部相当无用,不是吗