2009/05/19

pythonのsort()がselfを返さないとは

pythonでプログラムを書いていて、[].sort()の実装に少しはまりました。
selfを返してくると思ったんですができなくて、つまり次のようなコードが動くだろうと想定したところ失敗しました。

list01 = [0,1,2]
list02 = [2,1,0]
if list01.sort() == list02.sort(): print "success"
まぁこのコードは"success"を返すのですが、list02=[1,2,3]でも"success"が表示されます。
type(list02.sort())
<type 'NoneType'>
というわけで常に"None"同士を比較していたので、必ず"success"になってしまいます。

破壊的メソッドがselfを返すか、といわれれば微妙な感じはしますが、少なくともrubyはsort(), sort!()どちらもselfを返してくれるのでメソッドを続けて実行する事ができます。

自分でクラスを設計する時には、大抵は何か意味のある結果かNoneが戻ってしまうと思います。
何も返すものがなければselfかTrue or Falseぐらいを返すようにするのが良いと思うのですが、常にNone(==False)が返ってきやすい処理系というのはどうだろうか。

まぁ思想の違いなんでしょうけれど。

2 件のコメント:

匿名 さんのコメント...

お察しの通り思想の違いです。

> if list01.sort() == list02.sort(): print "success"

上記のようなコードは Pythonic ではない、ugly なものとみなされます。

YasuhiroABE さんのコメント...

”Pythonic"というキーワードは、これまで意識した事はありませんでした。

後からsorted()を使う方法も考えましたが、sorted()はif文よりは、手元のReference曰く"for item in sorted([list..])"のように使うのがPython流 (==Pythonic?)な方法のようですね。

オーダーは元々重要ではなかったので、元でsetオブジェクトを生成するようにするのが良さそうです。
ありがとうございました。