夏の怪異―Python3のクラス変数のスコープ

さて、今日Pythonを書いていたら、妙なエラーに遭遇した。同じ役割を持つ変数をまとめておくためにクラス定義を用いて以下のようなコードを書いた(このようなクラスの使い方は悪くはない)。

これを見ただけで「あっ…」となる人はすごい。なんとこのコードは以下のようなエラーを吐く。

原因究明に時間を要したが、説明しているブログがあった。

【python】クラス変数のスコープには注意が必要

python – Accessing class variables from a list comprehension in the class definition – Stack Overflow

要約すると、クラス変数の中にスコープがネストされた場合、クラス変数の定義されたスコープは読まないよ、ということを言っています。リスト内包表記はスコープを作るので、この問題が起こります。

PEP 227 — Statically Nested Scopes | Python.org

「それができるとメソッド定義で事故るだろーが、親切なpython様が対策してやってるんだよ」と書いてあります。

なるほど…。全然知らなかった。Pythonでは内側のスコープから外側のスコープを読めないということは原則的にはないので驚いた。

なお、本日書いたなかでぶっちぎりのクソコードはこれ。PythonとRubyはよくライバルみたいな扱いされるけど、こういうのを書いているとRuby使いたいと思う。でもPythonの方がライブラリが充実してるんだよなあ。

コメントを残す

メールアドレスが公開されることはありません。