読者です 読者をやめる 読者になる 読者になる

ブロックの役割

PythonRuby風のブロックを追加したら良いんじゃないか、という記事がありました。
Ruby-style Blocks in Python

Pythonにブロックは必要ないんじゃないかと思います。
まず、blockには少なくとも以下の種類に分類できるように思えます。

  1. その場で何回も呼ばれるもの(Array.eachなど)
  2. その場で1回呼ばれるもの(File.openなど)
  3. 何時何回呼ばれるか分からないもの(Thread.new、Array.mapなど)


「その場で何回も呼ばれるもの」はいわゆる制御構造の部類です。

[1, 2, 3].each do |x|
    p x
end
# => 1 2 3

これは、Pythonではfor文が用意されていますから、blockは必要ありません。


「その場で1回呼ばれるもの」には、さらに2種類あります。
まず、File.openなど後処理をするための物です。

File.open("spam.txt") do |f|
   #ファイルの処理
end
# f.close()が自動的に呼ばれる。

Pythonにはwith文があるので、blockは要りません。

そして、tkのコンポーネントのように、オブジェクトの設定をするための物があります。

require 'tk'
TkLabel.new {
  text "Hello, World!"
  bg "green"
  pack
}

これは、キーワード引数をコンストラクタに渡すなどすればよいので、
blockは要りません。


「何時何回呼ばれるか分からないもの」は、無名関数のことです。

まず、リスト処理など高階関数で使われます。

ary = [1, 2, 3]
ary.map! {|i|
  i * 3
}
p ary   #=> [3, 6, 9]
}

Threadも使用例です。

t = Thread.new do
  p "hello!"    
end

Pythonではこの場合def文で名前つき関数を作って渡します。

blockの必要性について、議論の余地があるのはこの場合です。
Rubyは「無名関数もバンバン書いて良い、短く書けるほうが良い」という設計思想だと思いますが、
Pythonでは多少冗長でも明確・自然な方が好まれます(すごく冗長なのはダメですが)。

なお、Pythonでもlambdaで無名関数を作ることは出来ます。ただし、lambda には複数行にわたる文は書けません。


取り合えず、PythonRubyのblockを追加すると、既存機能の被りまくるのでPythonicでは無いです。
「誰もが正しいと考える、たった1つがあるのが良い」というPythonなので。