1

私は楽しみのために、python ベースの DSL を作成しています。現時点では、Python コードを直接実行する AST にテキストをコンパイルするだけです。つまり、次のように記述します。

a = int(read("input something: "))
b = a**2

これを次のようなツリーに変換します。

Program:
  VariableSet a:
    Call:
      VariableGet int
      Call:
        VariableGet read
        Literal("input something: ")
  VariableSet b:
    BinaryExpession **:
       VariableGet a
       Literal(2)

これらの各ノードは、次のようなコードで実行されます。

class VariableSet(object):
    def __init__(self, name, expr):
        self.name = name
        self.expr = expr

    def __call__(self, scope):
        value = self.expr(scope)
        scope.put(self.name, value)
        return value

それは非常にうまく機能します。一部の命令が例外をスローしたときに、例外スタックのトレースバックが python AST コードではなく DSL ソース コードを指すようにしたかったのです。今、私が見るのは次のとおりです。

Traceback (most recent call last):
  File "parser.py", line 164, in <module>
    parse(data)(scope)  
  File "/home/juanplopes/Projects/my-parser/ast.py", line 158, in __call__
    result = expr(scope)
  File "/home/juanplopes/Projects/my-parser/ast.py", line 63, in __call__
    value = self.expr(scope)
  File "/home/juanplopes/Projects/my-parser/ast.py", line 81, in __call__
    return self.method(scope)(*[arg(scope) for arg in self.args])
  File "/home/juanplopes/Projects/my-parser/ast.py", line 81, in __call__
    return self.method(scope)(*[arg(scope) for arg in self.args])
  File "parser.py", line 153, in read
    raise Exception('some exception')
Exception: some exception

Pythonでトレースバックが生成される方法をカスタマイズする方法はありますか?

4

1 に答える 1

3

はい、でもそうするのは醜いです。

でどのように行われるかjinja2を確認することをお勧めします。

Jinjaはテンプレートエンジンです。テンプレートエラーを指すようにトレースバックを処理します。
DSLエラーを指すように、これをコードに置き換えることができます。

于 2013-02-10T19:46:17.983 に答える