ブロックの役割
PythonにRuby風のブロックを追加したら良いんじゃないか、という記事がありました。
Ruby-style Blocks in Python
Pythonにブロックは必要ないんじゃないかと思います。
まず、blockには少なくとも以下の種類に分類できるように思えます。
- その場で何回も呼ばれるもの(Array.eachなど)
- その場で1回呼ばれるもの(File.openなど)
- 何時何回呼ばれるか分からないもの(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 には複数行にわたる文は書けません。
取り合えず、PythonにRubyのblockを追加すると、既存機能の被りまくるのでPythonicでは無いです。
「誰もが正しいと考える、たった1つがあるのが良い」というPythonなので。