gpt4 book ai didi

python - Ruby 的 yield 在 Python 中的等价物是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:06:40 24 4
gpt4 key购买 nike

我正在为一个项目从 Ruby 切换到 Python。我很欣赏 Python 具有一流的函数和闭包这一事实,所以这个问题应该很简单。我只是还没有弄清楚什么是 Python 惯用的正确方法:

在 Ruby 中,我可以写:

def with_quietude(level, &block)
begin
saved_gval = gval
gval = level
yield
ensure
gval = saved_gval
end
end

并这样调用它:

with_quietude(3) {
razz_the_jazz
begin_the_beguine
}

(注意:我不是在询问 Python try/finally 处理,也不是在询问保存和恢复变量——我只是想要一个将 block 包装在其他代码中的重要示例。)

更新

或者,当我真正询问闭包时,由于某些答案在前面的示例中卡在全局分配上,如果调用如下所示怎么办? (请注意,这不会更改 with_quietude 的定义):

def frumble(x)
with_quietude {
razz_the_jazz(x)
begin_the_beguine(2 * x)
}
end

您将如何在 Python 中实现类似的东西(而不被 Python 专家 mock )?

最佳答案

深入了解 ruby​​ 的产量,您似乎想要类似 contextlib.contextmanager 的东西:

from contextlib import contextmanager

def razz_the_jazz():
print gval

@contextmanager
def quietude(level):
global gval
saved_gval = gval
gval = level

try:
yield
finally:
gval = saved_gval

gval = 1

with quietude(3):
razz_the_jazz()

razz_the_jazz()

这个脚本输出:

3
1

表明我们的上下文管理器确实在全局命名空间中重置了 gval。当然,我不会使用这个上下文管理器,因为它只能在全局命名空间中工作。 (它不适用于函数中的局部变量)例如。

这基本上是对赋值如何创建对对象的新引用的限制,并且您永远不能通过直接赋值来改变对象。 (改变一个对象的唯一方法是分配给它的一个属性或通过 __setitem__ (a[x] = whatever))

关于python - Ruby 的 yield 在 Python 中的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16301706/

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