PyO3 / PyO3/pyo3

Py::new and .into_py are inconsistent on complex enums

Open
#3,747 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
16.2k
Forks
1k
Avg merge
2d 6h
Merged PRs (30d)
66

Description

Py::new and .into_py are currently inconsistent.
Note how the constructed value in the example below is not an instance of the specific variant.
This is intended to be fixed before 0.21, see review comment here:
https://github.com/PyO3/pyo3/pull/3582/files#r1451402473

use pyo3::prelude::*;

#[pyclass]
enum MyEnum {
    Variant { i: i32 },
}

Python::with_gil(|py| {
    let x = Py::new(py, MyEnum::Variant { i: 42 }).unwrap();
    let cls = py.get_type::<MyEnum>();
    pyo3::py_run!(py, x cls, r#"
        assert isinstance(x, cls)
        assert not isinstance(x, cls.Variant)
    "#)
})

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Use the provided MyEnum example as the reproducer; compare the behavior of Py::new and .into_py for the enum variant, and read the linked review comment for the intended pre-0.21 behavior. Done means the constructed value matches the expected isinstance relationships in the example.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, rust
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.