我正在从 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
处理,也不是关于保存和恢复变量的问题--我只想要一个在其他代码块内部包装另一个代码块的非平凡示例。)
更新
或者,由于一些答案在之前的示例中卡住了全局赋值,而我真正想问的是闭包,如果调用如下所示会怎么样?(请注意,这不会改变with_quietude
的定义):
def frumble(x)
with_quietude {
razz_the_jazz(x)
begin_the_beguine(2 * x)
}
end
你如何在Python中实现类似的功能(而不会被Python专家嘲笑)?
yield
主要用于实现迭代器。你可以有一些方法让它们做你想要的事情,但函数装饰器或上下文管理器是更好的方法。(实际上,contextlib
为您执行此类 "黑科技"。) - millimooseyield
语句的作用吗?我尝试回答了一下,但由于我不懂 Ruby,所以不知道是否正确。 - mgilsonyield
在Ruby中 放弃了对传入的&block
的控制 - 本质上,它要求一种传递和运行任意代码块的方式。 - Hanneleruby
已经有一段时间了。我想这是我离掌握如何使用它更近了一步。 - mgilson