JuliaPy / JuliaPy/PythonCall.jl

RFC for ergonomically passing Python variables to Julia

Open
#580 0 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Julia
Stars
1.1k
Forks
86
Avg merge
1d 22h
Merged PRs (30d)
3

Description

I propose one of the following two APIs as a way to more ergonomically pass Python variables to Julia code:

```python
jl.teval("const MY_CONST = $(x)", x=my_python_const)
```

a "template" eval, or

```python
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:

```python
jl.seval("x -> @eval const MY_CONST = $x")(my_python_const)
```

While Python's PEP 750 proposes [Template Strings](https://peps.python.org/pep-0750/) which could offer one solution:

```python
jl.seval(t"const MY_CONST = {my_python_const}")
```

We could implement something similar with a new `teval` method:

```python
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:

```python
jl.teval("const MY_CONST = $(x)", x=my_python_const)
```

The second approach uses a context manager for temporary variable binding:

```python
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

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.