-
Couldn't load subscription status.
- Fork 78
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! tevalwouldn'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 valueBasically 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