2011-07-21 3 views
6

コード使用している場合、セグメンテーションフォールトを取得:はCPythonとPyPyの両方でPythonは:/ evalのコンパイル

import ast 

globalsDict = {} 

fAst = ast.FunctionDef(
    name="foo", 
    args=ast.arguments(args=[], vararg=None, kwarg=None, defaults=[]), 
    body=[], decorator_list=[]) 

exprAst = ast.Interactive(body=[fAst]) 
ast.fix_missing_locations(exprAst) 
compiled = compile(exprAst, "<foo>", "single") 
eval(compiled, globalsDict, globalsDict) 

print globalsDict["foo"] 

を、私はセグメンテーションフォールトを取得しています。どうして?


答えて

5

私はあなたの関数定義は空のボディを持っていなければならないことを推測します。私は関数本体としてno-op文を追加してコードをテストしました:

fAst = ast.FunctionDef(
    # ... 
    body=[ast.Pass()], 
    # ... 

そして、セグメンテーションフォルトはなくなりました。出力は次のとおりです。

<function foo at 0x022DB3F0>

私が正しいだ場合は、空のボディをチェックする必要があるため、これは、astモジュールのバグである可能性があります。

+1

関数の本体に 'pass'を入れずに空の関数を定義すると、Pythonは構文エラーを返します。 – JAB

+1

です。それはセグメンテーションしません。 –

+1

これは、現在のところASTは検証されていないため、このような問題を避けるためにコンパイルしようとすると、ASTにバリデーターを追加するオープンチケットがCPythonにあります。 –