Skip to content

RFC for ergonomically passing Python variables to Julia #580

Open
@MilesCranmer

Description

@MilesCranmer

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:

  1. 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!
  2. teval wouldn't have access to local variables to reference my_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.

Thoughts? @cjdoris @mkitti

Going to post this on the Julia discourse too. Edit: https://discourse.julialang.org/t/rfc-for-ergonomically-passing-python-variables-to-julia/124266

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions