Python.use(better, src=”PyPy”) #005: クラス pycodegen.AbstractCompileMode

中級篇

Python.use(better, src=”PyPy”) # ソースコードの歩き方《中級篇》
ソースコードの歩き方《PyPy1.2》

《著》小粒ちゃん@湘南組、小粒ちゃん@博多組《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2008/11/25 ● 第2版♪2010/04/29

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
》作業中です《


関連記事

Last updated♪2010/05/22