5

新しい CodeType を作成しようとしています。次のコードは Python 2.7 では問題なく実行されますが、Python 3.2 ではエラーが発生します。

def newCode(co_argcount = 0, co_nlocals = 0, co_stacksize = 0, co_flags = 0x0000,
            co_code = bytes(), co_consts = (), co_names = (), co_varnames = (),
            filename = "<string>", name = "", firstlineno = 0, co_lnotab = bytes(),
            co_freevars = (), co_cellvars = ()):
    """wrapper for CodeType so that we can remember the synatax"""
    print(type(co_stacksize))
    return types.CodeType(co_argcount, co_nlocals, co_stacksize,
                          co_flags, co_code, co_consts, co_names, co_varnames,
                          filename, name, firstlineno, co_lnotab, co_freevars, co_cellvars)

使用法:

return newCode(co_code = code, co_stacksize = size, co_consts = consts)

デバッグ行は、co_stacksize として int を送信していることを証明しています...これが機能しないようにするために Python 3 で何が変更されましたか?

編集:ここにエラーがあります(以前に忘れた理由がわかりません):

TypeError: 整数が必要です

4

1 に答える 1

4

Python 3 では、 の 2 番目の引数CodeTypeは、キーワードのみの引数の数ですco_kwonlyargcount。これは追加なので、以降の引数はすべて 1 桁ずつシフトされます。

コードオブジェクトをピクルできるユーティリティモジュールで、IPythonのコードベースからこれを掘り起こしました: https://github.com/ipython/ipython/blob/master/IPython/utils/codeutil.py#L32

于 2012-04-12T12:11:29.400 に答える