Python.use(better, src=”PyPy”) #002: 関数 pycodegen.compile

中級篇

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

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

PyPy1.2 のリリースを機に、PyPy1.1 版を再構成したものです。
※ compiler の傘下にあるモジュールは、PyPy1.1.0 からの変更はありません。


関数 pycodegen.compile


関数 compile は、組み込み関数 compile に代わるものです。

$ cat compiler/pycodegen.py 
...
def compile(source, filename, mode, flags=None, dont_inherit=None):
    """Replacement for builtin compile() function"""
    if flags is not None or dont_inherit is not None:
        raise RuntimeError, "not implemented yet"

    if mode == "single":
        gen = Interactive(source, filename)
    elif mode == "exec":
        gen = Module(source, filename)
    elif mode == "eval":
        gen = Expression(source, filename)
    else:
        raise ValueError("compile() 3rd arg must be 'exec' or "
                         "'eval' or 'single'")
    gen.compile()
    return gen.code

引数 mode には、次の中から

  • single:単一の文(対話モード)
  • exec:モジュール
  • eval:任意の式

モードを指定すると、ソースコード source を構文解析して、バイトコード gen.code に変換します。

■ 運命の分かれ道(Interactive/Module/Expression)

gen からリターン値を得る前に、メソッド呼び出し compile() をしているので、その謎を解明するには、副作用を掘り起こす必要がありそうです。この先に続く道 Interactive/Module/Expression は、3つに分岐しています。そこで、簡単な式 Expression を選んで、旅を続けましょう。

《TIPS》交通標識が複雑だと:ここで、ちょっと道草を…。次の条件式は、

    if flags is not None or dont_inherit is not None:

組み込み関数 any を利用すると、

    if any((flags, dont_inherit)):

簡潔で見通しが良くなります。しかも、情報隠蔽の原則に沿って、手段 how(ルート:特定のオブジェクト None)に依存しないので、目的 what(ゴール)が明確になります。複雑な交通標識に目を奪われていると、思わぬ事故を招くものです。□

《NOTE》組み込み関数 exec:Python3.x では、組み込み関数 exec の第1引数に、このコードオブジェクトを指定できます。□

《NOTE》組み込み関数 compile

Python 3.1 (r31:73578, Jun 27 2009, 21:49:46) 
>>> help(compile)
Help on built-in function compile in module builtins:

compile(...)
    compile(source, filename, mode[, flags[, dont_inherit]]) -> code object
    
    Compile the source string (a Python module, statement or expression)
    into a code object that can be executed by exec() or eval().
    The filename will be used for run-time error messages.
    The mode must be 'exec' to compile a module, 'single' to compile a
    single (interactive) statement, or 'eval' to compile an expression.
    The flags argument, if present, controls which future statements influence
    the compilation of the code.
    The dont_inherit argument, if non-zero, stops the compilation inheriting
    the effects of any future statements in effect in the code calling
    compile; if absent or zero these statements do influence the compilation,
    in addition to any features explicitly specified.


TOP
》作業中です《


関連記事

Last updated♪2010/05/11