嫌い!

twitter 上で Python の += の挙動がキモイよねという話が一部で盛り上がっていた。
発端は多分このつぶやき

で、私はこれには大いに賛同する。
そう思う理由としては

  • += したら参照が書き換わるから副作用なんかないだろ
  • そもそも x += y は x = x + y と同じ意味だろ

という二つの感覚から来ていて、 += で副作用が発生するなんて全く思っていなかったという部分がある。
まあ実際は

  • x += y は x = x.__iadd__(y) の糖衣構文なので、 += したら参照を張り替えるし、副作用も起こりうる
  • __iadd__ が定義されていない場合は x = x + y と等価
  • 副作用を起こしているのは処理の効率化のため

ということらしいので、まあそういうもんかと納得しておくところである。

Python おじさんも以下のように言っているし

しかし、感覚としては

  • 副作用起こすくせに参照張り替える
  • 参照張り替えるくせに副作用起こる
  • 型で意味が変わるのはシンプルじゃなくね? simple is better than complex は?

というあたりで綺麗とは思えないし、気持ち悪いと思っている。

少なくとも

  • x += y を呼んだら x.__iadd__(y) を呼び出すだけで参照は変わらない。__iadd__ が実装されていなければ例外を投げる
  • x += y を x = x + y の糖衣構文のみとする

のどちらかであれば綺麗だなと思う。

結局は好みの問題であり、言語仕様に綺麗さを求める潔癖性とか「ぼくのかんがえたさいきょうのぱいそん」みたいな厨二的感覚だろうなと思うので、特に言うことはない。
現実の実装はそうじゃないしね。

まとめ

結局何が言いたいかというと、

  • self 明示大好きだし文法も割とセンス良いし全体的に一貫性があるし Python さん素敵!

という素敵一辺倒だったのが

というところが (super の引数省略も含め) 見つかって嬉しいなあということ。
好き好きだけじゃあだめなんですよ。嫌いなところも見えないとね!