gpt4 book ai didi

Python yield 在 try block 中没有参数

转载 作者:太空狗 更新时间:2023-10-30 02:21:47 25 4
gpt4 key购买 nike

我正在阅读 this文章,它显示了这段有趣的代码:

class Car(object):
def _factory_error_handler(self):
try:
yield
except FactoryColorError, err:
stacktrace = sys.exc_info()[2]
raise ValidationError(err.message), None, stacktrace

def _create_customizer_error_handler(self, vin):
try:
yield
except CustomizerError, err:
self._factory.remove_car(vin)
stacktrace = sys.exc_info()[2]
raise ValidationError(err.message), None, stacktrace

def _update_customizer_error_handler(self, vin):
try:
yield
except CustomizerError, err:
stacktrace = sys.exc_info()[2]
raise ValidationError(err.message), None, stacktrace

def create(self, color, stereo):
with self._factory_error_handler():
vin = self._factory.make_car(color)

with self._create_customizer_error_handler(vin):
self._customizer.update_car(vin, stereo)

return vin

def update(self, vin, color, stereo):
with self._factory_error_handler():
self._factory.update_car_color(vin, color)

with self._update_customizer_error_handler(vin):
self._customizer.update_car(vin, stereo)

return

在这里,它们在 try block 中没有参数地让步。然后在 with block 中使用它。有人可以解释一下这里发生了什么吗?

最佳答案

帖子中的代码似乎有误。如果用 contextmanager 修饰各种错误处理程序,那将是有意义的。请注意,在帖子中,代码导入了 contextmanager 但没有使用它。这让我觉得这个人只是在创建帖子时犯了一个错误,并在该示例中遗漏了 contextmanager 。 (帖子中后面的示例 do 使用 contextmanager。)我认为发布的代码会导致 AttributeError,因为各种 _error_handler 函数不是上下文管理器,也没有正确的 __enter____exit__ 方法。

使用 contextmanager,代码基于 the documentation 是有意义的:

At the point where the generator yields, the block nested in the with statement is executed. The generator is then resumed after the block is exited. If an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred.

关于Python yield 在 try block 中没有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074796/

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