python - Ruby 在 Python 中的 tap 习语

标签 python ruby idioms

有一个有用的 Ruby 习惯用法,它使用 tap 允许您创建一个对象,对其进行一些操作并返回它(我在这里仅使用列表作为示例,我的真实代码是更多参与):

def foo
  [].tap do |a|
    b = 1 + 2
    # ... and some more processing, maybe some logging, etc.
    a << b
  end
end

>> foo
=> [1]

Rails 有一个类似的方法叫做returning,所以你可以这样写:

def foo
  returning([]) do |a|
    b = 1 + 2
    # ... and some more processing, maybe some logging, etc.
    a << b
  end
end

这不言而喻。不管你对对象做了多少处理,它仍然是函数的返回值。

在 Python 中我必须写:

def foo():
  a = []
  b = 1 + 2
  # ... and some more processing, maybe some logging, etc.
  a.append(b)
  return a

而且我想知道是否有办法将这个 Ruby 习惯用法移植到 Python 中。我的第一个想法是使用 with 语句,但是 return with 不是有效的语法。

最佳答案

简短回答:Ruby 鼓励方法链,Python 不鼓励。

我想正确的问题是:Ruby 的 tap 有什么用?

现在我对 Ruby 了解不多,但通过谷歌搜索,我得到的印象是 tap 在概念上用作方法链。

在 Ruby 中,样式:SomeObject.doThis().doThat().andAnotherThing() 非常地道。它是 fluent interfaces 概念的基础, 例如。 Ruby 的 tap 是这种情况的一个特例,您可以动态定义 doThis 而不是 SomeObject.doThis()

为什么我要解释这一切?因为它告诉我们为什么 tap 在 Python 中没有很好的支持。需要注意的是,Python 不执行调用链

例如,Python 列表方法通常返回 None 而不是返回变异列表。 mapfilter 等函数不是列表方法。另一方面,许多 Ruby 数组方法确实会返回修改后的数组。

除了某些情况,如某些 ORM,Python 代码不使用流畅的接口(interface)。

说到底就是惯用的Ruby和惯用的Python的区别。如果您要从一种语言转到另一种语言,则需要进行调整。

关于python - Ruby 在 Python 中的 tap 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725214/

相关文章:

python - 使用 python 在文件中搜索变量并获取其值

python - 在 Python 中一次更改列表中的多个项目

ruby-on-rails - ruby on rails 聊天应用程序通过端口 80 托管站点不可知(无 flash 和 websockets)

ruby-on-rails - 捆绑安装时 Nokogiri 发生错误 (OSx Mavericks)

javascript - 有什么惯用的方法可以在 Python 中向对象添加方法吗?

r - dplyr 习语用于 summarize() 过滤分组依据,并且还替换由于缺少行而导致的任何 NA

java - 如何有效地对抽象列表进行嵌套迭代?

python - Bokeh 绘图 : Enable tooltips for only some glyphs

ruby-on-rails - 在 Parent 的节目中创建新的 Child

python - pandas - 多个 'yes/no' 虚拟变量