NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #437 most downloaded on crates.io
Build configuration for the PyO3 ecosystem
Last release 7 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
66 releases · first in 2021
One column per quarter.
This release is a series of fixes worth landing to the PyO3 0.29 series; the PyO3 0.30 release is planned to follow within a few weeks, however during
This release is a series of fixes worth landing to the PyO3 0.29 series; the PyO3 0.30 release is planned to follow within a few weeks, however during the development cycle a number of rough edges were discovered which were deemed worth a backport.
The patch broadly includes:
raw-dylib linking for Windows introduced in PyO3 0.29.1 (the switch to raw-dylib linking was introduced in PyO3 0.29.0),experimental-inspect type stub generation (expect more improvements in 0.30), andFor a full list of the exact fixes please consult the CHANGELOG.
Thank you to the following contributors for the improvements:
@adamgerhant-ai
@alex
@bschoenmaeckers
@charliermarsh
@chirizxc
@davidhewitt
@dependabot[bot]
@dylanpulver
@exg
@FranciscoTGouveia
@JMak-Security
@jonasdedden
@jorenham
@konstin
@latent-9
@mejrs
@ngoldbaum
@Person-93
@PeterFaiman
@sneakers-the-rat
PyModule_GetState_DuringGC, PyModule_GetToken_DuringGC, PyObject_GetTypeData_DuringGC, PyType_GetModuleState_DuringGC, PyType_GetBaseByToken_DuringGC, PyType_GetModule_DuringGC, and PyType_GetModuleByToken_DuringGC for Python 3.15 and up. #6419u128/i128 conversions on Python 3.15+. #6160set and frozenset values into Rust hash sets. #6225PyBytes::as_bytes() when not using abi3 or abi3t. #6377PyExc_RecursionErrorInst and Py_UseClassExceptionsFlag (not present in supported Python versions). #6421_PyFrameEvalFunction, _PyInterpreterState_GetEvalFrameFunc and _PyInterpreterState_SetEvalFrameFunc, which are not currently treated as CPython private API despite their name. #6195PyUnstable_Eval_RequestCodeExtraIndex FFI binding to link to the private CPython symbol on Python versions before 3.12. #6195PyByteArray_GET_SIZE, PyList_GET_SIZE, and PySet_GET_SIZE to use an atomic load for free-threaded Python. #6230experimental-inspect: deduplicate repeated members of a type union in the generated stubs, and put a space on both sides of the | rather than only before it. #6273experimental-inspect: __next__ and __anext__ returning Option<T> (or PyResult<Option<T>>) are now introspected as returning T, since None stops the iteration instead of being yielded. #6274clippy::clone_on_copy warnings triggered on nightly Rust by #[pyclass(from_py_object)] on classes which implement Copy. #6309experimental-inspect: __pow__, __rpow__ and __get__ now introspect their trailing argument as defaulting to None, matching the CPython slot wrappers which substitute None when it is omitted. #6363experimental-inspect: fix the stubs of a package nested inside another package being written into a directory named after its parent instead of its own name. #6365pyo3-ffi. #6389tuple[] instead of tuple[()] in generated stubs and PyStaticExpr display. #6393experimental-inspect: escape stub docstrings to prevent invalid Python syntax. #6394experimental-inspect: fix the generated type annotation for PyBuffer on python <3.12 by using typing_extensions.Buffer instead of collections.abc.Buffer. #6395Display for PyStaticExpr. #6397raw-dylib linking is disabled. #6410raw-dylib linking is disabled. #6410PyVectorcall_Call failing to link on Python 3.11 and older. #6410pyo3-ffi. #6421#[pyclass] type object during class attribute initialization. #6453This patch fixes a regression in PyO3 0.29.1 which broke PyPy 3.11 compatibility ( #[pyclass] types would crash PyPy on instance deletion).
This patch fixes a regression in PyO3 0.29.1 which broke PyPy 3.11 compatibility (#[pyclass] types would crash PyPy on instance deletion).
A few further fixes have also landed with similar themes to PyO3 0.29.1: fixes to minor reference counting bugs, rough edges which would cause crashes, issues which would cause failed builds, and fixes to experimental-inspect type stub generation.
For a full list of the exact fixes please consult the CHANGELOG.
Thank you to the following contributors for the improvements:
@davidhewitt
@dependabot[bot]
@ImFeH2
@musicinmybrain
@Tpt
@WaterWhisperer
PYO3_USE_RAW_DYLIB=0 opt-out of raw-dylib linking for Windows. #6185#[pyo3(get)]) when IntoPyObject is only implemented on references of the field type. #6276#[classmethod] magic methods receiving the instance instead of its type when invoked through a type slot. #6283pyo3_build_config::add_libpython_rpath_link_args emitting Unix-style rpath linker arguments on Windows and Cygwin. #6284#[pyclass] instances. #6294#[pyclass] docstrings. #6296#[classattr] values created from fn items. #6297This patch is a stack of fixes for PyO3 0.29. Particular themes include:
This patch is a stack of fixes for PyO3 0.29. Particular themes include:
#[pyclass] implementation internalsexperimental-inspect type stub machineryFor a full list of the fixes in these above themes and more, please consult the CHANGELOG.
Thank you to the following contributors for the improvements:
@alex
@bschoenmaeckers
@chirizxc
@davidhewitt
@dependabot[bot]
@exg
@ImFeH2
@IvanIsCoding
@jonasdedden
@MatthieuDartiailh
@msimacek
@ngoldbaum
@Person-93
@ratazzi
@rewitt94
@scott-griffiths
@ShiroKSH
@tobni
@Tpt
@WaterWhisperer
Py_TYPE in the unlimited API on 3.14+ #6179PyObject_GET_WEAKREFS_LISTPTR and PyHeapType_GET_MEMBERS. #6145nightly feature on PyPy and GraalPy due to !Ungil implementations for FFI types not available on those platforms. #6146append_to_inittab and PyInit_<module> internal module definition corruption on 32-bit and big-endian platforms on Python 3.15+. #6150PyClassGuardMutSuper::as_super being scoped to the full guard lifetime, now the &mut borrow of the as_super() call. #6181abi3t-py3* feature is enabled and the configuration comes from PYO3_CONFIG_FILE, sysconfigdata or cross-compilation defaults. #6192#[pyclass(dict)] instances with a populated __dict__. #6198#[pyclass]'s GC traversal when the traversal is stopped early. #6206__dict__ of a #[pyclass(dict)] never being collected. #6206#[pyclass] type objects held by their instances on instance deallocation. #6224PyByteArray_GET_SIZE, PyList_GET_SIZE, and PySet_GET_SIZE to use an atomic load for free-threaded Python. #6230#[pyclass(dict)] class leaked one empty dict per instance. #6234experimental-inspect type stubs to emit the arguments of many magic methods as positional-only to match runtime behavior, rather than positional-or-keyword. #6239experimental-inspect type stubs to emit the Python name rather than the Rust name for #[pyfunction(name = "...")]. #6254experimental-inspect generating invalid internal JSON when #[pymodule] members are gated by #[cfg]. #6255__inplace_concat__ and __inplace_repeat__ overriding __concat__ and __repeat__ when both were defined. #6260time::Duration values to return OverflowError instead of panicking. #6266experimental-inspect type stubs padding blank lines inside indented docstrings. #6270In particular, PyO3 0.29 fixes two security vulnerabilities we will be releasing to the RustSec Advisory Database imminently:
This release is a relatively large release with improvements across many areas of PyO3's API.
This release brings full support for Python 3.15 beta. We encourage downstream projects to begin testing and distributing Python 3.15 beta wheels so that the ecosystem can prepare for the 3.15 final release later in the year.
Alongside Python 3.15 support comes support for its new "abi3t" stable ABI which supports both free-threaded and gil-enabled Python builds. For projects distributing stable ABI wheels, we recommend distributing (for each OS/architecture) an abi3 wheel built for your minimum supported Python version, a 3.14t version-specific wheel for free-threaded Python 3.14, and an abi3t wheel to support Python 3.15 (and future versions).
Support for Python 3.7 has been dropped. Support for Python 3.13t, the first experimental free-threaded release of CPython, has also been dropped. 3.14t (and soon 3.15t) is more stable, performant, and the starting point for CPython's own declaration of "support" for the free-threaded build.
The PyO3 build process (via the pyo3-build-config crate) has been adjusted to reduce the cost of rebuilds when the environment used to detect the Python interpreter changes; pyo3-build-config and pyo3-macros will no longer be rebuilt in such cases (although pyo3-ffi and crates downstream of it still will be rebuilt). As a consequence the pyo3_build_config APIs now require crates to have a direct dependency on pyo3 or pyo3-ffi. We hope to continue to reduce rebuild frequency and cost in a future PyO3 release.
With the recent boom in AI-assisted security scanning, PyO3 has inevitably had several correctness issues exposed by AI-assisted scanning.
In particular, PyO3 0.29 fixes two security vulnerabilities we will be releasing to the RustSec Advisory Database imminently:
Sync bound on PyCFunction::new_closure closuresBoundTupleIterator::nth_back and BoundListIterator::nth_backAny code using the above APIs is advised to update as soon as possible.
This release also contains several other minor breaking changes to close soundness holes uncovered by AI-assisted scanning. Our assessment as maintainers was that, excluding the two vulnerability cases listed above, these correctness issues would likely have crashed immediately upon user testing rather than leading to attacker-exploitable pathways. We nevertheless wanted to see them closed without the usual deprecation cycle. These cases are noted in the migration guide.
New in this release is a CLI in pyo3-introspection to generate type stubs along with the experimental-inspect feature. Downstream, maturin has also gained support to generate type stubs using the feature. The feature is reaching a point where substantial amount of type stubs can be generated automatically. We would like to encourage users to begin using this feature and helping us find what functionality is missing, with a hope we can declare its API stable given sufficient feedback.
A substantial amount of effort has been invested in pyo3-ffi as part of the process of extending it with 3.15's new APIs. There have been many missing APIs from older Python versions added. There have also been a number of fixes to incorrect definitions (these are breaking changes, but also necessary for correctness); we hope there will be far fewer such cases in the future due to more comprehensive checking added to PyO3's CI. Finally, many private CPython APIs (those with _Py underscore-named prefix) have been removed from pyo3-ffi's public API.
There are also many other incremental improvements, bug fixes and smaller features; full detail can be found in the CHANGELOG.
Please consult the migration guide for help upgrading.
Thank you to everyone who contributed code, documentation, design ideas, bug reports, and feedback. The following contributors' commits are included in this release:
@Alc-Alc
@alex
@anuraaga
@BD103
@bschoenmaeckers
@Cheukting
@chirizxc
@ChristopherRabotin
@clin1234
@codeguru42
@davidhewitt
@dependabot[bot]
@Embers-of-the-Fire
@funsafemath
@Harikeshav-R
@hoodmane
@Icxolu
@IntrepidT
@jelmer
@luxedo
@MatthieuDartiailh
@maurosilber
@mejrs
@messense
@ngoldbaum
@Person-93
@quyentonndbs
@rara64
@staticintlucas
@tbates-redarc
@tdyas
@Tpt
@winstxnhdw
abi3t and abi3t-py315 features. #5807pyo3-macros-backend no longer depends on pyo3-build-config. #5809hashbrown optional dependency to include version 0.17. #5973pyo3-ffi is now no_std. #6022PyErr::set_traceback to set the traceback of an exception object. #5349PyUnicodeDecodeError::new_err_from_utf8 to create a PyErr from a str::Utf8Error. #5668experimental-inspect: implement INPUT_TYPE and OUTPUT_TYPE on optional third-party crate conversions. #5770experimental-inspect: include doc comments in generated stubs. #5782pyo3_build_config::PythonAbi, pyo3_build_config::PythonAbiKind, pyo3_build_config::PythonAbiBuilder, pyo3_build_config::InterpreterConfig::target_abi, and pyo3_build_config::InterpreterConfigBuilder::target_abi. #5807Borrowed::get as an equivalent to Bound::get and Py::get. #5849PyFrame::new, PyTraceBack::new, and PyFrameMethods::line_number. #5857PyUntypedBuffer::obj to retrieve the Python object owning the buffer. #5870PyCapsule::new_with_value and PyCapsule::new_with_value_and_destructor. #5881PyErr::set_context and PyErr::context. #5887pyo3-introspection to generate stubs. #5904Python::version_str. #5921TryFrom<&Bound<T>> for PyRef<T>, PyRefMut<T>, PyClassGuard<T> and PyClassGuardMut<T>. #5922From<&Bound<T>> for Bound<T> and Py<T> #5922PyDictMethods::set_default and PyDictMethods::set_default_ref to allow atomically setting default values in a PyDict. #5955PyFrameMethods::outer|code|var|builtins|globals|locals. #5967From conversions for PyErr from std::time::TryFromFloatSecsError, std::time::SystemTimeError, std::path::StripPrefixError, std::env::JoinPathsError, std::char::ParseCharError, and std::char::CharTryFromError. #6001pyo3_build_config::InterpreterConfigBuilder. #6034PyCapsule::import_pointer #6066PyClassGuardMapMut. #6073PyListMethods::get_item_unchecked, PyTupleMethods::get_item_unchecked, and PyTupleMethods::get_borrowed_item_unchecked on abi3. #6075PyClassGuardMapSuper. #6104PyClassGuard and PyClassGuardMut to pyo3::prelude. #6112Debug impls for PyClassGuard and PyClassGuardMut. #6112PyDateTime, PyDate, PyTime, PyDelta and PyTzInfo on abi3 with python 3.12+. #6115PyFunction available on abi3. #6117PyUnstable_Object_IsUniquelyReferenced, PyUnstable_Object_IsUniquelyReferencedTemporary, PyUnstable_EnableTryIncref, and PyUnstable_TryIncref. #5828ffi::PyErr_GetHandledException and ffi::PyErr_SetHandledException. #5887Py_HASH_SIPHASH13. #5891PyStructSequence_UnnamedField constant on Python 3.9 and up (or 3.11 with abi3 features). #5892PyUnstable_InterpreterFrame_GetCode, PyUnstable_InterpreterFrame_GetLasti, PyUnstable_InterpreterFrame_GetLine, and PyUnstable_ExecutableKinds. #5932PyMarshal_WriteLongToFile, PyMarshal_WriteObjectToFile, PyMarshal_ReadLongFromFile, PyMarshal_ReadShortFromFile, PyMarshal_ReadObjectFromFile, and PyMarshal_ReadLastObjectFromFile. #5934PyObject_GetAIter, PyAIter_Check, PyMapping_HasKeyWithError, PyMapping_HasKeyStringWithError, PyMapping_GetOptionalItem, PyMapping_GetOptionalItemString, PySequence_ITEM, PySequence_Fast_GET_SIZE, PySequence_Fast_GET_ITEM, and PySequence_Fast_ITEMS. #5942compat::PyObject_HasAttrWithError. #5944PyDict_SetDefault, PyDict_SetDefaultRef, PyDict_ContainsString, PyDict_Pop, PyDict_PopString, PyDict_ClearWatcher, PyDict_Watch, PyDict_Unwatch, and PyFrozenDict_New. #5947PyDate_FromDate, PyDateTime_FromDateAndTime, PyDateTime_FromDateAndTimeAndFold, PyTime_FromTime, PyTime_FromTimeAndFold, and PyDelta_FromDSU. #5949PyDict_SetDefaultRef and compat::PyDict_SetDefaultRef. #5955
versions.cpython/bytearrayobject.h. #5966PyCellObject and associated functions. #5978PyErr_WarnExplicitObject. #5979PyTracebackObject. #5980PyTuple_FromArray on 3.15+. #5990PyLong import / export API on Python 3.14+. #6016PyEval_SetProfileAllThreads and PyEval_SetTraceAllThreads. #6038Py_UNICODE_TODECIMAL. #6041#[pyfunction] argument extraction error to use PyErr::add_note instead of replacing TypeError instances. #5349Py<T>::get_refcnt and PyAnyMethods::get_refcnt in favor of pyo3::ffi::Py_REFCNT(obj.as_ptr()). #5797PyEnvironmentError, PyIOError, and PyWindowsError to be type aliases of PyOSError (as is the case in Python since 3.3). #5803pyo3_build_config::InterpreterConfig::from_interpreter to require an additional stable_abi_version argument. The old behavior is the same as passing None. #5807PyList::new to no longer have ExactSizeIterator bound. #5830experimental-inspect: emit #[classattribute] as plain Python class attributes and not functions annotated with @classattribute and @property. #5839experimental-inspect: use object as the input annotation type of magic methods that return NonImplemented if the input value is not of the correct type. #5841pyo3-build-config/resolve-config feature. #5862pyo3-ffi to use raw-dylib for Windows linking. #5866generate-import-lib feature. #5866PyCapsule::new. #5889PyDate::from_timestamp argument is now a f64 (the Python API expects a float and not an integer) #5896experimental-inspect: Change PathBuf::extract input type hint from str | os.PathLike to str | os.PathLike[str] #5897PythonVersionInfo. #5921self. #5930PyAnyMethods::call, PyAnyMethods::call1 and PyAnyMethods::call_method1 for arguments passed as Rust tuples containing borrowed references to Python objects. #5941#[pyo3(signature = ...)] when experimental-inspect feature is not enabled (they will be ignored). #5999pyo3-ffi will now rebuild when the Python virtual environment changes in-place. #6008pyo3_build_config::InterpreterConfig fields; getter methods have been added as replacements. #6034_PyCode_GetExtra, _PyCode_SetExtra, and _PyEval_RequestCodeExtraIndex have been updated to PyUnstable_Code_GetExtra, PyUnstable_Code_SetExtra, and PyUnstable_Eval_RequestCodeExtraIndex. #6038PyCapsule::import to return an error if the pointer is not properly aligned. #6066PyClassGuardMap to be only for PyClassGuard::map and return PyClassGuardMapMut from PyClassGuardMut::map. #6073with_critical_section_mutex2 closure to take Option<EnteredCriticalSection> instead of EnteredCriticalSection as the second argument. #6098PyClassGuardMut::as_super now returns PyClassGuardMutSuper. #6104experimental-inspect: Generate relative imports instead of absolute ones (useful if the stubs are not describing a root package) #6097From<str::Utf8Error>, From<string::FromUtf16Error>, and From<char::DecodeUtf16Error> for PyErr. #5668Py_TRACE_REFS support (unsupported from Python 3.13). #5824experimental-inspect: Remove the TypeInfo enum and the FromPyObject::type_input and IntoPyObject::type_output functions. They are replaced by the PyStaticExpr enum and the FromPyObject::INPUT_TYPE and the IntoPyObject::OUTPUT_TYPE associated constants. #5893_PyStack_AsDict, _PyObject_CallNoArg, _PyObject_FastCall, _PyObject_FastCallTstate. _PyObject_VectorcallTstate, _PyObject_MakeTpCall, _Py_CheckFunctionResult, _PyObject_CallFunction_SizeT, _PyObject_CallMethod_SizeT, and _PySequence_IterSearch. #5942PY_ITERSEARCH_COUNT, PY_ITERSEARCH_INDEX, and PY_ITERSEARCH_CONTAINS. #5942_PySet_NextEntry, and _PyLong_NumBits. #5946_PyFloat_CAST, _PyRun_SimpleFileObject, _PyRun_AnyFileObject, _PyRun_InteractiveLoopObject, _PyUnicode_CheckConsistency, _PyUnicode_COMPACT_DATA, _PyUnicode_NONCOMPACT_DATA, _PyUnicode_Ready, and _Py_HashBytes. #6036_PyEval_EvalFrameDefault. #6038_PyBytes_Resize. #6042_PyErr_BadInternalCall, _Py_GetAllocatedBlocks, _PyObject_GC_Malloc, _PyObject_GC_Calloc, and _PyLong_NumBits. #6053Default for FFI definitions PyHeapTypeObject, PyObjectArenaAllocator, PyHash_FuncDef, and PyType_Spec. #6093add_libpython_rpath_link_args emitting rpath link args on wasm targets which don't support rpath. #5447From<string::FromUtf8Error> and From<ffi::IntoStringError> for PyErr producing TypeError due to broken internals. #5668PyMappingProxy::is_type_of and PyWeakrefReference::is_type_of not accepting subclasses. #5883getattr_opt not treating AttributeError subclasses as missing attributes on Python < 3.13. #5985#[new] return types that contain named lifetimes. #5998'static bound on PyCapsule destructors. #6049PyFrame::builtins could return a non-dict object. #6052#[pyclass] from a different pyclass' #[new] method. #6062PyClassGuardMap by splitting off the mutable variant. #6073experimental-inspect proc macros (to enable reproducible builds). #6076PyEval_RestoreThread when the interpreter is shutting down on Python 3.13 and older (hang the thread instead of allowing pthread_exit to jump across Rust frames). #6085BoundListIterator and BoundTupleIterator's nth and nth_back implementations. #6086BoundListIterator and BoundTupleIterator not being exhausted when nth or nth_back is called with N larger than the remaining count of items. #6086Sync bound on closure type in PyCFunction::new_closure. #6096PyClassGuardMut::as_super by moving into PyClassGuardMutSuper. #6104PyTypeObject.tp_versions_used on Python 3.13 and newer. #5917PyUnicode_Encode, PyUnicode_EncodeASCII, PyUnicode_EncodeCharmap, PyUnicode_EncodeDecimal, PyUnicode_EncodeLatin1, PyUnicode_EncodeRawUnicodeEscape, PyUnicode_EncodeUTF7, PyUnicode_EncodeUTF8, PyUnicode_EncodeUTF16, PyUnicode_EncodeUTF32, PyUnicode_EncodeUnicodeEscape, PyUnicode_TransformDecimalToASCII, and PyUnicode_TranslateCharmap. #6041PyUnicode_ClearFreeList no longer available on 3.9 and up. #6041PyErr_SetInterruptEx missing c_int return type. #6043PyBuffer_SizeFromFormat on Python 3.8 (was changed from c_int to Py_ssize_t on Python 3.9). #6090PyUnicode_Tailmatch on PyPy (is c_int, unlike CPython). #6090This patch contains several fixes for stability of the PyO3 0.28.x series:
This patch contains several fixes for stability of the PyO3 0.28.x series:
Python::attach and Python::try_attach will no longer return before the thread initializing the interpreter has finished runnning site.py when using the auto-initialize feature.PyBytesWriter::write_vectored when targeting the Python 3.15 prerelease interpreter..into_pyobject() implementation for C-like #[pyclass] enums.A couple of edge cases causing compile failures were also fixed.
Thank you to the following contributors for the improvements:
@alex
@bschoenmaeckers
@chirizxc
@davidhewitt
@Embers-of-the-Fire
@Icxolu
@maurosilber
@ngoldbaum
#[pyclass(get_all)] on a type named Probe. #5837_Py_NegativeRefcount with Python < 3.12. #5847Python::attach or try_attach could return before site.py had finished running. #5903PyBytesWriter::write_vectored with Python 3.15 prerelease versions. #5907.into_pyobject() implementation for C-like #[pyclass] enums. #5928This patch release contains a soundness fix for subclassing native types such as PyList with the abi3 feature enabled when targeting a minimum version
This patch release contains a soundness fix for subclassing native types such as PyList with the abi3 feature enabled when targeting a minimum version of Python 3.12 or higher. (Support for doing such subclassing was newly added in PyO3 0.28.0.)
PyO3 0.28.0 and 0.28.1 will be yanked.
This release also contains a correction to the FFI definition PyType_GetTypeDataSize and incorrectly-generated __qualname__ on #[pyclass] enum variant types when using #[pyo3(name = "...")] option to rename the enum and/or variant.
Thank you to the following contributors for the improvements:
This patch contains a number of minor compile-time fixes for PyO3 0.28.0.
This patch contains a number of minor compile-time fixes for PyO3 0.28.0.
Thank you to the following contributors for the improvements:
*args / **kwargs support in experimental-async feature (regressed in 0.28.0). #5771clippy::declare_interior_mutable_const warning inside #[pyclass] generated code on enums. #5772ambiguous_associated_items compilation error when deriving FromPyObject or using #[pyclass(from_py_object)] macro on enums with Error variant. #5784__qualname__ for complex #[pyclass] enum variants to include the enum name. #5796std::sync::atomic::Ordering import for targets without atomic64. #5808This release contains many improvements across PyO3's feature set:
This release contains many improvements across PyO3's feature set:
__init__ methods for #[pyclass] types#[deleter]s to complement the existing #[getter] and #[setter] attributes when implementing class "properties".abi3 feature (requires Python 3.12+).#[pyclass(new = "from_fields")] option to automatically define the constructor from the class fields.experimental-inspect feature's functionality.The minimum supported Rust version has been increased to Rust 1.83.
This release also switches #[pymodule] to use PEP 489 multi-phase initialization internally. This should have no immediate functional impact other than preparing PyO3 to support newer technologies such as Python subinterpreters.
There are also many other incremental improvements, bug fixes and smaller features; full detail can be found in the CHANGELOG.
Please consult the migration guide for help upgrading.
Thank you to everyone who contributed code, documentation, design ideas, bug reports, and feedback. The following contributors' commits are included in this release:
@ABorgna
@ahlinc
@alex
@altendky
@bazaah
@bschoenmaeckers
@chirizxc
@clin1234
@davidhewitt
@dependabot[bot]
@freakboy3742
@henryp3278
@Icxolu
@lazka
@LilyFirefly
@linkmauve
@lmmx
@lukaslueg
@MatthieuDartiailh
@MusicalNinjaDad
@ngoldbaum
@pkalivas
@reaperhulk
@RedKinda
@SilasMarvin
@SoroushMoosapour
@stijndcl
@tpoliaw
@Tpt
quote version to 1.0.37. #5531memoffset dependency. #5545target-lexicon dependency to 0.13.3. #5571indoc and unindent dependencies. #5608__init__ support in #[pymethods]. #4951PySuper on PyPy, GraalPy and ABI3 #4951PyString::from_fmt and py_format! macro. #5199#[pyclass(new = "from_fields")] option. #5421pyo3::buffer::PyUntypedBuffer, a type-erased form of PyBuffer<T>. #5458PyBytes::new_with_writer #5517PyClass::NAME. #5579pyo3_build_config::add_libpython_rpath_link_args. #5624PyBackedStr::clone_ref and PyBackedBytes::clone_ref methods. #5654PyCapsule::new_with_pointer and PyCapsule::new_with_pointer_and_destructor for creating capsules with raw pointers. #5689#[deleter] attribute to implement property deleters in #[methods]. #5699IntoPyObject and FromPyObject implementations for uuid::NonNilUuid. #5707PyBackedStr::as_str and PyBackedStr::as_py_str methods. #5723PyDict, exceptions, ...) when building for abi3 on Python 3.12+. #5733PyList when building for Python 3.12+. #5734PyEval_GetFrameBuiltins, PyEval_GetFrameGlobals and PyEval_GetFrameLocals on Python 3.13 and up. #5590PyObject_New, PyObject_NewVar, PyObject_GC_Resize, PyObject_GC_New, and PyObject_GC_NewVar. #5591Py_BEGIN_CRITICAL_SECTION_MUTEX and Py_BEGIN_CRITICAL_SECTION_MUTEX2. #5642PyDict_GetItemStringRef on Python 3.13 and up. #5659PyIter_NextItem on Python 3.14 and up, and compat::PyIter_NextItem for older versions. #5661PyThreadState_GetInterpreter and PyThreadState_GetID on Python 3.9+, PyThreadState_EnterTracing and PyThreadState_LeaveTracing on Python 3.11+, PyThreadState_GetUnchecked on Python 3.13+, and compat::PyThreadState_GetUnchecked. #5711PyImport_ImportModuleAttr and PyImport_ImportModuleAttrString on Python 3.14+. #5737PyABIInfo and PyModExport APIs available in Python 3.15. #5746experimental-inspect:
sys.unraisablehook instead of PyErr_Print if panicking on null FFI pointer in Bound, Borrowed and Py constructors. #5496#[pymodule]. #5525FromPyObject for #[pyclass]. #5550PyTypeInfo::NAME and PyTypeInfo::MODULE. #5579Py<T>::from_{owned,borrowed}[or_{err,opt}] constructors from raw pointer. #5585PyEval_AcquireLock and PyEval_ReleaseLock. #5590'py: 'a bound in Py::extract. #5594T: PyTypeCheck bound to the IntoPyObject implementations on Bound<T>, Borrowed<T> and Py<T>. #5640with_critical_section and with_critical_section2 functions are moved to pyo3::sync::critical_section. #5642PyIter_NextItem in PyIterator::next implementation. #5661IntoPyObject for simple enums now uses a singleton value, allowing identity (python is) comparisons. #5665Sequence[int] in FromPyObject on Cow<[u8]> and change the error type to PyErr. #5667async pymethods now borrow self only for the duration of awaiting the future, not the entire method call. #5684CastError formatted message to directly describe the "is not an instance of" failure condition. #5693#[inline] hints to many methods on PyBackedStr. #5723BoundSetIterator and BoundFrozenSetIterator. #5725PyIterator::size_hint on abi3 builds (previously was only on unlimited API builds). #5727PyImport_ImportModuleNoBlock (deprecated in Python 3.13). #5737#[new] can now return arbitrary Python objects. #5739experimental-inspect:
TypeHint and make use of it to encode type hint annotations. #5438PyType{Info,Check}::TYPE_INFO into PyType{Info,Check}::TYPE_HINT. #5438 #5619 #5641_typeshed.Incomplete instead of typing.Any as default type hint, to make it easier to spot incomplete trait implementations. #5744PyEval_GetCallStats (removed from CPython in Python 3.7). #5590PyEval_AcquireLock and PyEval_ReleaseLock on Python 3.13 and up. #5590_PyObject_New, _PyObject_NewVar, _PyObject_GC_Resize, _PyObject_GC_New, and _PyObject_GC_NewVar. #5591_PyDict_SetItem_KnownHash, _PyDict_Next, _PyDict_NewPresized, _PyDict_Contains_KnownHash, and _PyDict_Contains. #5659_PyFrameEvalFunction, _PyInterpreterState_GetEvalFrameFunc and _PyInterpreterState_SetEvalFrameFunc. #5711_PyImport_IsInitialized, _PyImport_SetModule, _PyImport_SetModuleString, _PyImport_AcquireLock, _PyImport_ReleaseLock, _PyImport_FindBuiltin, _PyImport_FindExtensionObject, _PyImport_FixupBuiltin, and _PyImport_FixupExtensionObject. #5737PyModuleMethods::add_submodule() to use the last segment of the submodule name as the attribute name on the parent module instead of using the full name. #5375PyIterator when calling size_hint #5604IntoPyObject output type of PyBackedStr to be PyString, not PyAny. #5655async functions to return None rather than empty tuple (). #5685#[pyclass] types (e.g. &MyClass) as arguments to async #[pyfunction]s. #5725experimental-inspect:
This patch contains very minor fixes for the PyO3 0.27 series:
This patch contains very minor fixes for the PyO3 0.27 series:
There are also a number of documentation improvements applied across the codebase.
Thank you to the following contributors for the improvements:
@davidhewitt
@dependabot[bot]
@MusicalNinjaDad
@pkalivas
@tpoliaw
@Tpt
PyDict on GraalPy (unsupported for now, may crash at runtime). #5653This release fixes a clippy lint regression in PyO3 0.27.0, and exposes the PySendResult type (the return value from Bound<PyIterator>::send ).
This release fixes a clippy lint regression in PyO3 0.27.0, and exposes the PySendResult type (the return value from Bound<PyIterator>::send).
Thank you to the following contributors for the improvements:
The .downcast() family of functions are now deprecated in favour of the .cast() family of functions, which are an incremental improvement to API usabi…
This release is the first PyO3 release to be tested against Python 3.14.0 final. There are no significant changes to 3.14 support since PyO3 0.26 which was tested against the 3.14 release candidates.
Support for PyPy 3.9 and PyPy 3.10 (both no longer supported upstream) has been dropped.
The FromPyObject trait has been reworked in a similar fashion to the IntoPyObject trait introduced in PyO3 0.23. This has established a performant and flexible implementation of both these traits and no further changes to the traits are anticipated in the future. Thank you for the patience upgrading through these incremental improvements at the core of PyO3.
The .downcast() family of functions are now deprecated in favour of the .cast() family of functions, which are an incremental improvement to API usability and to error messages on failed conversions.
Operations on the PyCapsule type have been changed without deprecation to fix some issues with lifetimes of return values (in .name() and .reference() specifically). The capsule API now also encourages checking of capsule names, which is one of the few defences available to protect the validity of casting data read by the capsule API.
There are also many other incremental improvements, bug fixes and smaller features.
Please consult the migration guide for help upgrading.
Thank you to everyone who contributed code, documentation, design ideas, bug reports, and feedback. The following contributors' commits are included in this release:
@alex
@altendky
@bazaah
@bschoenmaeckers
@crepererum
@davidhewitt
@dependabot[bot]
@elbaro
@Icxolu
@jqnatividad
@mbrobbel
@NilsIrl
@rvben
@sanders41
@tdyas
@Tpt
@vvsagar
hashbrown optional dependency to include version 0.16. #5428num-bigint dependency minimum version to 0.4.4. #5471FromPyObjectOwned as convenient trait bound for FromPyObject when the data is not borrowed from Python. #4390Borrowed::extract, same as PyAnyMethods::extract, but does not restrict the lifetime by deref. #4390experimental-inspect: basic support for #[derive(IntoPyObject)] (no struct fields support yet). #5365experimental-inspect: support #[pyo3(get, set)] and #[pyclass(get_all, set_all)]. #5370PyTypeCheck::classinfo_object that returns an object that can be used as parameter in isinstance or issubclass. #5387PyTypeInfo on datetime.* types even when the limited API is enabled. #5388PyTypeInfo on PyIterator, PyMapping and PySequence. #5402PyTypeInfo on PyCode when using the stable ABI. #5403PyTypeInfo on PyWeakrefReference when using the stable ABI. #5404pyo3::sync::RwLockExt trait, analogous to pyo3::sync::MutexExt for readwrite locks. #5435PyString::from_bytes. #5437AsRef<[u8]> for PyBytes. #5445CastError and CastIntoError. #5468PyCapsuleMethods::pointer_checked and PyCapsuleMethods::is_valid_checked. #5474Borrowed::cast, Borrowed::cast_exact and Borrowed::cast_unchecked. #5475jiff::civil::ISOWeekDate. #5478&Cstr, Cstring and Cow<Cstr>. #5482#[pyclass(skip_from_py_object)] option, to opt-out of the FromPyObject: PyClass + Clone blanket impl. #5488PyErr::add_note. #5489FromPyObject impl for Cow<Path> & Cow<OsStr>. #5497#[pyclass(from_py_object)] pyclass option, to opt-in to the extraction of pyclasses by value (requires Clone). #5506FromPyObject trait for flexibility and performance: #4390
FromPyObject, to allow borrowing data from Python objects (e.g. &str from Python str).extract_bound with extract, which takes Borrowed<'a, 'py, PyAny>.FromPyObject implementations for Vec<u8> and [u8; N] from bytes and bytearray. #5244#[pyfn] attribute. #5384PyTypeCheck::NAME. #5387PyTypeCheck::NAME in favour of PyTypeCheck::classinfo_object which provides the type information at runtime. #5387PyClassGuard(Mut) and PyRef(Mut) extraction now returns an opaque Rust error #5413PyTypeInfo with #[pymodule_use]. #5414Debug representation of PyBuffer<T>. #5442experimental-inspect: change the way introspection data is emitted in the binaries to avoid a pointer indirection and simplify parsing. #5450Py<T>::drop for the case when attached to the Python interpreter. #5454DowncastError and DowncastIntoError with CastError and CastIntoError. #5468GraalPy. #5471PyAnyMethods::downcast functions in favour of Bound::cast functions. #5472PyTypeCheck an unsafe trait. #5473PyCapsuleMethods: pointer(), reference(), and is_valid(). #5474PyCapsuleMethods::reference. #5474PyCapsuleMethods::name now returns CapsuleName wrapper instead of &CStr. #5474import_exception_bound in favour of import_exception. #5480PyList::get_item_unchecked, PyTuple::get_item_unchecked, and PyTuple::get_borrowed_item_unchecked no longer check for null values at the provided index. #5494DateTime<Local>. #5507FromPyObjectBound trait. #4390wasm32-wasip2. #5368OsStr conversion for non-utf8 strings on Windows. #5444cargo vendor caused by gitignored build artifact emscripten/pybuilddir.txt. #5456PyMethodDef instances inside #[pyfunction] macro generated code. #5459PyObjectObFlagsAndRefcnt on 32-bit Python 3.14 (doesn't exist). #5499abi3 interpreters on Windows using maturin's built-in sysconfig in combination with the generate-import-lib feature. #5503PyModule_ExecDef and PyModule_FromDefAndSpec2 on PyPy. #5529Deprecate PyString::from_object in favour of PyString::from_encoded_object. #5017
bytes dependency to add conversions for bytes::Bytes. #5252pyo3-introspection to pair with the experimental-inspect feature. #5300PYO3_BUILD_EXTENSION_MODULE now causes the same effect as the extension-module feature. Eventually we expect maturin and setuptools-rust to set this environment variable automatically. Users with their own build systems will need to do the same. #5343#[pyo3(warn(message = "...", category = ...))] attribute for automatic warnings generation for #[pyfunction] and #[pymethods]. #4364PyMutex, available on Python 3.13 and newer. #4523PyMutex_IsLocked, available on Python 3.14 and newer. #4523PyString::from_encoded_object. #5017experimental-inspect: add basic input type annotations. #5089PyFrameObject from CPython 3.13. #5154experimental-inspect: tag modules created using #[pymodule] or #[pymodule_init] functions as incomplete. #5207experimental-inspect: add basic return type support. #5208PyCode::compile and PyCodeMethods::run to create and execute code objects. #5217PyOnceLock type for thread-safe single-initialization. #5223PyClassGuard(Mut) pyclass holders. In the future they will replace PyRef(Mut). #5233experimental-inspect: allow annotations in #[pyo3(signature)] signature attribute. #5241MutexExt for parking_lot's/lock_api ReentrantMutex. #5258experimental-inspect: support class associated constants. #5272Bound::cast family of functions superseding the PyAnyMethods::downcast family. #5289Py_Version and Py_IsFinalizing. #5317experimental-inspect: add output type annotation for #[pyclass]. #5320experimental-inspect: support #[pyclass(eq, eq_int, ord, hash, str)]. #5338experimental-inspect: add basic support for #[derive(FromPyObject)] (no struct fields support yet). #5339Python::try_attach. #5342Py_TPFLAGS_DISALLOW_INSTANTIATION instead of a __new__ which always fails for a #[pyclass] without a #[new] on Python 3.10 and up. #4568PyModule::from_code now defaults file_name to <string> if empty. #4777PyString::from_object in favour of PyString::from_encoded_object. #5017abi3 for a Python version newer than pyo3 supports, automatically fall back to an abi3 build for the latest supported version. #5144is_instance_of trait bound from PyTypeInfo to PyTypeCheck. #5146MutexExt return type to be an associated type. #5201PyCallArgs for Py::call and friends so they're equivalent to their Bound counterpart. #5206Python::with_gil to Python::attach. #5209Python::allow_threads to Python::detach #5221GILOnceCell type in favour of PyOnceLock. #5223pyo3::prepare_freethreaded_python to Python::initialize. #5247PyMemoryError into/from io::ErrorKind::OutOfMemory. #5256GILProtected. #5285#[pyclass] docstring formatting from import time to compile time. #5286Python::attach will now panic if the Python interpreter is in the process of shutting down. #5317PyTypeInfo::type_object for #[pyclass] types. #5324PyObject type alias for Py<PyAny>. #5325Python::with_gil_unchecked to Python::attach_unchecked. #5340Python::assume_gil_acquired to Python::assume_attached. #5354PyFrameObject. #5154Eq and PartialEq implementations on PyGetSetDef FFI definition. #5196_Py_IsCoreInitialized and _Py_InitializeMain. #5317PyByteArray::to_vec on freethreaded build to replicate GIL-enabled "soundness". #4742bigdecimal into Python. #5198PyBuffer<T> after the Python interpreter has been finalized. #5242experimental-inspect: better automated imports generation. #5251experimental-inspect: fix introspection of __richcmp__, __concat__, __repeat__, __inplace_concat__ and __inplace_repeat__. #5273PyRef::into_super #5281Py_Exit (never returns, was () return value, now !). #5317experimental-inspect: fix handling of module members gated behind #[cfg(...)] attributes. #5318Add support for Windows on ARM64. #5145
Deprecate timezone_utc in favor of PyTzInfo::utc. #5055
bigdecimal dependency to add conversions for bigdecimal::BigDecimal. #5011time dependency to add conversions for time types. #5057cfg-if dependency. #5110ordered_float dependency to add conversions for ordered_float::NotNan and ordered_float::OrderedFloat. #5114experimental-inspect feature. #3977#[pyclass(generic)] option to support runtime generic typing. #4926OnceExt & MutexExt for parking_lot & lock_api. Use the new extension traits by enabling the arc_lock, lock_api, or parking_lot cargo features. #5044From/Into for Borrowed<T> -> Py<T>. #5054PyTzInfo constructors. #5055PY_INVALID_STACK_EFFECT. #5064AsRef<Py<PyAny>> for Py<T>, Bound<T> and Borrowed<T>. #5071PyModule_Add and compat::PyModule_Add. #5085Py_HashBuffer, Py_HashPointer, and PyObject_GenericHash. #5086#[pymodule_export] on const items in declarative modules. #5096#[pyclass(immutable_type)] option (on Python 3.14+ with abi3, or 3.10+ otherwise) for immutable type objects. #5101#[pyo3(rename_all)] support on #[derive(IntoPyObject)]. #5112PyRange wrapper. #5117datetime types with abi3 feature enabled. #4970timezone_utc in favor of PyTzInfo::utc. #5055PyCodeObject is now an opaque struct on all Python versions.PyFutureFeatures is now only defined up until Python 3.10 (it was present in CPython headers but unused in 3.11 and 3.12).PyAnyMethods::is to take other: &Bound<T>. #5071Py::is to take other: &Py<T>. #5071PyVisit::call to take T: Into<Option<&Py<T>>>. #5071PyDateTime_DATE_GET_TZINFO and PyDateTime_TIME_GET_TZINFO on PyPy 3.10 and later. #5079#[track_caller] to with_gil and with_gil_unchecked. #5109std::thread::park() instead of libc::pause() or sleep(9999999). #5115IntoPy and ToPyObject traits. #5010pyo3-ffi (i.e. starting with _Py) which are not referenced by public APIs: _PyLocalMonitors, _Py_GlobalMonitors, _PyCoCached, _PyCoLineInstrumentationData, _PyCoMonitoringData, _PyCompilerSrcLocation, _PyErr_StackItem. #5064PyCode_GetNumFree (PyO3 cannot support it due to knowledge of the code object). #5064AsPyPointer trait. #5071from_py_with. #5097_PyMethodWrapper_Type, _PyCoroWrapper_Type, _PyImport_FrozenBootstrap, _PyImport_FrozenStdlib, _PyImport_FrozenTest, _PyManagedBuffer_Type, _PySet_Dummy, _PyWeakref_ProxyType, and _PyWeakref_CallableProxyType. #5105PyASCIIObjectState, PyUnicode_IS_ASCII, PyUnicode_IS_COMPACT, and PyUnicode_IS_COMPACT_ASCII on Python 3.14 and newer. #5133#[derive(IntoPyObject, FromPyObject)] when using #[pyo3()] options recognised by only one of the two derives. #5070backports.zoneinfo for python <3.9 when converting timezones into python. #5120Fix unused_imports lint of #[pyfunction] and #[pymethods] expanded in macro_rules context. #5030
unused_imports lint of #[pyfunction] and #[pymethods] expanded in macro_rules context. #5030PyCodeObject::_co_instrumentation_version ffi struct member on Python 3.13 for systems where uintptr_t is not 64 bits. #5048r#ident in Python bindings. #5050Add PyAnyMethods::getattr_opt. #4978
abi3-py313 feature. #4969PyAnyMethods::getattr_opt. #4978PyInt::new constructor for all supported number types (i32, u32, i64, u64, isize, usize). #4984pyo3::sync::with_critical_section2. #4992PyCallArgs for Borrowed<'_, 'py, PyTuple>, &Bound<'py, PyTuple>, and &Py<PyTuple>. #5013is_type_of for native types not using same specialized check as is_type_of_bound. #4981Probe class naming issue with #[pymethods]. #4988#[pyfunction] arguments taking Option<&str> and Option<&T> (for #[pyclass] types). #5002PyString::from_object causing of bounds reads with encoding and errors parameters which are not nul-terminated. #5008crate for #[pyfunction]. #5015Remove the deprecated implicit eq fallback for simple enums. #4730
target-lexicon dependency to 0.13. #4822jiff dependency to add conversions for jiff datetime types. #4823uuid dependency to add conversions for uuid::Uuid. #4864inventory version to 0.3.5. #4954PyIterator::send method to allow sending values into a python generator. #4746PyCallArgs trait for passing arguments into the Python calling protocol. This enabled using a faster calling convention for certain types, improving performance. #4768#[pyo3(default = ...'] option for #[derive(FromPyObject)] to set a default value for extracted fields of named structs. #4829#[pyo3(into_py_with = ...)] option for #[derive(IntoPyObject, IntoPyObjectRef)]. #4850PyThreadState_GetFrame and PyFrame_GetBack. #4866last for BoundListIterator, BoundTupleIterator and BorrowedTupleIterator. #4878Iterator::count() for PyDict, PyList, PyTuple & PySet. #4878nth, nth_back, advance_by and advance_back_by for BoundTupleIterator #4897types.GenericAlias as pyo3::types::PyGenericAlias. #4917MutextExt trait to help avoid deadlocks with the GIL while locking a std::sync::Mutex. #4934#[pyo3(rename_all = "...")] option for #[derive(FromPyObject)]. #4941nth, nth_back, advance_by and advance_back_by for BoundListIterator. #4810DerefToPyAny in blanket implementations of From<Py<T>> and From<Bound<'py, T>> for PyObject. #4593io::ErrorKind::IsADirectory/NotADirectory to the corresponding Python exception on Rust 1.83+. #4747PyAnyMethods::call and friends now require PyCallArgs for their positional arguments. #4768PyObject_Vectorcall(Method) on the stable abi on 3.12+. #4853#[pyo3(from_py_with = ...)] now take a path rather than a string literal #4860PathBuf & Path into Python pathlib.Path instead of PyString. #4925pthread_exit trying to acquire the GIL when the interpreter is shutting down. This mimics the Python 3.14 behavior and avoids undefined behavior and crashes. #4874Deref for PyAny and other "native" types. #4593Fix thread-unsafe implementation of freelist pyclasses on the free-threaded build. #4902
Add PyList::locked_for_each, which uses a critical section to lock the list on the free-threaded build. #4789
PyList::locked_for_each, which uses a critical section to lock the list on the free-threaded build. #4789pyo3_build_config::add_python_framework_link_args build script API to set rpath when using macOS system Python. #4833datetime.fold to distinguish ambiguous datetimes when converting to and from chrono::DateTime<Tz> (rather than erroring). #4791py.allow_threads GIL-switch when attempting to access contents of a PyErr which originated from Python (could lead to unintended deadlocks). #4766BoundDictIterator on the free-threaded build. #4788BoundDictIterator on the free-threaded build. #4788chrono::DateTime<Tz> to-Python conversion when Tz is chrono_tz::Tz. #4790#[pyclass] not being able to be named Probe. #4794abi3 feature is enabled. #4806abi3 feature is enabled. #4808r#box in derive(FromPyObject). #4814#[pyclass] enum variants with more than 12 fields. #4832Bump optional python3-dll-a dependency to 0.2.11. #4749
python3-dll-a dependency to 0.2.11. #4749abi3 features enabled. #4733generate-import-lib feature. #4749PYO3_CONFIG_FILE would not reconfigure PyO3 for the new interpreter. #4758Add IntoPyObjectExt trait. #4708
Re-release of 0.23.0 with fixes to docs.rs build.
Re-release of 0.23.0 with fixes to docs.rs build.
Deprecate PyAnyMethods::is_ellipsis (Py::is_ellipsis was deprecated in PyO3 0.20). #4322
hashbrown optional dependency to include version 0.15. #4604eyre optional dependency to 0.6.8. #4617hashbrown optional dependency to 0.14.5. #4617indexmap optional dependency to 2.5.0. #4617num-complex optional dependency to 0.4.6. #4617chrono-tz optional dependency to 0.10. #4617IntoPyObject (fallible) conversion trait to convert from Rust to Python values. #4060#[pyclass(str="<format string>")] option to generate __str__ based on a Display implementation or format string. #4233PartialEq for Bound<'py, PyInt> with u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128 and isize. #4317PartialEq<f64> and PartialEq<f32> for Bound<'py, PyFloat>. #4348as_super and into_super methods for Bound<T: PyClass>. #4351PyCFunctionFast and PyCFunctionFastWithKeywords #4415PyMutex on Python 3.13 and newer. #4421PyDict::locked_for_each to iterate efficiently on freethreaded Python. #4439PyObject_GetOptionalAttr, PyObject_GetOptionalAttrString, PyObject_HasAttrWithError, PyObject_HasAttrStringWithError, Py_CONSTANT_* constants, Py_GetConstant, Py_GetConstantBorrowed, and PyType_GetModuleByDef on Python 3.13 and newer. #4447IntoPyObject. #4495Borrowed::as_ptr. #4520PyImport_AddModuleRef. #4529PyAnyMethods::try_iter. #4553pyo3::sync::with_critical_section, a wrapper around the Python Critical Section API added in Python 3.13. #4587#[pymodule(gil_used = false)] option to declare that a module supports the free-threaded build. #4588PyModule::gil_used method to declare that a module supports the free-threaded build. #4588PyDateTime_CAPSULE_NAME. #4634PyMappingProxy type to represent the mappingproxy Python class. #4644PyList_Extend and PyList_Clear. #4667IntoPyObjectRef. #4674pyo3::sync::OnceExt and pyo3::sync::OnceLockExt traits. #4676IntoPyObject over IntoPy<Py<PyAny>>> for #[pyfunction] and #[pymethods] return types. #4060#[pyclass] and #[pyo3(..)] attributes. #4243#[pymodule] are automatically treated as submodules (no PyInit_ entrypoint is created). #4308PyAnyMethods::is_ellipsis (Py::is_ellipsis was deprecated in PyO3 0.20). #4322PyLong in favor of PyInt. #4347IntoPyDict::into_py_dict_bound to IntoPyDict::into_py_dict. #4388PyModule::from_code now expects &CStr as arguments instead of &str. #4404#[pyfunction]s when compiling on abi3 for Python 3.10 and up. #4415Copy and Clone from PyObject struct FFI definition. #4434Python::eval and Python::run now take a &CStr instead of &str. #4435IPowModulo, PyClassAttributeDef, PyGetterDef, PyMethodDef, PyMethodDefType, and PySetterDef from PyO3's public API. #4441IntoPyObject impls for Vec<u8>, &[u8], [u8; N], Cow<[u8]> and SmallVec<[u8; N]> now convert into Python bytes rather than a list of integers. #4442IntoPyDict::into_py_dict is now fallible due to IntoPyObject migration. #4493abi3 feature will now override config files provided via PYO3_BUILD_CONFIG. #4497GILProtected struct on free-threaded Python. #4504PyListMethods::get_item_unchecked on free-threaded Python. #4539GILOnceCell::import. #4542PyAnyMethods::iter in favour of PyAnyMethods::try_iter. #4553#[pyclass] macro now requires a types to be Sync. (Except for #[pyclass(unsendable)] types). #4566PyList::new and PyTuple::new are now fallible due to IntoPyObject migration. #4580PyErr::matches is now fallible due to IntoPyObject migration. #4595ToPyObject in favour of IntoPyObject #4595PyWeakrefMethods::get_option. #4597PyWeakrefMethods trait. #4598PyNativeTypeInitializer and PyObjectInit from the PyO3 public API. #4611IntoPy in favor of IntoPyObject #4618PyErr::take() and PyErr::fetch() on Python 3.11 and older. #4655IntoPy::type_output to IntoPyObject::type_output. #4657PyMapping::keys, PyMapping::values and PyMapping::items to Bound<'py, PyList> instead of Bound<'py, PySequence>. #4661IntoPyObject by reference or by value together with Clone. This makes Py<T> available as field type. #4694PyUnicode in favour of PyString. #4370gil-refs feature. #4378_Py_IMMORTAL_REFCNT, _Py_IsImmortal, _Py_TPFLAGS_STATIC_BUILTIN, _Py_Dealloc, _Py_IncRef, _Py_DecRef. #4447_Py_c_sum, _Py_c_diff, _Py_c_neg, _Py_c_prod, _Py_c_quot, _Py_c_pow, _Py_c_abs. #4521_borrowed methods of PyWeakRef and PyWeakRefProxy. #4528_PyErr_ChainExceptions. #4534lib_dir when cross-compiling. #4389Py_Is for PyPy on 3.10 to call the function defined by PyPy. #4447#[cfg] attributes for simple enum variants. #4509non_snake_case method names inside #[pymethods] generated code. #4567#[derive(FromPyObject)] generic struct with trait bounds. #4645#[classmethod] and #[staticmethod] on magic methods. #4654unsafe_op_in_unsafe_fn in generated macro code. #4674#[pyclass] enums with custom __eq__ implementation. #4692non_upper_case_globals lint firing for generated __match_args__ on complex enums. #4705Nothing published for this version
Fix regression in 0.22.4 of naming collision in __clear__ slot and clear method generated code. #4619
__clear__ slot and clear method generated code. #4619Deprecate _borrowed methods on PyWeakRef and PyWeakrefProxy (just use the owning forms). #4590
PyWeakref_GetRef and compat::PyWeakref_GetRef. #4528_borrowed methods on PyWeakRef and PyWeakrefProxy (just use the owning forms). #4590_PyLong_NumBits on Python 3.13 and later. #4450__traverse__ functions for base classes not being called by subclasses created with #[pyclass(extends = ...)]. #4563#![forbid(unsafe_code)]. #4574create_exception macro triggering lint and compile errors due to interaction with gil-refs feature. #4589_borrowed methods on PyWeakRef and PyWeakrefProxy by leaking their contents. #4590PyType_GetSlot on static types before Python 3.10. #4599Add pyo3::compat namespace with compatibility shims for C API functions added in recent versions of Python.
pyo3::ffi::compat namespace with compatibility shims for C API functions added in recent versions of Python.PyDict_GetItemRef on Python 3.13 and newer, and compat::PyDict_GetItemRef for all versions. #4355PyList_GetItemRef on Python 3.13 and newer, and pyo3_ffi::compat::PyList_GetItemRef for all versions. #4410compat::Py_NewRef and compat::Py_XNewRef. #4445compat::PyObject_CallNoArgs and compat::PyObject_CallMethodNoArgs. #4461GilOnceCell<Py<T>>::clone_ref. #4511#[pyfunction] defined inside #[pymethods]. #4349_Py_PackageContext. #4420#[pymodule] under presence of #![no_implicit_prelude]. #4328PyDict::get_item (unsafe in free-threaded Python). #4355#[pyclass(eq)] macro hygiene issues for structs and enums. #4359#[pyfunction] and #[pymethods] generated code which affected expansion in macro_rules context. #4382unsafe_code lint error in #[pyclass] generated code. #4396PyList::get_item (unsafe in free-threaded Python). #4410PyArg_ParseTupleAndKeywords to take *const *const c_char instead of *mut *mut c_char on Python 3.13 and up. #4420PyClassInitializer: panic if adding subclass to existing instance via PyClassInitializer::from(Py<BaseClass>).add_subclass(SubClass). #4454__traverse__ handlers. #4479Require opt-in to freethreaded Python using the UNSAFE_PYO3_BUILD_FREE_THREADED=1 environment variable (it is not yet supported by PyO3). #4327
UNSAFE_PYO3_BUILD_FREE_THREADED=1 environment variable (it is not yet supported by PyO3). #4327#[pymodule(...)] now directly accepts all relevant #[pyo3(...)] options. #4330Fix invalid deprecation warning for trailing optional on #[setter] function. #4304
#[pyo3(submodule)] option for declarative #[pymodule]s. #4301PartialEq<bool> for Bound<'py, PyBool>. #4305NotImplemented instead of raising TypeError from generated equality method when comparing different types. #4287#[pyo3::prelude::pymodule] and similar for #[pyclass] and #[pyfunction] in declarative modules. #4288#[setter] function. #4304Deprecate implicit default for trailing optional arguments #4078
heck dependency to 0.5. #3966chrono-tz optional dependency to include version 0.10. #4061num-rational feature to add conversions with Python's fractions.Fraction. #4148PyWeakref, PyWeakrefReference and PyWeakrefProxy. #3835#[pyclass] on enums that have tuple variants. #4072Decimal conversion. #4079pyo3_disable_reference_pool conditional compilation flag to avoid the overhead of the global reference pool at the cost of known limitations as explained in the performance section of the guide. #4095#[pyo3(constructor = (...))] to customize the generated constructors for complex enum variants. #4158PyType::module, which always matches Python __module__. #4196PyType::fully_qualified_name which matches the "fully qualified name" defined in PEP 737. #4196PyTypeMethods::mro and PyTypeMethods::bases. #4197#[pyclass(ord)] to implement ordering based on PartialOrd. #4202ToPyObject and IntoPy<PyObject> for PyBackedStr and PyBackedBytes. #4205#[pyclass(hash)] option to implement __hash__ in terms of the Hash implementation #4206#[pyclass(eq)] option to generate __eq__ based on PartialEq, and #[pyclass(eq_int)] for simple enums to implement equality based on their discriminants. #4210From<Bound<'py, T>> for PyClassInitializer<T>. #4214as_super methods to PyRef and PyRefMut for accessing the base class by reference. #4219PartialEq<str> for Bound<'py, PyString>. #4245PyModuleMethods::filename on PyPy. #4249PartialEq<[u8]> for Bound<'py, PyBytes>. #4250pyo3_ffi::c_str macro to create &'static CStr on Rust versions which don't have 1.77's c"" literals. #4255bool conversion with numpy 2.0's numpy.bool type #4258PyAnyMethods::{bitnot, matmul, floor_div, rem, divmod}. #4264PySliceIndices::slicelength and the length parameter of PySlice::indices(). #3761Cloneing pointers into the Python heap has been moved behind the py-clone feature, as it must panic without the GIL being held as a soundness fix. #4095#[track_caller] to all Py<T>, Bound<'py, T> and Borrowed<'a, 'py, T> methods which can panic. #4098PyAnyMethods::dir to be fallible and return PyResult<Bound<'py, PyList>> (and similar for PyAny::dir). #4100weakref or dict when compiling for abi3 for Python older than 3.9. #4194PyType::name to always match Python __name__. #4196#[pyclass(eq_int)]. #4210module= attribute of declarative modules' child #[pymodule]s and #[pyclass]es. #4213module option for complex enum variants from the value set on the complex enum module. #4228abi3 feature on PyPy or GraalPy. #4237#[pyo3(get)] on #[pyclass] fields. #4254PyCFunction::new, PyCFunction::new_with_keywords and PyCFunction::new_closure now take &'static CStr name and doc arguments (previously was &'static str). #4255experimental-declarative-modules feature is now stabilized and available by default. #4257PYO3_CROSS_LIB_DIR is set to a missing path. #4043create_exception! living in a different Rust module using the declarative-module feature. #4086PY_VECTORCALL_ARGUMENTS_OFFSET and PyVectorcall_NARGS to fix a false-positive assertion. #4104PyUnicode_DATA on PyPy: not exposed by PyPy. #4116#[pyo3(from_py_with = ...)] attribute on dunder (__magic__) method arguments instead of silently ignoring it. #4117mod node. #4236__dict__ attribute missing for #[pyclass(dict)] instances when building for abi3 on Python 3.9. #4251Deprecate the PySet::empty() gil-ref constructor. #4082
PySet::empty() gil-ref constructor. #4082async fn in #[pymethods] with a &self receiver and more than one additional argument. #4035__traverse__. #4045#[pyclass] living in a different Rust module using the experimental-declarative-modules feature. #4054missing_docs lint triggering on documented #[pymodule] functions. #4067libpython). #4073Emit deprecation warning for uses of GIL Refs as #[setter] function arguments. #3998
Send and Sync for PyBackedStr and PyBackedBytes. #4007Clone, Debug, PartialEq, Eq, PartialOrd, Ord and Hash implementation for PyBackedBytes and PyBackedStr, and Display for PyBackedStr. #4020import_exception_bound! macro to import exception types without generating GIL Ref functionality for them. #4027#[setter] function arguments. #3998#[inline] hints on many Bound and Borrowed methods. #4024#[pyo3(from_py_with = "")] in #[setter] methods #3995&Bound in #[setter] methods. #3998#[pymodule], #[pyfunction] and #[pyclass] macros. #4009pyo3::import_exception! does not exist. #4012#[pymethod] with a receiver and additional arguments. #4015Add gil-refs feature to allow continued use of the deprecated GIL Refs APIs. #3707
PyMemoryView type. #3514async fn in for #[pyfunction] and #[pymethods], with the experimental-async feature. #3540 #3588 #3599 #3931PyTypeInfo for PyEllipsis, PyNone and PyNotImplemented. #3577#[pyclass] on enums that have non-unit variants. #3582chrono feature with abi3 feature. #3664FromPyObject, IntoPy<PyObject> and ToPyObject are implemented on std::duration::Duration #3670PyString::to_cow. Add Py<PyString>::to_str, Py<PyString>::to_cow, and Py<PyString>::to_string_lossy, as ways to access Python string data safely beyond the GIL lifetime. #3677Bound<T> and Borrowed<T> smart pointers as a new API for accessing Python objects. #3686PyNativeType::as_borrowed to convert "GIL refs" to the new Bound smart pointer. #3692FromPyObject::extract_bound method, to migrate FromPyObject implementations to the Bound API. #3706gil-refs feature to allow continued use of the deprecated GIL Refs APIs. #3707PyAnyMethods for binary operators (add, sub, etc.) #3712chrono-tz feature allowing conversion between chrono_tz::Tz and zoneinfo.ZoneInfo #3730PyType_GetModuleByDef. #3734std::time::SystemTime and datetime.datetime #3736Py::as_any and Py::into_any. #3785PyStringMethods::encode_utf8. #3801PyBackedStr and PyBackedBytes, as alternatives to &str and &bytes where a Python object owns the data. #3802 #3991#[pymodule] macro on Rust mod blocks, with the experimental-declarative-modules feature. #3815ExactSizeIterator for set and frozenset iterators on abi3 feature. #3849Py::drop_ref to explicitly drop a `Py`` and immediately decrease the Python reference count if the GIL is already held. #3871#[pymodule] macro on single argument functions that take &Bound<'_, PyModule>. #3905FromPyObject for Cow<str>. #3928Default for GILOnceCell. #3971PyDictMethods::into_mapping, PyListMethods::into_sequence and PyTupleMethods::into_sequence. #3982PyDict::from_sequence now takes a single argument of type &PyAny (previously took two arguments Python and PyObject). #3532Py::is_ellipsis and PyAny::is_ellipsis in favour of any.is(py.Ellipsis()). #3577PyTypeInfo functionality into new traits HasPyGilRef and PyTypeCheck. #3600PyTryFrom and PyTryInto traits in favor of any.downcast() via the PyTypeCheck and PyTypeInfo traits. #3601&self/&mut self #3609FromPyObject for set types now also accept frozenset objects as input. #3632FromPyObject for bool now also accepts NumPy's bool_ as input. #3638AsRefSource associated type to PyNativeType. #3653.is_true to .is_truthy on PyAny and Py<PyAny> to clarify that the test is not based on identity with or equality to the True singleton. #3657PyType::name is now PyType::qualname whereas PyType::name efficiently accesses the full name which includes the module name. #3660Iter(A)NextOutput types are now deprecated and __(a)next__ can directly return anything which can be converted into Python objects, i.e. awaitables do not need to be wrapped into IterANextOutput or Option any more. Option can still be used as well and returning None will trigger the fast path for __next__, stopping iteration without having to raise a StopIteration exception. #3661FromPyObject on chrono::DateTime<Tz> for all Tz, not just FixedOffset and Utc. #3663PyTzInfoAccess trait. For the deprecated gil-ref API, the trait is now implemented for &'py PyTime and &'py PyDateTime instead of PyTime and PyDate. #3679__traverse__ become no-ops for unsendable pyclasses if on the wrong thread, thereby avoiding hard aborts at the cost of potential leakage. #3689PyNativeType in pyo3::prelude. #3692extract::<i64> (and other integer types) by avoiding call to __index__() converting the value to an integer for 3.10+. Gives performance improvement of around 30% for successful extraction. #3742FromPyObject for Py<T> to just T: PyTypeCheck. #3776PySet and PyFrozenSet iterators now always iterate the equivalent of iter(set). (A "fast path" with no noticeable performance benefit was removed.) #3849FromPyObject for &str, Cow<str>, &[u8] and Cow<[u8]> onto a temporary trait FromPyObjectBound when gil-refs feature is deactivated. #3928GILPool, Python::with_pool, and Python::new_pool. #3947Py_MAX_NDIMS in favour of PyBUF_MAX_NDIM. #3757datetime types when an invalid datetime module is on sys.path. #3818non_local_definitions lint warning triggered by many PyO3 macros. #3901PyCode and PyCode_Type on PyPy: PyCode_Type is not exposed by PyPy. #3934Prerelease of PyO3 0.21. See the GitHub diff for what changed between 0.21.0-beta.0 and the final release.
Prerelease of PyO3 0.21. See the GitHub diff for what changed between 0.21.0-beta.0 and the final release.
Add portable-atomic dependency. #3619
Pin pyo3 and pyo3-ffi dependencies on pyo3-build-config to require the same patch version, i.e. pyo3 0.20.2 requires _exactly_ pyo3-build-config 0.20.
Add optional either feature to add conversions for either::Either sum type. #3456
either feature to add conversions for either::Either<L, R> sum type. #3456smallvec feature to add conversions for smallvec::SmallVec. #3507take and into_inner methods to GILOnceCell #3556#[classmethod] methods can now also receive Py<PyType> as their first argument. #3587#[pyfunction(pass_module)] can now also receive Py<PyModule> as their first argument. #3587traverse method to GILProtected. #3616abi3-py312 feature #3687…now PyResult > instead of Option<&PyAny>), and deprecate PyDict::get_item_with_error. #3330
indoc dependency to 2.0 and unindent dependency to 0.2. #3237syn dependency to 2.0. #3239chrono optional dependency to require 0.4.25 or newer. #3427__lt__, __le__, __eq__, __ne__, __gt__ and __ge__ in #[pymethods]. #3203Py_GETENV. #3336as_ptr and into_ptr inherent methods for Py, PyAny, PyRef, and PyRefMut. #3359DoubleEndedIterator for PyTupleIterator and PyListIterator. #3366#[pyclass(rename_all = "...")] option: this allows renaming all getters and setters of a struct, or all variants of an enum. Available renaming rules are: "camelCase", "kebab-case", "lowercase", "PascalCase", "SCREAMING-KEBAB-CASE", "SCREAMING_SNAKE_CASE", "snake_case", "UPPERCASE". #3384PyObject_GC_IsTracked and PyObject_GC_IsFinalized on Python 3.9 and up (PyPy 3.10 and up). #3403None, Ellipsis, and NotImplemented. #3408Py_mod_multiple_interpreters constant and its possible values. #3494PyInterpreterConfig struct, its constants and Py_NewInterpreterFromConfig. #3502PySet::discard to return PyResult<bool> (previously returned nothing). #3281IntoPy for Rust tuples to Python tuples. #3321PyDict::get_item to no longer suppress arbitrary exceptions (the return type is now PyResult<Option<&PyAny>> instead of Option<&PyAny>), and deprecate PyDict::get_item_with_error. #3330AsPyPointer is now an unsafe trait. #3358os.PathLike values in implementation of FromPyObject for PathBuf. #3374__builtins__ to globals in py.run() and py.eval() if they're missing. #3378FromPyObject for BigInt and BigUint. #3379PyIterator::from_object and PyByteArray::from now take a single argument of type &PyAny (previously took two arguments Python and AsPyPointer). #3389AsPyPointer with AsRef<PyAny> as a bound in the blanket implementation of From<&T> for PyObject. #3391impl IntoPy<PyObject> for &T where T: AsPyPointer with implementations of impl IntoPy<PyObject> for &PyAny, &T where T: AsRef<PyAny>, and &Py<T>. #3393std::io::Error kind in implementation of From<std::io::IntoInnerError> for PyErr #3396ErrorKind in implementation of From<PyErr> for OSError subclass. #3397PyErr in implementation of From<std::io::Error> for PyErr if the std::io::Error has been built using a Python exception (previously would create a new exception wrapping the std::io::Error). #3402#[pymodule] will now return the same module object on repeated import by the same Python interpreter, on Python 3.9 and up. #3446chrono types to Python datetime types (datetime cannot represent leap-seconds). #3458Err returned from #[pyfunction] will now have a non-None __context__ if called from inside a catch block. #3455#[__new__] form of #[new] attribute. #3505#[args] attribute for #[pymethods]. #3232IntoPyPointer trait in favour of into_ptr inherent methods. #3385PySet::discard. #3281PyTupleIterator type returned by PyTuple::iter is now public and hence can be named by downstream crates. #3366PyOS_FSPath on PyPy. #3374PyTypeBuilder::build. #3401_Py_GetAllocatedBlocks, _PyObject_GC_Malloc, and _PyObject_GC_Calloc on Python 3.11 and up. #3403ResourceWarning and crashes related to GC when running with debug builds of CPython. #3404Option<T> default arguments will no longer re-wrap Some(T) or expressions evaluating to None. #3461IterNextOutput::Return not returning a value on PyPy. #3471#[pymethods] blocks. #3491#[new], #[classmethod], #[staticmethod], and #[classattr]. #3484PyMarshal_WriteObjectToString from PyMarshal_ReadObjectFromString with the abi3 feature. #3490_PyFrameEvalFunction on Python 3.11 and up (it now receives a _PyInterpreterFrame opaque struct). #3500Update PyErr for 3.12 betas to avoid deprecated ffi methods. #3306
PyState_AddModule, PyState_RemoveModule and PyState_FindModule for PyPy 3.9 and up. #3295_PyObject_CallFunction_SizeT and _PyObject_CallMethod_SizeT. #3297PyErr::Display for all Python versions, and FFI symbol PyErr_DisplayException for Python 3.12. #3334PyType_GetDict() for Python 3.12. #3339PyAny::downcast_exact. #3346PySlice::full() to construct a full slice (::). #3353PyErr for 3.12 betas to avoid deprecated ffi methods. #3306object.h for Python 3.12.0b4. #3335pyo3::ffi struct definitions to be compatible with 3.12.0b4. #3342float to f64 (and PyFloat::value) on non-abi3 builds. #3345SystemError raised in PyUnicodeDecodeError_Create on PyPy 3.10. #3297Py_EnterRecursiveCall to return c_int (was incorrectly returning ()). #3300PyErr::matches and PyErr::is_instance returned results inconsistent with PyErr::get_type. #3313PanicException when unwinding after the exception was "normalized". #3326PyErr::from_value and PyErr::into_value losing traceback on conversion. #3328Extend range of supported versions of hashbrown optional dependency to include version 0.14 #3258
hashbrown optional dependency to include version 0.14 #3258indexmap optional dependency to include version 2. #3277pyo3::types::PyFrozenSetBuilder to allow building a PyFrozenSet item by item. #3156ipaddress.IPv4Address/ipaddress.IPv6Address and std::net::IpAddr. #3197num-bigint feature in combination with abi3. #3198PyErr_GetRaisedException(), PyErr_SetRaisedException() to FFI definitions for Python 3.12 and later. #3248Python::with_pool which is a safer but more limited alternative to Python::new_pool. #3263PyDict::get_item_with_error on PyPy. #3270#[new] methods may to return Py<Self> in order to return existing instances. #3287Deprecate text_signature option on #[pyclass] structs. #2980
text_signature option (and automatically generate signature) for #[new] in #[pymethods]. #2980decimal.Decimal and rust_decimal::Decimal. #3016#[pyo3(from_item_all)] when deriving FromPyObject to specify get_item as getter for all fields. #3120pyo3::exceptions::PyBaseExceptionGroup for Python 3.11, and corresponding FFI definition PyExc_BaseExceptionGroup. #3141#[new] with #[classmethod] to create a constructor which receives a (subtype's) class/PyType as its first argument. #3157PyClass::get and Py::get for GIL-independent access to classes with #[pyclass(frozen)]. #3158PyAny::is_exact_instance and PyAny::is_exact_instance_of. #3161PyAny::is_instance_of::<T>(obj) is now equivalent to T::is_type_of(obj), and now returns bool instead of PyResult<bool>. #2881text_signature option on #[pyclass] structs. #2980anyhow::Error/eyre::Report containing a basic PyErr without a chain in a PyRuntimeError. #3004#[getter] and #[setter] to use a common call "trampoline" to slightly reduce generated code size and compile times. #3029text_signature. #3050None in automatically-generated text_signature. #3066PySequence::list and PySequence::tuple to PySequence::to_list and PySequence::to_tuple. (The old names continue to exist as deprecated forms.) #3111PyRef::py and PyRefMut::py to match the underlying borrow. #3131Python::with_gil, is now locked inside of implementations of the __traverse__ slot. #3168Python::acquire_gil is replaced by Python::with_gil. #2981PyGetSetDef, PyMemberDef, PyStructSequence_Field and PyStructSequence_Desc to have *const c_char members for name and doc (not *mut c_char). #3036fmt::Display, instead return "<unprintable object>" string and report error via sys.unraisablehook() #3062#[pyfunction]s take references into #[pyclass]es #3142__traverse__ implementation. #3168Drop implementations of unsendable classes on other threads. #3176#[pymethods] items come from somewhere else (for example, as a macro argument) and a custom receiver like Py<Self> is used. #3178Fix upstream deprecation of PyUnicode_InternImmortal since Python 3.10. #3071
GILProtected<T> to mediate concurrent access to a value using Python's global interpreter lock (GIL). #2975PyASCIIObject / PyUnicode and associated methods on big-endian architectures. #3015_PyDict_Contains_KnownHash() for CPython 3.10 and up. #3088#[pymethods] and #[pyfunction] called "output". #3022#[staticmethod]. #3055is_instance for PyDateTime (would incorrectly check for a PyDate). #3071PyUnicode_InternImmortal since Python 3.10. #3071Disable default features of chrono to avoid depending on time v0.1.x. #2939
chrono to avoid depending on time v0.1.x. #2939IntoPy<PyObject>, ToPyObject and FromPyObject for Cow<[u8]> to efficiently handle both bytes and bytearray objects. #2899IntoPy<PyObject>, ToPyObject and FromPyObject for Cell<T>. #3014PyList::to_tuple(), as a convenient and efficient conversion from lists to tuples. #3042PyTuple::to_list(), as a convenient and efficient conversion from tuples to lists. #3044PySequence conversion for list and tuple inputs. #2944#[pyclass] type object fails during module import. #2947PyMapping conversion for dict inputs. #2954create_exception! to take a dotted.module to place the exception in a submodule. #2979PyObjects cloned in allow_threads blocks. #2952clippy::redundant_closure lint on default arguments in #[pyo3(signature = (...))] annotations. #2990non_snake_case lint on generated code in #[pyfunction] macro. #2993Add PyErr::write_unraisable(). #2889
PyErr::write_unraisable(). #2889Python::Ellipsis() and PyAny::is_ellipsis() methods. #2911PyDict::update() and PyDict::update_if_missing() methods. #2912PyIter_Check on CPython 3.7 is now implemented as hasattr(type(obj), "__next__"), which works correctly on all platforms and adds support for abi3. #2914PYO3_CONFIG_FILE instead of denying. #2926__releasebuffer__ to sys.unraisablehook rather than causing SystemError. #2886PyIterator succeeding for Python classes which did not implement __next__. #2914__traverse__ when visiting None fields of Option<T: AsPyPointer>. #2921#[pymethods(crate = "...")] option being ignored. #2923pythonXY_d.dll for debug Python builds on Windows. #2937Deprecate #[args] attribute and passing "args" specification directly to #[pyfunction] in favor of the new #[pyo3(signature = (...))] option. #2702
indexmap optional depecency to allow >= 1.6, < 2. #2849hashbrown optional dependency to allow >= 0.9, < 0.14. #2875memoffset dependency to 0.8. #2875GILOnceCell::get_or_try_init for fallible GILOnceCell initialization. #2398experimental-inspect with type_input() and type_output() helpers to get the Python type of any Python-compatible object. #2490 #2882#[pyclass] macro can now take get_all and set_all to create getters and setters for every field. #2692#[pyo3(signature = (...))] option for #[pyfunction] and #[pymethods]. #2702pyo3-build-config: rebuild when PYO3_ENVIRONMENT_SIGNATURE environment variable value changes. #2727std::num and Python int. #2730Py::downcast() as a companion to PyAny::downcast(), as well as downcast_unchecked() for both types. #2734Warning classes as well as PyErr::warn_explicit. #2742abi3-py311 feature. #2776_PyErr_ChainExceptions() for CPython. #2788PyVectorcall_NARGS and PY_VECTORCALL_ARGUMENTS_OFFSET for PyPy 3.8 and up. #2811PyList::get_item_unchecked for PyPy. #2827PyCFunction::new_closure to take name and doc arguments. #2686PyType::is_subclass, PyErr::is_instance and PyAny::is_instance now take &PyAny instead of &PyType arguments, so that they work with objects that pretend to be types using __subclasscheck__ and __instancecheck__. #2695#[args] attribute and passing "args" specification directly to #[pyfunction] in favor of the new #[pyo3(signature = (...))] option. #2702Option<T> arguments to #[pyfunction] and #[pymethods] without also using #[pyo3(signature)] to specify whether the arguments should be required or have defaults. #2703#[pyfunction] and #[pymethods] to use a common call "trampoline" to slightly reduce generated code size and compile times. #2705PyAny::cast_as() and Py::cast_as() are now deprecated in favor of PyAny::downcast() and the new Py::downcast(). #2734PyAny::downcast(). #2734__text_signature__ for all Python functions created using #[pyfunction] and #[pymethods]. #2784PySet::new and PyFrozenSet::new. #2795#[cfg(...)] and #[pyo3(...)] attributes on #[pyclass] struct fields will now work. #2796PyFunction on when building for abi3 or PyPy. #2838derive(FromPyObject) to use intern! when applicable for #[pyo3(item)]. #2879pyproto feature, #[pyproto] macro, and all accompanying APIs. #2587PyModule::filename on PyPy. #2715PyCodeObject is now once again defined with fields on Python 3.7. #2726TypeError if #[new] pymethods with no arguments receive arguments when called from Python. #2749NOARGS argument calling convention for methods that have a single py: Python argument (as a performance optimization). #2760isize values to c_long in PySlice::new. #2769PyUnicodeDecodeError_Create on PyPy leading to indeterminate behavior (typically a TypeError). #2772**kwargs to accept keyword arguments which share a name with a positional-only argument (as permitted by PEP 570). #2800PyObject_Vectorcall on PyPy 3.9 and up. #2811PyCFunction::new_closure. #2842Support Python 3.11. (Previous versions of PyO3 0.17 have been tested against Python 3.11 release candidates and are expected to be compatible, this i
ExactSizeIterator for PyListIterator, PyDictIterator, PySetIterator and PyFrozenSetIterator. #2676impl FromPyObject for [T; N] no longer accepting types passing PySequence_Check, e.g. NumPy arrays, since version 0.17.0. This the same fix that was applied impl FromPyObject for Vec<T> in version 0.17.1 extended to fixed-size arrays. #2675FunctionDescription::extract_arguments_fastcall due to creating slices from a null pointer. #2687Added optional chrono feature to convert chrono types into types in the datetime module. #2612
chrono feature to convert chrono types into types in the datetime module. #2612num-bigint feature on PyPy. #2626__richcmp__ for enums, fixing __ne__ returning always returning True. #2622Option<&SomePyClass> argument with a default. #2630impl FromPyObject for Vec<T> no longer accepting types passing PySequence_Check, e.g. NumPy arrays, since 0.17.0. #2631Fix visibility of PyDictItems, PyDictKeys, and PyDictValues types added in PyO3 0.17.0.
Move PyTypeObject::type_object method to the PyTypeInfo trait, and deprecate the PyTypeObject trait. #2287
0.3 (the multiple-pymethods feature now requires Rust 1.62 for correctness). #2492timezone_utc. #1588ToPyObject for [T; N]. #2313PyDictKeys, PyDictValues and PyDictItems Rust types. #2358append_to_inittab. #2377PyFrame_GetCode. #2406PyCode and PyFrame high level objects. #2408Py_fstring_input, sendfunc, and _PyErr_StackItem. #2423PyDateTime::new_with_fold, PyTime::new_with_fold, PyTime::get_fold, and PyDateTime::get_fold for PyPy. #2428#[pyclass(frozen)]. #2448#[pyo3(name)] on enum variants. #2457CompareOp::matches to implement __richcmp__ as the result of a Rust std::cmp::Ordering comparison. #2460PySuper type. #2486generate-import-lib feature. #2506Py_EnterRecursiveCall and Py_LeaveRecursiveCall. #2511PyDict::get_item_with_error. #2536#[pyclass(sequence)] option. #2567tzinfo to take Option<&PyTzInfo> instead of Option<&PyObject>: PyDateTime::new, PyDateTime::new_with_fold, PyTime::new, and PyTime::new_with_fold. #1588PyTypeObject::type_object method to the PyTypeInfo trait, and deprecate the PyTypeObject trait. #2287Py and PyAny now accept impl IntoPy<Py<PyString>> rather than just &str to allow use of the intern! macro. #2312pyproto feature to be opt-in instead of opt-out. #2322#[pyfunction] return types do not implement IntoPy. #2326T: IntoPy for impl<T, const N: usize> IntoPy<PyObject> for [T; N] instead of T: ToPyObject. #2326ToBorrowedObject trait. #2333PySet and PyDict will now panic if the underlying collection is mutated during the iteration. #2380PySet and PyDict will now panic if the underlying collection is mutated during the iteration. #2380#[classattr] methods to be fallible. #2385#[pymethods] with the same name for a single #[pyclass]. #2399lib_name when using PYO3_CONFIG_FILE. #2404ValueError raised by the #[derive(FromPyObject)] implementation for a tuple struct. #2414#[classattr] methods to take Python argument. #2456PyCapsule type to resolve soundness issues: #2485
PyCapsule::new and PyCapsule::new_with_destructor now take name: Option<CString> instead of &CStr.F in PyCapsule::new_with_destructor must now be Send.PyCapsule::get_context deprecated in favor of PyCapsule::context which doesn't take a py: Python<'_> argument.PyCapsule::set_context no longer takes a py: Python<'_> argument.PyCapsule::name now returns PyResult<Option<&CStr>> instead of &CStr.FromPyObject::extract for Vec<T> no longer accepts Python str inputs. #2500#[pymodule] is only initialized once. #2523pyo3_build_config::add_extension_module_link_args now also emits linker arguments for wasm32-unknown-emscripten. #2538PySequence and PyMapping now require inputs to inherit from (or register with) collections.abc.Sequence and collections.abc.Mapping respectively. #2477PyFunction on when building for abi3 or PyPy. #2542Python::acquire_gil. #2549Dict, WeakRef and BaseNativeType members of the PyClass private implementation details. #2572PyThreadState_DeleteCurrent. #2357wrap_pymodule interactions with name resolution rules: it no longer "sees through" glob imports of use submodule::* when submodule::submodule is a #[pymodule]. #2363PyEval_EvalCodeEx to take *const *mut PyObject array arguments instead of *mut *mut PyObject. #2368#[pyclass] struct r#RawName) incorrectly having r# at the start of the class name created in Python. #2395Py_tracefunc to be unsafe extern "C" fn (was previously safe). #2407#[pyo3(from_py_with = "...")] annotations on a field in a #[derive(FromPyObject)] struct. #2414_PyDateTime_BaseTime and _PyDateTime_BaseDateTime lacking leading underscores in their names. #2421PyArena on Python 3.10 and up. #2421PyCompilerFlags missing member cf_feature_version on Python 3.8 and up. #2423PyAsyncMethods missing member am_send on Python 3.10 and up. #2423PyGenObject having multiple incorrect members on various Python versions. #2423PySyntaxErrorObject missing members end_lineno and end_offset on Python 3.10 and up. #2423PyHeapTypeObject missing member ht_module on Python 3.9 and up. #2423PyFrameObject having multiple incorrect members on various Python versions. #2424 #2434PyTypeObject missing deprecated field tp_print on Python 3.8. #2428PyDateTime_CAPI. PyDateTime_Date, PyASCIIObject, PyBaseExceptionObject, PyListObject, and PyTypeObject on PyPy. #2428_inittab field initfunc typo'd as initfun. #2431_PyDateTime_BaseTime and _PyDateTime_BaseDateTime incorrectly having fold member. #2432PyTypeObject. PyHeapTypeObject, and PyCFunctionObject having incorrect members on PyPy 3.9. #2433PyGetSetDef to have *const c_char for doc member (not *mut c_char). #2439#[pyo3(from_py_with = "...")] being ignored for 1-element tuple structs and transparent structs. #2440memoffset to avoid UB when computing PyCell layout. #2450repr for enums renamed by #[pyclass(name = "...")] #2457PyObject_CallNoArgs incorrectly being available when building for abi3 on Python 3.9. #2476#[pyfunction] arguments. #2503Fix soundness issues with PyCapsule type with select workarounds. Users are encourage to upgrade to PyO3 0.17 at their earliest convenience which cont
PyCapsule type with select workarounds. Users are encourage to upgrade to PyO3 0.17 at their earliest convenience which contains API breakages which fix the issues in a long-term fashion. #2522
PyCapsule::new and PyCapsule::new_with_destructor now take ownership of a copy of the name to resolve a possible use-after-free.PyCapsule::name now returns an empty CStr instead of dereferencing a null pointer if the capsule has no name.F in PyCapsule::new_with_destructor will never be called if the capsule is deleted from a thread other than the one which the capsule was created in (a warning will be emitted).Deprecate experimental generate-abi3-import-lib feature in favor of the new generate-import-lib feature. #2364
generate-import-lib feature to support auto-generating non-abi3 python import libraries for Windows targets. #2364Py_ExitStatusException. #2374generate-abi3-import-lib feature in favor of the new generate-import-lib feature. #2364warn_default_encoding field to PyConfig on 3.10+. The previously missing field could result in incorrect behavior or crashes. #2370pathconfig_warnings and program_name fields of PyConfig on 3.10+. Previously, the order of the fields was swapped and this could lead to incorrect behavior or crashes. #2370Add PyTzInfoAccess trait for safe access to time zone information. #2263
PyTzInfoAccess trait for safe access to time zone information. #2263generate-abi3-import-lib feature to auto-generate python3.dll import libraries for Windows. #2282PyDateTime_BaseTime and PyDateTime_BaseDateTime. #2294FromPyObject::extract which is common when functions accept multiple distinct types. #2279libpython link name for CPython 3.7 on Unix. #2288PyDateTime_DATE_GET_TZINFO or PyDateTime_TIME_GET_TZINFO on datetime or time without a tzinfo. #2289n breaking serialization of the interpreter configuration on Windows since PyO3 0.16.3. #2299Deprecate pyo3_build_config::cross_compiling in favor of pyo3_build_config::cross_compiling_from_to. #2253
parking_lot dependency supported versions to include 0.12. #2239pyo3_build_config::InterpreterConfig to run Python scripts using the configured executable. #2092as_bytes method to Py<PyBytes>. #2235PyType_FromModuleAndSpec, PyType_GetModule, PyType_GetModuleState and PyModule_AddType. #2250pyo3_build_config::cross_compiling_from_to as a helper to detect when PyO3 is cross-compiling. #2253#[pyclass(mapping)] option to leave sequence slots empty in container implementations. #2265PyString::intern to enable usage of the Python's built-in string interning. #2268intern! macro which can be used to amortize the cost of creating Python strings by storing them inside a GILOnceCell. #2269PYO3_CROSS_PYTHON_IMPLEMENTATION environment variable for selecting the default cross Python implementation. #2272#[pyo3(crate = "...", text_signature = "...")] options to be used directly in #[pyclass(crate = "...", text_signature = "...")]. #2234PYO3_CROSS_LIB_DIR environment variable optional when cross compiling. #2241METH_FASTCALL calling convention as limited API on Python 3.10. #2250pyo3_build_config::cross_compiling in favor of pyo3_build_config::cross_compiling_from_to. #2253abi3-py310 feature: use Python 3.10 ABI when available instead of silently falling back to the 3.9 ABI. #2242PYO3_CROSS_LIB_DIR is set for some host/target combinations. #2232syn to require minimal patch version 1.0.56. #2240Warn when modules are imported on PyPy 3.7 versions older than PyPy 7.3.8, as they are known to have binary compatibility issues. #2217
Extend hashbrown optional dependency supported versions to include 0.12. #2197
Add #[pyo3(crate = "some::path")] option to all attribute macros (except the deprecated #[pyproto]). #2022
indoc optional dependency to 1.0. #2004abi3-py36 feature. #2006pyo3-build-config no longer enables the resolve-config feature by default. #2008inventory optional dependency to 0.2. #2019paste dependency. #2081pyo3::ffi are now a re-export of a separate pyo3-ffi crate. #2126PyCapsule type exposing the Capsule API. #1980pyo3_build_config::Sysconfigdata and supporting APIs. #1996Py::setattr method. #2009#[pyo3(crate = "some::path")] option to all attribute macros (except the deprecated #[pyproto]). #2022create_exception! macro to take an optional docstring. #2027#[pyclass] for fieldless (aka C-like) enums. #2034__getbuffer__ and __releasebuffer__ to #[pymethods]. #2067wrap_pyfunction and wrap_pymodule. #2081wrap_pyfunction! to wrap a #[pyfunction] implemented in a different Rust module or crate. #2091PyAny::contains method (in operator for PyAny). #2115PyMapping::contains method (in operator for PyMapping). #2133__traverse__ and __clear__ to #[pymethods]. #2159from_py_with on struct tuples and enums to override the default from-Python conversion. #2181eq, ne, lt, le, gt, ge methods to PyAny that wrap rich_compare. #2175Py::is and PyAny::is methods to check for object identity. #2183__getattribute__ magic method. #2187PyType::is_subclass, PyErr::is_instance and PyAny::is_instance now operate run-time type object instead of a type known at compile-time. The old behavior is still available as PyType::is_subclass_of, PyErr::is_instance_of and PyAny::is_instance_of. #1985PyErr (the old names are just marked deprecated for now): #2026
pytype -> get_typepvalue -> value (and deprecate equivalent instance)ptraceback -> tracebackfrom_instance -> from_valueinto_instance -> into_valuePyErr::new_type now takes an optional docstring and now returns PyResult<Py<PyType>> rather than a ffi::PyTypeObject pointer. #2027PyType::is_instance; it is inconsistent with other is_instance methods in PyO3. Instead of typ.is_instance(obj), use obj.is_instance(typ). #2031__getitem__, __setitem__ and __delitem__ in #[pymethods] now implement both a Python mapping and sequence by default. #2065#[derive(FromPyObject)] for enums. #2068wrap_pyfunction and wrap_pymodule. #2081__ipow__ magic method. #2083_PyCFunctionFast. #2126PyDateTimeAPI and PyDateTime_TimeZone_UTC are now unsafe functions instead of statics. #2126PyDateTimeAPI does not implicitly call PyDateTime_IMPORT anymore to reflect the original Python API more closely. Before the first call to PyDateTime_IMPORT a null pointer is returned. Therefore before calling any of the following FFI functions PyDateTime_IMPORT must be called to avoid undefined behavior: #2126
PyDateTime_TimeZone_UTCPyDate_CheckPyDate_CheckExactPyDateTime_CheckPyDateTime_CheckExactPyTime_CheckPyTime_CheckExactPyDelta_CheckPyDelta_CheckExactPyTZInfo_CheckPyTZInfo_CheckExactPyDateTime_FromTimestampPyDate_FromTimestampgc option for pyclass (e.g. #[pyclass(gc)]). Just implement a __traverse__ #[pymethod]. #2159ml_meth field of PyMethodDef is now represented by the PyMethodDefPointer union. 2166#[pyproto] traits. #2173Default impl for PyMethodDef. #2166PartialEq impl for Py and PyAny (use the new is instead). #2183PyObject_HasAttr on PyPy. #2025PyErr::into_value. #2026needless-option-as-deref in code generated by #[pyfunction] and #[pymethods]. #2040PySlice::indices. #2061wrap_pymodule! macro using the wrong name for a #[pymodule] with a #[pyo3(name = "..")] attribute. #2081#[pymethods] accepting implementations with the wrong number of arguments. #2083#[pyfunction] generated code when a required argument following an Option was not provided. #2093ExactSizeIterator implementations. #2124PyCMethod_New on Python 3.9 and up. #2143_PyLong_NumBits and _PyLong_AsByteArray on PyPy. #2146AsPyPointer for Option<T>. #2160_PyLong_NumBits to return size_t instead of c_int. #2161TypeError thrown when argument parsing failed missing the originating causes. 2177Backport of PyPy 3.9 support from PyO3 0.16. #2262
Add implementations for Py::as_ref and Py::into_ref for Py , Py and Py . #1682
Py::as_ref and Py::into_ref for Py<PySequence>, Py<PyIterator> and Py<PyMapping>. #1682PyTraceback type to represent and format Python tracebacks. #1977#[classattr] constants with a known magic method name (which is lowercase) no longer trigger lint warnings expecting constants to be uppercase. #1971#[classattr] by functions with the name of a known magic method. #1971catch_unwind in allow_threads which can cause fatal crashes. #1989__get__ implementation when accessing descriptor on type object. #1997Deprecate PyTuple::split_from. #1804
pyo3's Cargo.toml now advertises links = "python" to inform Cargo that it links against libpython. #1819anyhow feature to convert anyhow::Error into PyErr. #1822eyre feature to convert eyre::Report into PyErr. #1893PyList::get_item_unchecked and PyTuple::get_item_unchecked to get items without bounds checks. #1733#[doc = include_str!(...)] attributes on Rust 1.54 and up. #1746PyAny::py as a convenience for PyNativeType::py. #1751std::ops::Index<usize> for PyList, PyTuple and PySequence. #1825std::ops::Index for PyList, PyTuple and PySequence. #1829PyMapping type to represent the Python mapping protocol. #1844PyList and PyTuple. #1849as_sequence methods to PyList and PyTuple. #1860#[pymethods], intended as a replacement for #[pyproto]. #1864abi3-py310 feature. #1889PyCFunction::new_closure to create a Python function from a Rust closure. #1901#[pyfunction]. #1925PyErr::take to attempt to fetch a Python exception if present. #1957PyList, PyTuple and PySequence's APIs now accepts only usize indices instead of isize.
#1733, #1802,
#1803PyList::get_item and PyTuple::get_item now return PyResult<&PyAny> instead of panicking. #1733PySequence::in_place_repeat and PySequence::in_place_concat now return PyResult<&PySequence> instead of PyResult<()>, which is needed in case of immutable sequences such as tuples. #1803PySequence::get_slice now returns PyResult<&PySequence> instead of PyResult<&PyAny>. #1829PyTuple::split_from. #1804PyTuple::slice, new method PyTuple::get_slice added with usize indices. #1828PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags when building for Python 3.9. #1830PyParser_ASTFromString, PyParser_ASTFromStringObject, PyParser_ASTFromFile, PyParser_ASTFromFileObject, PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags, PyParser_SimpleParseString, PyParser_SimpleParseFile, Py_SymtableString, and Py_SymtableStringObject. #1830#[pymethods] now handles magic methods similarly to #[pyproto]. In the future, #[pyproto] may be deprecated. #1864PySys_AddWarnOption, PySys_AddWarnOptionUnicode and PySys_HasWarnOptions. #1887#[call] attribute in favor of using fn __call__. #1929_PyImport_FindExtensionObject on Python 3.10. #1942PyErr::fetch to panic in debug mode if no exception is present. #1957Python::with_gil with Python initialized but threading not initialized. #1874python3.dll when cross-compiling to Windows with abi3. #1880PyTuple_ClearFreeList incorrectly being present for Python 3.9 and up. #1887#[derive(FromPyObject)] for enums. #1888__mod__ magic method fallback to __rmod__. #1934._PyImport_FindExtensionObject on Python 3.10. #1942Make pyo3_build_config::InterpreterConfig and subfields public. #1848
Your coding agent can read these notes before it upgrades. Set up the MCP server →