the example of pymbolic interoperabiity with python ast described in the pymbolic documentation raises an exception under python 3.8.2.
$ python --version
Python 3.8.2
$ cat /tmp/interop_with_python_ast_from_pymbolic_doc.py
src = """
def f():
xx = 3*y + z * (12 if x < 13 else 13)
yy = f(x, y=y)
"""
import ast
mod = ast.parse(src.replace("\n ", "\n"))
print(ast.dump(mod))
from pymbolic.interop.ast import ASTToPymbolic
ast2p = ASTToPymbolic()
for f in mod.body:
if not isinstance(f, ast.FunctionDef):
continue
for stmt in f.body:
if not isinstance(stmt, ast.Assign):
continue
lhs, = stmt.targets
lhs = ast2p(lhs)
rhs = ast2p(stmt.value)
print(lhs, rhs)
$ python /tmp/interop_with_python_ast_from_pymbolic_doc.py
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Assign(targets=[Name(id='xx', ctx=Store())], value=BinOp(left=BinOp(left=Constant(value=3, kind=None), op=Mult(), right=Name(id='y', ctx=Load())), op=Add(), right=BinOp(left=Name(id='z', ctx=Load()), op=Mult(), right=IfExp(test=Compare(left=Name(id='x', ctx=Load()), ops=[Lt()], comparators=[Constant(value=13, kind=None)]), body=Constant(value=12, kind=None), orelse=Constant(value=13, kind=None)))), type_comment=None), Assign(targets=[Name(id='yy', ctx=Store())], value=Call(func=Name(id='f', ctx=Load()), args=[Name(id='x', ctx=Load())], keywords=[keyword(arg='y', value=Name(id='y', ctx=Load()))]), type_comment=None)], decorator_list=[], returns=None, type_comment=None)], type_ignores=[])
Traceback (most recent call last):
File "/tmp/interop_with_python_ast_from_pymbolic_doc.py", line 26, in <module>
rhs = ast2p(stmt.value)
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 66, in __call__
return self.rec(expr, *args, **kwargs)
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 80, in rec
return method(self, expr, *args, **kwargs)
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 136, in map_BinOp
return op_constructor(self.rec(expr.left), self.rec(expr.right))
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 80, in rec
return method(self, expr, *args, **kwargs)
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 136, in map_BinOp
return op_constructor(self.rec(expr.left), self.rec(expr.right))
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 82, in rec
return self.not_supported(expr)
File "/home/me/venv38/lib/python3.8/site-packages/pymbolic/interop/ast.py", line 85, in not_supported
raise NotImplementedError(
NotImplementedError: ASTToPymbolic does not know how to map type 'Constant'