使用with statemen时出错

2024-10-01 15:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们对python开发还不熟悉,我试着去理解with的用法

  class Mgr(object):

       def __enter__(self): pass
       def __exit__(self, ext, exv, trb):
          if ext is not None: print "no not possible"
                 print "OK I caught you"
                 return True

       def honey(self):
           print 'guli'



b = Mgr()
with b.honey() as d:
        print d

当我运行代码时,它会给我一个输出guli以及一个属性错误。在

我知道with与上下文管理器一起工作,并且b.honey()是一个上下文管理器??。。你们能解释一下为什么会发生这个错误吗?谢谢帮助。。在

Traceback (most recent call last): File "C:/Python27/c", line 18, in <module> with b.honey() as d: AttributeError: __exit__


Tags: self用法管理器defas错误withexit
1条回答
网友
1楼 · 发布于 2024-10-01 15:21:57

问题是,虽然b是一个上下文管理器,b.honey()不是

b.honey()就是从honey方法返回的任何内容。在本例中,您不返回任何内容,因此它是None。在


如果希望b.honey()返回b,只需将return self添加到方法的末尾。但这有点奇怪。您通常不会期望在with语句中使用b.honey()来“关闭”b。这就像with f.read(8192) as buf:关闭文件f。(在一些用例中,这可能是有意义的,但一般来说是不合理的。)


或者,b和{}不能都是完全独立的上下文管理器。很难想象您希望这样做,但是如果您希望这样做,您可以返回其他类的实例或使用^{}修饰符:

@contextlib.contextmanager
def honey(self):
    print 'guli'
    yield 'this is d'
    print 'ilug'

但更可能的是,你真正想要的是这样的:

^{pr2}$

但在这种情况下,您可能需要将__enter__方法改为return self。不管它返回什么结果都是d。在

例如:

class Mgr(object):
     def __enter__(self): 
         return self
     def __exit__(self, ext, exv, trb):
         if ext is not None: print "no not possible"
         print "OK I caught you"
         return True

    def honey(self):
        print 'guli'

with Mgr() as d:
    d.honey()
    print d

现在,with Mgr() as d构造并初始化一个Mgr实例(您没有__init__,因此它什么都不做),然后调用它的__enter__方法,返回该实例,然后将结果赋给d。然后运行d.honey()和{}。然后(不管是否有异常)它调用d.__exit__(…)。在

相关问题 更多 >

    热门问题