【发布时间】:2013-04-30 13:55:18
【问题描述】:
我正在为一个项目从 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 专家嘲笑)?
【问题讨论】:
-
Python 并没有这个结构。
yield主要用于实现迭代器。你可以让他们做你想做的事,但函数装饰器或上下文管理器是更好的方法。 (事实上,contextlib为你做了这种“破解”。) -
您能解释一下
yield语句在ruby 中的作用吗?我试了一下答案,但我不知道它是否正确,因为我不知道红宝石...... -
yieldin Ruby gives up control to the&blockwhich was passed in - 本质上,他是在寻求一种传入和运行任意代码块的方法。 -
顺便说一句,感谢您提出这个问题。一段时间以来,我一直想学习
ruby。我想这是一件事,我会更接近知道如何使用。