2010年6月9日水曜日

RubyとPythonの可変長引数の決定的違い

ruby:
f(*a)
  a
end
と、

python:
f(*a):
    return a
では、動作に決定的な違いがある。
rubyでは、
f(*[1,2],3,*[4,5]) => [1,2,3,4,5]
のように、*arrayと他を組み合わせることができるけど、
pythonでは、
f(*[1,2],3,*[4,5]) => SyntaxError: only named arguments may follow *expression
と、エラーになってしまう。

pythonの場合、rubyのflattenに相当するものを作れば、以下のように回避できる
f(*flatten([[1,2],3,[4,5]]))

と、思っていたんだけど、もっと一般化した時に困る。
つまるところ、listと他の値を混在して、渡したい時に困る。

pythonの場合、そもそも、以下のように、配列を渡すようにするのが、現実的。
g([[1,2],1,[3,4],2])

0 コメント: