Pythonの列挙型に相当するクラスをpyo3 0.27で実現するには、Rustのenumを定義し、pyclass属性を付ける。
use pyo3::prelude::pyclass;
厳密には、Pythonの列挙型はEnumを継承したクラスとして定義するらしいが、PyO3ではEnumを継承する形にはならない。
(Pythonでisinstance(列挙型の値, Enum)を実行するとFalseになる)
use pyo3::prelude::*;
#[pyclass]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::upper_case_acronyms)]
pub enum Color {
RED,
GREEN,
BLUE,
}
Rustのコーディング規約では列挙子はCamelCaseだが、PythonではUPPER_CASE(定数扱い)らしいので、大文字で定義しておく方がよさそう。
use pyo3::prelude::*;
mod my_enum;
#[pymodule]
mod example_pyo3 {
use pyo3::prelude::*;
#[pymodule_export]
use crate::my_enum::Color;
}
from example_pyo3 import Color
value = Color.RED
print(value) # Color.RED
print(value == Color.RED) # True
print(value == Color.BLUE) # False