Python.use(better, src=”PyPy”) #005: クラス pycodegen.AbstractCompileMode
|中級篇|
Python.use(better, src=”PyPy”) # ソースコードの歩き方《中級篇》
ソースコードの歩き方《PyPy1.2》
PyPy1.2 のリリースを機に、PyPy1.1 版を再構成しました。
※ compiler の傘下にあるモジュールは、PyPy1.1.0 からの変更はありません。
クラス pycodegen.AbstractCompileMode
■ 謎が謎を呼ぶ(コメント)
《承前》
$ cat compiler/pycodegen.py
...
class AbstractCompileMode:
...
mode = None # defined by subclass
ここで、= None とあるのは「伏せ字」のようでもあり、糊代のような可能性を秘めています。そこで、自分が属する組織(クラス Expression)では、どのように再設定されているか確認します。すると、自分の置かれている立場 "eval" が明らかになります。
《TIPS》None の意味(意義):None を親の遺言と見なすと、
class AbstractCompileMode: # 抽象クラス mode = "???"それを具象するのは子孫の責務になります。すると、次のように
class Expression(AbstractCompileMode): # 具象クラス mode = "eval" class Interactive(AbstractCompileMode): mode = "single" class Module(AbstractCompileMode): mode = "exec"状況を見て最適な解(how)を選択できる余地が残るので、動的な問題解決も視界に入ってきます。抽象クラスでは、特定の状況に依存しない抽象表現(what)が可能になるので、要求仕様の変更にも柔軟に対処できます。□
■ 言わぬが花(コメント)
確かに、コメントがあると意図は明確になります。しかし、
class AbstractCompileMode:
mode = None # Better leave it unsaid. (^x^)
「言わぬが花」との金言にもあるように、コメントにすると興醒めになるときには、その場の空気を読めない「KY」プログラマーの烙印を押されかねません。
■ 子孫に託す思い(抽象メソッド)
またひとつ、出生の秘密(クラス属性 mode の設定)が明らかになったので、
$ cat compiler/pycodegen.py ... class Expression(AbstractCompileMode): ... def compile(self): tree = self._get_tree() ...
子孫 self に託された未来(メソッド _get_tree)に思いを巡らせます。
《TIPS》self の意味(意義):self をそのインスタンス自身とだけ読み解くと、その将来を見誤ります。self には、自分の子孫に託す思い(家訓)が込められているので、その可能性は無限に広がります。□
$ cat compiler/pycodegen.py ... class AbstractCompileMode: ... def _get_tree(self): tree = parse(self.source, self.mode) misc.set_filename(self.filename, tree) syntax.check(tree) return tree
メソッド本体を読み解く鍵は、2つのインスタンス属性(self.source/self.filename)と、1つのクラス属性(self.mode)にあることが分かりました。すると、気になるのは、misc/syntax の存在です。その謎を解くには、このモジュールの冒頭付近を見渡す必要があります。すると、次のように
$ cat compiler/pycodegen.py ... from compiler import ast, parse, walk, syntax from compiler import pyassem, misc, future, symbols
同じパッケージ compiler 内にある、他のモジュール misc/syntax を紐解くと、そこに、関連するメソッド misc.set_filename/syntax.check があると分かります。これらは、親から託された思いや、その土地に伝わる風習にはない、異文化を導入するようなものです。
さて、この先に続く道も、3つ parse/set_filename/check に分かれています。他のモジュール misc/syntax の存在も気になるところですが、ここは同じモジュール pycodegen 内の parse に歩を進めましょう。
↑TOP
》作業中です《