Description
I propose one of the following two APIs as a way to more ergonomically pass Python variables to Julia code:
jl.teval("const MY_CONST = $(x)", x=my_python_const)
a "template" eval, or
with jl.let(x=my_python_const):
jl.seval("const MY_CONST = x")
which is a juliacall "let."
Would be interested in hearing other ideas too.
This is designed to address the following issue. Currently, passing Python objects to Julia via seval
requires creating closure functions:
jl.seval("x -> @eval const MY_CONST = $x")(my_python_const)
While Python's PEP 750 proposes Template Strings which could offer one solution:
jl.seval(t"const MY_CONST = {my_python_const}")
We could implement something similar with a new teval
method:
jl.teval("const MY_CONST = {my_python_const}")
However, this has two key issues:
- The
{}
syntax conflicts with Julia type signatures (e.g.,Vector{Float64}
), which could cause subtle bugs. Even if t-strings are eventually merged to Python, we would still face this issue! teval
wouldn't have access to local variables to referencemy_python_const
Let's look at the two proposed approaches in more detail:
The first approach makes variable passing explicit but ergonomic:
jl.teval("const MY_CONST = $(x)", x=my_python_const)
The second approach uses a context manager for temporary variable binding:
with jl.let(x=my_python_const):
jl.seval("const MY_CONST = x") # Would access the bound value
Basically the seval
would have access to this stack of Python objects passed via let
, and put them into the Julia context via a Julia-evaluated let
statement.
Going to post this on the Julia discourse too. Edit: https://discourse.julialang.org/t/rfc-for-ergonomically-passing-python-variables-to-julia/124266