gpt4 book ai didi

python - 我如何使用 GeneratorExit?

转载 作者:行者123 更新时间:2023-11-28 20:33:24 25 4
gpt4 key购买 nike

我有以下 mcve :

import logging
class MyGenIt(object):
def __init__(self, name, content):
self.name = name
self.content = content
def __iter__(self):
with self:
for o in self.content:
yield o
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
logging.error("Aborted %s", self,
exc_info=(exc_type, exc_value, traceback))

这里是示例使用:

for x in MyGenIt("foo",range(10)):
if x == 5:
raise ValueError("got 5")

我希望 logging.error 报告 ValueError,但它报告 GeneratorExit:

ERROR:root:Aborted <__main__.MyGenIt object at 0x10ca8e350>
Traceback (most recent call last):
File "<stdin>", line 8, in __iter__
GeneratorExit

当我在 __iter__ 中捕获 GeneratorExit 时:

def __iter__(self):
with self:
try:
for o in self.content:
yield o
except GeneratorExit:
return

没有记录(当然)因为 __exit__ 是用 exc_type=None 调用的。

  1. 为什么我在 __exit__ 中看到的是 GeneratorExit 而不是 ValueError
  2. 我该怎么做才能获得所需的行为,即 __exit__ 中的 ValueError

最佳答案

请注意,您可以“将上下文管理器带出”生成器,只需更改 3 行即可获得:

import logging
class MyGenIt(object):
def __init__(self, name, content):
self.name = name
self.content = content

def __iter__(self):
for o in self.content:
yield o

def __enter__(self):
return self

def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
logging.error("Aborted %s", self,
exc_info=(exc_type, exc_value, traceback))


with MyGenIt("foo", range(10)) as gen:
for x in gen:
if x == 5:
raise ValueError("got 5")

上下文管理器也可以充当迭代器——并且会捕获调用方代码异常,例如您的 ValueError。

关于python - 我如何使用 GeneratorExit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com