Skip to content

Northeastern-Electric-Racing/pyderive

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

319 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pyderive

Crates.io Version Crates.io MSRV GitHub Actions Workflow Status docs.rs Crates.io License

pyderive provides derive macros for Python spacial methods and a class attributes for PyO3.

// Enable `multiple-pymethods` feature of PyO3
use pyo3::prelude::*;
use pyderive::*;

// Place #[derive(PyNew, ...)] before #[pyclass]
#[derive(PyNew, PyMatchArgs, PyRepr, PyEq)]
#[pyclass(get_all)]
#[derive(PartialEq, Hash)]
struct MyClass {
    string: String,
    integer: i64,
    option: Option<String>
}
from rust_module import MyClass

# Derives __new__()
m = MyClass("a", 1, None)

# Derives __match_args__ (supports Pattern Matching by positional arguments)
match m:
    case MyClass(a, b, c):
        assert a == "a"
        assert b == 1
        assert c is None
    case _:
        raise AssertionError

# Derives __repr__(), calls Python repr() recursively
assert str(m) == "MyClass(string='a', integer=1, option=None)"
assert repr(m) == "MyClass(string='a', integer=1, option=None)"

# Derives __eq__() that depends on PartialEq trait
assert m == MyClass("a", 1, None)

This provides deriving following special methods and attributes;

Derive Macro Python Method/Attribute
PyNew __new__()
PyMatchArgs __match_args__
PyRepr __repr__()
PyStr __str__()
PyEq __eq__() and __ne__()
PyOrd __lt__(), __le__(), __gt__() and __ge__()
PyRichCmp ==, !=, >, >=, < and <= by __richcmp__()
PyIter __iter__()
PyReversed __reversed__()
PyLen __len__()
PyDataclassFields __dataclass_fields__
PyNumeric Numeric op methods (__add__() etc.)
PyBitwise Bitwise op methods (__and__() etc.)

The field attributes #[pyderive(..)] is used to customize the implementation, like dataclasses.field() of Python.

Module pyderive::ops and pyderive::convert provides derive macros that implement individual method that enumerating numeric type (__add__() etc.) and called by builtin functions (__int__() etc.).

It requires to enable multiple-pymethods feature of PyO3 because this may produce multiple #[pymethods].

It experimentally provides the derive macors implement methods that the namedtuple() generates

Derive Macro Python Method/Attribute
PyNamedTupleAsdict _asdict()
PyNamedTupleFieldDefaults _field_defaults
PyNamedTupleFields _fields
PyNamedTupleMake _make()
PyNamedTupleReplace _replace()

Feature

PyRepr and PyStr

The methods implemented by PyRepr and PyStr are recursively calls repr() or str() like a Python dataclass.

PyEq and PyOrd

The implementation of PyEq and PyOrd does not use __richcmp__().

License

MIT or Apache-2.0

About

Derive macro of Python special methods and a class attributes for PyO3

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Rust 100.0%