All notable changes to this project will be documented in this file. For help with updating to new PyO3 versions, please see the migration guide.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
To see unreleased changes, please see the CHANGELOG on the main branch guide.
0.22.2 - 2024-07-17
- Require opt-in to freethreaded Python using the
UNSAFE_PYO3_BUILD_FREE_THREADED=1
environment variable (it is not yet supported by PyO3). #4327
- Use FFI function calls for reference counting on all abi3 versions. #4324
#[pymodule(...)]
now directly accepts all relevant#[pyo3(...)]
options. #4330
- Fix compile failure in declarative
#[pymodule]
under presence of#![no_implicit_prelude]
. #4328 - Fix compile failure due to c-string literals on Rust < 1.79. #4353
0.22.1 - 2024-07-06
- Add
#[pyo3(submodule)]
option for declarative#[pymodule]
s. #4301 - Implement
PartialEq<bool>
forBound<'py, PyBool>
. #4305
- Return
NotImplemented
instead of raisingTypeError
from generated equality method when comparing different types. #4287 - Handle full-path
#[pyo3::prelude::pymodule]
and similar for#[pyclass]
and#[pyfunction]
in declarative modules.#4288 - Fix 128-bit int regression on big-endian platforms with Python <3.13. #4291
- Stop generating code that will never be covered with declarative modules. #4297
- Fix invalid deprecation warning for trailing optional on
#[setter]
function. #4304
0.22.0 - 2024-06-24
- Update
heck
dependency to 0.5. #3966 - Extend range of supported versions of
chrono-tz
optional dependency to include version 0.10. #4061 - Update MSRV to 1.63. #4129
- Add optional
num-rational
feature to add conversions with Python'sfractions.Fraction
. #4148 - Support Python 3.13. #4184
- Add
PyWeakref
,PyWeakrefReference
andPyWeakrefProxy
. #3835 - Support
#[pyclass]
on enums that have tuple variants. #4072 - Add support for scientific notation in
Decimal
conversion. #4079 - Add
pyo3_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 - Add
#[pyo3(constructor = (...))]
to customize the generated constructors for complex enum variants. #4158 - Add
PyType::module
, which always matches Python__module__
. #4196 - Add
PyType::fully_qualified_name
which matches the "fully qualified name" defined in PEP 737. #4196 - Add
PyTypeMethods::mro
andPyTypeMethods::bases
. #4197 - Add
#[pyclass(ord)]
to implement ordering based onPartialOrd
. #4202 - Implement
ToPyObject
andIntoPy<PyObject>
forPyBackedStr
andPyBackedBytes
. #4205 - Add
#[pyclass(hash)]
option to implement__hash__
in terms of theHash
implementation #4206 - Add
#[pyclass(eq)]
option to generate__eq__
based onPartialEq
, and#[pyclass(eq_int)]
for simple enums to implement equality based on their discriminants. #4210 - Implement
From<Bound<'py, T>>
forPyClassInitializer<T>
. #4214 - Add
as_super
methods toPyRef
andPyRefMut
for accesing the base class by reference. #4219 - Implement
PartialEq<str>
forBound<'py, PyString>
. #4245 - Implement
PyModuleMethods::filename
on PyPy. #4249 - Implement
PartialEq<[u8]>
forBound<'py, PyBytes>
. #4250 - Add
pyo3_ffi::c_str
macro to create&'static CStr
on Rust versions which don't have 1.77'sc""
literals. #4255 - Support
bool
conversion withnumpy
2.0'snumpy.bool
type #4258 - Add
PyAnyMethods::{bitnot, matmul, floor_div, rem, divmod}
. #4264
- Change the type of
PySliceIndices::slicelength
and thelength
parameter ofPySlice::indices()
. #3761 - Deprecate implicit default for trailing optional arguments #4078
Clone
ing pointers into the Python heap has been moved behind thepy-clone
feature, as it must panic without the GIL being held as a soundness fix. #4095- Add
#[track_caller]
to allPy<T>
,Bound<'py, T>
andBorrowed<'a, 'py, T>
methods which can panic. #4098 - Change
PyAnyMethods::dir
to be fallible and returnPyResult<Bound<'py, PyList>>
(and similar forPyAny::dir
). #4100 - The global reference pool (to track pending reference count decrements) is now initialized lazily to avoid the overhead of taking a mutex upon function entry when the functionality is not actually used. #4178
- Emit error messages when using
weakref
ordict
when compiling forabi3
for Python older than 3.9. #4194 - Change
PyType::name
to always match Python__name__
. #4196 - Remove CPython internal ffi call for complex number including: add, sub, mul, div, neg, abs, pow. Added PyAnyMethods::{abs, pos, neg} #4201
- Deprecate implicit integer comparision for simple enums in favor of
#[pyclass(eq_int)]
. #4210 - Set the
module=
attribute of declarative modules' child#[pymodule]
s and#[pyclass]
es. #4213 - Set the
module
option for complex enum variants from the value set on the complex enummodule
. #4228 - Respect the Python "limited API" when building for the
abi3
feature on PyPy or GraalPy. #4237 - Optimize code generated by
#[pyo3(get)]
on#[pyclass]
fields. #4254 PyCFunction::new
,PyCFunction::new_with_keywords
andPyCFunction::new_closure
now take&'static CStr
name and doc arguments (previously was&'static str
). #4255- The
experimental-declarative-modules
feature is now stabilized and available by default. #4257
- Fix panic when
PYO3_CROSS_LIB_DIR
is set to a missing path. #4043 - Fix a compile error when exporting an exception created with
create_exception!
living in a different Rust module using thedeclarative-module
feature. #4086 - Fix FFI definitions of
PY_VECTORCALL_ARGUMENTS_OFFSET
andPyVectorcall_NARGS
to fix a false-positive assertion. #4104 - Disable
PyUnicode_DATA
on PyPy: not exposed by PyPy. #4116 - Correctly handle
#[pyo3(from_py_with = ...)]
attribute on dunder (__magic__
) method arguments instead of silently ignoring it. #4117 - Fix a compile error when declaring a standalone function or class method with a Python name that is a Rust keyword. #4226
- Fix declarative modules discarding doc comments on the
mod
node. #4236 - Fix
__dict__
attribute missing for#[pyclass(dict)]
instances when building forabi3
on Python 3.9. #4251
0.21.2 - 2024-04-16
- Deprecate the
PySet::empty()
gil-ref constructor. #4082
- Fix compile error for
async fn
in#[pymethods]
with a&self
receiver and more than one additional argument. #4035 - Improve error message for wrong receiver type in
__traverse__
. #4045 - Fix compile error when exporting a
#[pyclass]
living in a different Rust module using theexperimental-declarative-modules
feature. #4054 - Fix
missing_docs
lint triggering on documented#[pymodule]
functions. #4067 - Fix undefined symbol errors for extension modules on AIX (by linking
libpython
). #4073
0.21.1 - 2024-04-01
- Implement
Send
andSync
forPyBackedStr
andPyBackedBytes
. #4007 - Implement
Clone
,Debug
,PartialEq
,Eq
,PartialOrd
,Ord
andHash
implementation forPyBackedBytes
andPyBackedStr
, andDisplay
forPyBackedStr
. #4020 - Add
import_exception_bound!
macro to import exception types without generating GIL Ref functionality for them. #4027
- Emit deprecation warning for uses of GIL Refs as
#[setter]
function arguments. #3998 - Add
#[inline]
hints on manyBound
andBorrowed
methods. #4024
- Handle
#[pyo3(from_py_with = "")]
in#[setter]
methods #3995 - Allow extraction of
&Bound
in#[setter]
methods. #3998 - Fix some uncovered code blocks emitted by
#[pymodule]
,#[pyfunction]
and#[pyclass]
macros. #4009 - Fix typo in the panic message when a class referenced in
pyo3::import_exception!
does not exist. #4012 - Fix compile error when using an async
#[pymethod]
with a receiver and additional arguments. #4015
0.21.0 - 2024-03-25
- Add support for GraalPy (24.0 and up). #3247
- Add
PyMemoryView
type. #3514 - Allow
async fn
in for#[pyfunction]
and#[pymethods]
, with theexperimental-async
feature. #3540 #3588 #3599 #3931 - Implement
PyTypeInfo
forPyEllipsis
,PyNone
andPyNotImplemented
. #3577 - Support
#[pyclass]
on enums that have non-unit variants. #3582 - Support
chrono
feature withabi3
feature. #3664 FromPyObject
,IntoPy<PyObject>
andToPyObject
are implemented onstd::duration::Duration
#3670- Add
PyString::to_cow
. AddPy<PyString>::to_str
,Py<PyString>::to_cow
, andPy<PyString>::to_string_lossy
, as ways to access Python string data safely beyond the GIL lifetime. #3677 - Add
Bound<T>
andBorrowed<T>
smart pointers as a new API for accessing Python objects. #3686 - Add
PyNativeType::as_borrowed
to convert "GIL refs" to the newBound
smart pointer. #3692 - Add
FromPyObject::extract_bound
method, to migrateFromPyObject
implementations to the Bound API. #3706 - Add
gil-refs
feature to allow continued use of the deprecated GIL Refs APIs. #3707 - Add methods to
PyAnyMethods
for binary operators (add
,sub
, etc.) #3712 - Add
chrono-tz
feature allowing conversion betweenchrono_tz::Tz
andzoneinfo.ZoneInfo
#3730 - Add FFI definition
PyType_GetModuleByDef
. #3734 - Conversion between
std::time::SystemTime
anddatetime.datetime
#3736 - Add
Py::as_any
andPy::into_any
. #3785 - Add
PyStringMethods::encode_utf8
. #3801 - Add
PyBackedStr
andPyBackedBytes
, as alternatives to&str
and&bytes
where a Python object owns the data. #3802 #3991 - Allow
#[pymodule]
macro on Rustmod
blocks, with theexperimental-declarative-modules
feature. #3815 - Implement
ExactSizeIterator
forset
andfrozenset
iterators onabi3
feature. #3849 - Add
Py::drop_ref
to explicitly drop a `Py`` and immediately decrease the Python reference count if the GIL is already held. #3871 - Allow
#[pymodule]
macro on single argument functions that take&Bound<'_, PyModule>
. #3905 - Implement
FromPyObject
forCow<str>
. #3928 - Implement
Default
forGILOnceCell
. #3971 - Add
PyDictMethods::into_mapping
,PyListMethods::into_sequence
andPyTupleMethods::into_sequence
. #3982
PyDict::from_sequence
now takes a single argument of type&PyAny
(previously took two argumentsPython
andPyObject
). #3532- Deprecate
Py::is_ellipsis
andPyAny::is_ellipsis
in favour ofany.is(py.Ellipsis())
. #3577 - Split some
PyTypeInfo
functionality into new traitsHasPyGilRef
andPyTypeCheck
. #3600 - Deprecate
PyTryFrom
andPyTryInto
traits in favor ofany.downcast()
via thePyTypeCheck
andPyTypeInfo
traits. #3601 - Allow async methods to accept
&self
/&mut self
#3609 FromPyObject
for set types now also acceptfrozenset
objects as input. #3632FromPyObject
forbool
now also accepts NumPy'sbool_
as input. #3638- Add
AsRefSource
associated type toPyNativeType
. #3653 - Rename
.is_true
to.is_truthy
onPyAny
andPy<PyAny>
to clarify that the test is not based on identity with or equality to the True singleton. #3657 PyType::name
is nowPyType::qualname
whereasPyType::name
efficiently accesses the full name which includes the module name. #3660- The
Iter(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 intoIterANextOutput
orOption
any more.Option
can still be used as well and returningNone
will trigger the fast path for__next__
, stopping iteration without having to raise aStopIteration
exception. #3661 - Implement
FromPyObject
onchrono::DateTime<Tz>
for allTz
, not justFixedOffset
andUtc
. #3663 - Add lifetime parameter to
PyTzInfoAccess
trait. For the deprecated gil-ref API, the trait is now implemented for&'py PyTime
and&'py PyDateTime
instead ofPyTime
andPyDate
. #3679 - Calls to
__traverse__
become no-ops for unsendable pyclasses if on the wrong thread, thereby avoiding hard aborts at the cost of potential leakage. #3689 - Include
PyNativeType
inpyo3::prelude
. #3692 - Improve performance of
extract::<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. #3742 - Relax bound of
FromPyObject
forPy<T>
to justT: PyTypeCheck
. #3776 PySet
andPyFrozenSet
iterators now always iterate the equivalent ofiter(set)
. (A "fast path" with no noticeable performance benefit was removed.) #3849- Move implementations of
FromPyObject
for&str
,Cow<str>
,&[u8]
andCow<[u8]>
onto a temporary traitFromPyObjectBound
whengil-refs
feature is deactivated. #3928 - Deprecate
GILPool
,Python::with_pool
, andPython::new_pool
. #3947
- Remove all functionality deprecated in PyO3 0.19. #3603
- Match PyPy 7.3.14 in removing PyPy-only symbol
Py_MAX_NDIMS
in favour ofPyBUF_MAX_NDIM
. #3757 - Fix segmentation fault using
datetime
types when an invaliddatetime
module is on sys.path. #3818 - Fix
non_local_definitions
lint warning triggered by many PyO3 macros. #3901 - Disable
PyCode
andPyCode_Type
on PyPy:PyCode_Type
is not exposed by PyPy. #3934
0.21.0-beta.0 - 2024-03-10
Prerelease of PyO3 0.21. See the GitHub diff for what changed between 0.21.0-beta.0 and the final release.
0.20.3 - 2024-02-23
- Add
portable-atomic
dependency. #3619 - Check maximum version of Python at build time and for versions not yet supported require opt-in to the
abi3
stable ABI by the environment variablePYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
. #3821
- Use
portable-atomic
to support platforms without 64-bit atomics. #3619 - Fix compilation failure with
either
feature enabled withoutexperimental-inspect
enabled. #3834
0.20.2 - 2024-01-04
- Pin
pyo3
andpyo3-ffi
dependencies onpyo3-build-config
to require the same patch version, i.e.pyo3
0.20.2 requires exactlypyo3-build-config
0.20.2. #3721
- Fix compile failure when building
pyo3
0.20.0 with latestpyo3-build-config
0.20.X. #3724 - Fix docs.rs build. #3722
0.20.1 - 2023-12-30
- Add optional
either
feature to add conversions foreither::Either<L, R>
sum type. #3456 - Add optional
smallvec
feature to add conversions forsmallvec::SmallVec
. #3507 - Add
take
andinto_inner
methods toGILOnceCell
#3556 #[classmethod]
methods can now also receivePy<PyType>
as their first argument. #3587#[pyfunction(pass_module)]
can now also receivePy<PyModule>
as their first argument. #3587- Add
traverse
method toGILProtected
. #3616 - Added
abi3-py312
feature #3687
- Fix minimum version specification for optional
chrono
dependency. #3512 - Silenced new
clippy::unnecessary_fallible_conversions
warning when using aPy<Self>
self
receiver. #3564
0.20.0 - 2023-10-11
- Dual-license PyO3 under either the Apache 2.0 OR the MIT license. This makes the project GPLv2 compatible. #3108
- Update MSRV to Rust 1.56. #3208
- Bump
indoc
dependency to 2.0 andunindent
dependency to 0.2. #3237 - Bump
syn
dependency to 2.0. #3239 - Drop support for debug builds of Python 3.7. #3387
- Bump
chrono
optional dependency to require 0.4.25 or newer. #3427 - Support Python 3.12. #3488
- Support
__lt__
,__le__
,__eq__
,__ne__
,__gt__
and__ge__
in#[pymethods]
. #3203 - Add FFI definition
Py_GETENV
. #3336 - Add
as_ptr
andinto_ptr
inherent methods forPy
,PyAny
,PyRef
, andPyRefMut
. #3359 - Implement
DoubleEndedIterator
forPyTupleIterator
andPyListIterator
. #3366 - Add
#[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"
. #3384 - Add FFI definitions
PyObject_GC_IsTracked
andPyObject_GC_IsFinalized
on Python 3.9 and up (PyPy 3.10 and up). #3403 - Add types for
None
,Ellipsis
, andNotImplemented
. #3408 - Add FFI definitions for the
Py_mod_multiple_interpreters
constant and its possible values. #3494 - Add FFI definitions for
PyInterpreterConfig
struct, its constants andPy_NewInterpreterFromConfig
. #3502
- Change
PySet::discard
to returnPyResult<bool>
(previously returned nothing). #3281 - Optimize implmentation of
IntoPy
for Rust tuples to Python tuples. #3321 - Change
PyDict::get_item
to no longer suppress arbitrary exceptions (the return type is nowPyResult<Option<&PyAny>>
instead ofOption<&PyAny>
), and deprecatePyDict::get_item_with_error
. #3330 - Deprecate FFI definitions which are deprecated in Python 3.12. #3336
AsPyPointer
is now anunsafe trait
. #3358- Accept all
os.PathLike
values in implementation ofFromPyObject
forPathBuf
. #3374 - Add
__builtins__
to globals inpy.run()
andpy.eval()
if they're missing. #3378 - Optimize implementation of
FromPyObject
forBigInt
andBigUint
. #3379 PyIterator::from_object
andPyByteArray::from
now take a single argument of type&PyAny
(previously took two argumentsPython
andAsPyPointer
). #3389- Replace
AsPyPointer
withAsRef<PyAny>
as a bound in the blanket implementation ofFrom<&T> for PyObject
. #3391 - Replace blanket
impl IntoPy<PyObject> for &T where T: AsPyPointer
with implementations ofimpl IntoPy<PyObject>
for&PyAny
,&T where T: AsRef<PyAny>
, and&Py<T>
. #3393 - Preserve
std::io::Error
kind in implementation ofFrom<std::io::IntoInnerError>
forPyErr
#3396 - Try to select a relevant
ErrorKind
in implementation ofFrom<PyErr>
forOSError
subclass. #3397 - Retrieve the original
PyErr
in implementation ofFrom<std::io::Error>
forPyErr
if thestd::io::Error
has been built using a Python exception (previously would create a new exception wrapping thestd::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. #3446- Truncate leap-seconds and warn when converting
chrono
types to Pythondatetime
types (datetime
cannot represent leap-seconds). #3458 Err
returned from#[pyfunction]
will now have a non-None__context__
if called from inside acatch
block. #3455- Deprecate undocumented
#[__new__]
form of#[new]
attribute. #3505
- Remove all functionality deprecated in PyO3 0.18, including
#[args]
attribute for#[pymethods]
. #3232 - Remove
IntoPyPointer
trait in favour ofinto_ptr
inherent methods. #3385
- Handle exceptions properly in
PySet::discard
. #3281 - The
PyTupleIterator
type returned byPyTuple::iter
is now public and hence can be named by downstream crates. #3366 - Linking of
PyOS_FSPath
on PyPy. #3374 - Fix memory leak in
PyTypeBuilder::build
. #3401 - Disable removed FFI definitions
_Py_GetAllocatedBlocks
,_PyObject_GC_Malloc
, and_PyObject_GC_Calloc
on Python 3.11 and up. #3403 - Fix
ResourceWarning
and crashes related to GC when running with debug builds of CPython. #3404 - Some-wrapping of
Option<T>
default arguments will no longer re-wrapSome(T)
or expressions evaluating toNone
. #3461 - Fix
IterNextOutput::Return
not returning a value on PyPy. #3471 - Emit compile errors instead of ignoring macro invocations inside
#[pymethods]
blocks. #3491 - Emit error on invalid arguments to
#[new]
,#[classmethod]
,#[staticmethod]
, and#[classattr]
. #3484 - Disable
PyMarshal_WriteObjectToString
fromPyMarshal_ReadObjectFromString
with theabi3
feature. #3490 - Fix FFI definitions for
_PyFrameEvalFunction
on Python 3.11 and up (it now receives a_PyInterpreterFrame
opaque struct). #3500
0.19.2 - 2023-08-01
- Add FFI definitions
PyState_AddModule
,PyState_RemoveModule
andPyState_FindModule
for PyPy 3.9 and up. #3295 - Add FFI definitions
_PyObject_CallFunction_SizeT
and_PyObject_CallMethod_SizeT
. #3297 - Add a "performance" section to the guide collecting performance-related tricks and problems. #3304
- Add
PyErr::Display
for all Python versions, and FFI symbolPyErr_DisplayException
for Python 3.12. #3334 - Add FFI definition
PyType_GetDict()
for Python 3.12. #3339 - Add
PyAny::downcast_exact
. #3346 - Add
PySlice::full()
to construct a full slice (::
). #3353
- Update
PyErr
for 3.12 betas to avoid deprecated ffi methods. #3306 - Update FFI definitions of
object.h
for Python 3.12.0b4. #3335 - Update
pyo3::ffi
struct definitions to be compatible with 3.12.0b4. #3342 - Optimize conversion of
float
tof64
(andPyFloat::value
) on non-abi3 builds. #3345
- Fix timezone conversion bug for FixedOffset datetimes that were being incorrectly converted to and from UTC. #3269
- Fix
SystemError
raised inPyUnicodeDecodeError_Create
on PyPy 3.10. #3297 - Correct FFI definition
Py_EnterRecursiveCall
to returnc_int
(was incorrectly returning()
). #3300 - Fix case where
PyErr::matches
andPyErr::is_instance
returned results inconsistent withPyErr::get_type
. #3313 - Fix loss of panic message in
PanicException
when unwinding after the exception was "normalized". #3326 - Fix
PyErr::from_value
andPyErr::into_value
losing traceback on conversion. #3328 - Fix reference counting of immortal objects on Python 3.12.0b4. #3335
0.19.1 - 2023-07-03
- Extend range of supported versions of
hashbrown
optional dependency to include version 0.14 #3258 - Extend range of supported versions of
indexmap
optional dependency to include version 2. #3277 - Support PyPy 3.10. #3289
- Add
pyo3::types::PyFrozenSetBuilder
to allow building aPyFrozenSet
item by item. #3156 - Add support for converting to and from Python's
ipaddress.IPv4Address
/ipaddress.IPv6Address
andstd::net::IpAddr
. #3197 - Add support for
num-bigint
feature in combination withabi3
. #3198 - Add
PyErr_GetRaisedException()
,PyErr_SetRaisedException()
to FFI definitions for Python 3.12 and later. #3248 - Add
Python::with_pool
which is a safer but more limited alternative toPython::new_pool
. #3263 - Add
PyDict::get_item_with_error
on PyPy. #3270 - Allow
#[new]
methods may to returnPy<Self>
in order to return existing instances. #3287
- Fix conversion of classes implementing
__complex__
toComplex
when usingabi3
or PyPy. #3185 - Stop suppressing unrelated exceptions in
PyAny::hasattr
. #3271 - Fix memory leak when creating
PySet
orPyFrozenSet
or returning types converted into these internally, e.g.HashSet
orBTreeSet
. #3286
0.19.0 - 2023-05-31
- Correct dependency on syn to version 1.0.85 instead of the incorrect version 1.0.56. #3152
- Accept
text_signature
option (and automatically generate signature) for#[new]
in#[pymethods]
. #2980 - Add support for converting to and from Python's
decimal.Decimal
andrust_decimal::Decimal
. #3016 - Add
#[pyo3(from_item_all)]
when derivingFromPyObject
to specifyget_item
as getter for all fields. #3120 - Add
pyo3::exceptions::PyBaseExceptionGroup
for Python 3.11, and corresponding FFI definitionPyExc_BaseExceptionGroup
. #3141 - Accept
#[new]
with#[classmethod]
to create a constructor which receives a (subtype's) class/PyType
as its first argument. #3157 - Add
PyClass::get
andPy::get
for GIL-indepedent access to classes with#[pyclass(frozen)]
. #3158 - Add
PyAny::is_exact_instance
andPyAny::is_exact_instance_of
. #3161
PyAny::is_instance_of::<T>(obj)
is now equivalent toT::is_type_of(obj)
, and now returnsbool
instead ofPyResult<bool>
. #2881- Deprecate
text_signature
option on#[pyclass]
structs. #2980 - No longer wrap
anyhow::Error
/eyre::Report
containing a basicPyErr
without a chain in aPyRuntimeError
. #3004 -
- Change
#[getter]
and#[setter]
to use a common call "trampoline" to slightly reduce generated code size and compile times. #3029
- Change
- Improve default values for str, numbers and bool in automatically-generated
text_signature
. #3050 - Improve default value for
None
in automatically-generatedtext_signature
. #3066 - Rename
PySequence::list
andPySequence::tuple
toPySequence::to_list
andPySequence::to_tuple
. (The old names continue to exist as deprecated forms.) #3111 - Extend the lifetime of the GIL token returned by
PyRef::py
andPyRefMut::py
to match the underlying borrow. #3131 - Safe access to the GIL, for example via
Python::with_gil
, is now locked inside of implementations of the__traverse__
slot. #3168
- Remove all functionality deprecated in PyO3 0.17, most prominently
Python::acquire_gil
is replaced byPython::with_gil
. #2981
- Correct FFI definitions
PyGetSetDef
,PyMemberDef
,PyStructSequence_Field
andPyStructSequence_Desc
to have*const c_char
members forname
anddoc
(not*mut c_char
). #3036 - Fix panic on
fmt::Display
, instead return"<unprintable object>"
string and report error viasys.unraisablehook()
#3062 - Fix a compile error of "temporary value dropped while borrowed" when
#[pyfunction]
s take references into#[pyclass]
es #3142 - Fix crashes caused by PyO3 applying deferred reference count updates when entering a
__traverse__
implementation. #3168 - Forbid running the
Drop
implementations of unsendable classes on other threads. #3176 - Fix a compile error when
#[pymethods]
items come from somewhere else (for example, as a macro argument) and a custom receiver likePy<Self>
is used. #3178
0.18.3 - 2023-04-13
- Add
GILProtected<T>
to mediate concurrent access to a value using Python's global interpreter lock (GIL). #2975 - Support
PyASCIIObject
/PyUnicode
and associated methods on big-endian architectures. #3015 - Add FFI definition
_PyDict_Contains_KnownHash()
for CPython 3.10 and up. #3088
- Fix compile error for
#[pymethods]
and#[pyfunction]
called "output". #3022 - Fix compile error in generated code for magic methods implemented as a
#[staticmethod]
. #3055 - Fix
is_instance
forPyDateTime
(would incorrectly check for aPyDate
). #3071 - Fix upstream deprecation of
PyUnicode_InternImmortal
since Python 3.10. #3071
0.18.2 - 2023-03-24
- Disable default features of
chrono
to avoid depending ontime
v0.1.x. #2939
- Implement
IntoPy<PyObject>
,ToPyObject
andFromPyObject
forCow<[u8]>
to efficiently handle bothbytes
andbytearray
objects. #2899 - Implement
IntoPy<PyObject>
,ToPyObject
andFromPyObject
forCell<T>
. #3014 - Add
PyList::to_tuple()
, as a convenient and efficient conversion from lists to tuples. #3042 - Add
PyTuple::to_list()
, as a convenient and efficient conversion from tuples to lists. #3044
- Optimize
PySequence
conversion forlist
andtuple
inputs. #2944 - Improve exception raised when creating
#[pyclass]
type object fails during module import. #2947 - Optimize
PyMapping
conversion fordict
inputs. #2954 - Allow
create_exception!
to take adotted.module
to place the exception in a submodule. #2979
- Fix a reference counting race condition affecting
PyObject
s cloned inallow_threads
blocks. #2952 - Fix
clippy::redundant_closure
lint on default arguments in#[pyo3(signature = (...))]
annotations. #2990 - Fix
non_snake_case
lint on generated code in#[pyfunction]
macro. #2993 - Fix some FFI definitions for the upcoming PyPy 3.10 release. #3031
0.18.1 - 2023-02-07
- Add
PyErr::write_unraisable()
. #2889 - Add
Python::Ellipsis()
andPyAny::is_ellipsis()
methods. #2911 - Add
PyDict::update()
andPyDict::update_if_missing()
methods. #2912
- FFI definition
PyIter_Check
on CPython 3.7 is now implemented ashasattr(type(obj), "__next__")
, which works correctly on all platforms and adds support forabi3
. #2914 - Warn about unknown config keys in
PYO3_CONFIG_FILE
instead of denying. #2926
- Send errors returned by
__releasebuffer__
tosys.unraisablehook
rather than causingSystemError
. #2886 - Fix downcast to
PyIterator
succeeding for Python classes which did not implement__next__
. #2914 - Fix segfault in
__traverse__
when visitingNone
fields ofOption<T: AsPyPointer>
. #2921 - Fix
#[pymethods(crate = "...")]
option being ignored. #2923 - Link against
pythonXY_d.dll
for debug Python builds on Windows. #2937
0.18.0 - 2023-01-17
- Relax
indexmap
optional depecency to allow>= 1.6, < 2
. #2849 - Relax
hashbrown
optional dependency to allow>= 0.9, < 0.14
. #2875 - Update
memoffset
dependency to 0.8. #2875
- Add
GILOnceCell::get_or_try_init
for fallibleGILOnceCell
initialization. #2398 - Add experimental feature
experimental-inspect
withtype_input()
andtype_output()
helpers to get the Python type of any Python-compatible object. #2490 #2882 - The
#[pyclass]
macro can now takeget_all
andset_all
to create getters and setters for every field. #2692 - Add
#[pyo3(signature = (...))]
option for#[pyfunction]
and#[pymethods]
. #2702 pyo3-build-config
: rebuild whenPYO3_ENVIRONMENT_SIGNATURE
environment variable value changes. #2727- Add conversions between non-zero int types in
std::num
and Pythonint
. #2730 - Add
Py::downcast()
as a companion toPyAny::downcast()
, as well asdowncast_unchecked()
for both types. #2734 - Add types for all built-in
Warning
classes as well asPyErr::warn_explicit
. #2742 - Add
abi3-py311
feature. #2776 - Add FFI definition
_PyErr_ChainExceptions()
for CPython. #2788 - Add FFI definitions
PyVectorcall_NARGS
andPY_VECTORCALL_ARGUMENTS_OFFSET
for PyPy 3.8 and up. #2811 - Add
PyList::get_item_unchecked
for PyPy. #2827
- PyO3's macros now emit a much nicer error message if function return values don't implement the required trait(s). #2664
- Use a TypeError, rather than a ValueError, when refusing to treat a str as a Vec. #2685
- Change
PyCFunction::new_closure
to takename
anddoc
arguments. #2686 PyType::is_subclass
,PyErr::is_instance
andPyAny::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- Deprecate
#[args]
attribute and passing "args" specification directly to#[pyfunction]
in favor of the new#[pyo3(signature = (...))]
option. #2702 - Deprecate required arguments after
Option<T>
arguments to#[pyfunction]
and#[pymethods]
without also using#[pyo3(signature)]
to specify whether the arguments should be required or have defaults. #2703 - Change
#[pyfunction]
and#[pymethods]
to use a common call "trampoline" to slightly reduce generated code size and compile times. #2705 PyAny::cast_as()
andPy::cast_as()
are now deprecated in favor ofPyAny::downcast()
and the newPy::downcast()
. #2734- Relax lifetime bounds on
PyAny::downcast()
. #2734 - Automatically generate
__text_signature__
for all Python functions created using#[pyfunction]
and#[pymethods]
. #2784 - Accept any iterator in
PySet::new
andPyFrozenSet::new
. #2795 - Mixing
#[cfg(...)]
and#[pyo3(...)]
attributes on#[pyclass]
struct fields will now work. #2796 - Re-enable
PyFunction
on when building for abi3 or PyPy. #2838 - Improve
derive(FromPyObject)
to useintern!
when applicable for#[pyo3(item)]
. #2879
- Remove the deprecated
pyproto
feature,#[pyproto]
macro, and all accompanying APIs. #2587 - Remove all functionality deprecated in PyO3 0.16. #2843
- Disable
PyModule::filename
on PyPy. #2715 PyCodeObject
is now once again defined with fields on Python 3.7. #2726- Raise a
TypeError
if#[new]
pymethods with no arguments receive arguments when called from Python. #2749 - Use the
NOARGS
argument calling convention for methods that have a singlepy: Python
argument (as a performance optimization). #2760 - Fix truncation of
isize
values toc_long
inPySlice::new
. #2769 - Fix soundness issue with FFI definition
PyUnicodeDecodeError_Create
on PyPy leading to indeterminate behavior (typically aTypeError
). #2772 - Allow functions taking
**kwargs
to accept keyword arguments which share a name with a positional-only argument (as permitted by PEP 570). #2800 - Fix unresolved symbol for
PyObject_Vectorcall
on PyPy 3.9 and up. #2811 - Fix memory leak in
PyCFunction::new_closure
. #2842
0.17.3 - 2022-11-01
- Support 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 is the first version tested against Python 3.11.0.) #2708
- Implemented
ExactSizeIterator
forPyListIterator
,PyDictIterator
,PySetIterator
andPyFrozenSetIterator
. #2676
- Fix regression of
impl FromPyObject for [T; N]
no longer accepting types passingPySequence_Check
, e.g. NumPy arrays, since version 0.17.0. This the same fix that was appliedimpl FromPyObject for Vec<T>
in version 0.17.1 extended to fixed-size arrays. #2675 - Fix UB in
FunctionDescription::extract_arguments_fastcall
due to creating slices from a null pointer. #2687
0.17.2 - 2022-10-04
- Added optional
chrono
feature to convertchrono
types into types in thedatetime
module. #2612
- Add support for
num-bigint
feature onPyPy
. #2626
- Correctly implement
__richcmp__
for enums, fixing__ne__
returning always returningTrue
. #2622 - Fix compile error since 0.17.0 with
Option<&SomePyClass>
argument with a default. #2630 - Fix regression of
impl FromPyObject for Vec<T>
no longer accepting types passingPySequence_Check
, e.g. NumPy arrays, since 0.17.0. #2631
0.17.1 - 2022-08-28
- Fix visibility of
PyDictItems
,PyDictKeys
, andPyDictValues
types added in PyO3 0.17.0. - Fix compile failure when using
#[pyo3(from_py_with = "...")]
attribute on an argument of typeOption<T>
. #2592 - Fix clippy
redundant-closure
lint on**kwargs
arguments for#[pyfunction]
and#[pymethods]
. #2595
0.17.0 - 2022-08-23
- Update inventory dependency to
0.3
(themultiple-pymethods
feature now requires Rust 1.62 for correctness). #2492
- Add
timezone_utc
. #1588 - Implement
ToPyObject
for[T; N]
. #2313 - Add
PyDictKeys
,PyDictValues
andPyDictItems
Rust types. #2358 - Add
append_to_inittab
. #2377 - Add FFI definition
PyFrame_GetCode
. #2406 - Add
PyCode
andPyFrame
high level objects. #2408 - Add FFI definitions
Py_fstring_input
,sendfunc
, and_PyErr_StackItem
. #2423 - Add
PyDateTime::new_with_fold
,PyTime::new_with_fold
,PyTime::get_fold
, andPyDateTime::get_fold
for PyPy. #2428 - Add
#[pyclass(frozen)]
. #2448 - Accept
#[pyo3(name)]
on enum variants. #2457 - Add
CompareOp::matches
to implement__richcmp__
as the result of a Ruststd::cmp::Ordering
comparison. #2460 - Add
PySuper
type. #2486 - Support PyPy on Windows with the
generate-import-lib
feature. #2506 - Add FFI definitions
Py_EnterRecursiveCall
andPy_LeaveRecursiveCall
. #2511 - Add
PyDict::get_item_with_error
. #2536 - Add
#[pyclass(sequence)]
option. #2567
- Change datetime constructors taking a
tzinfo
to takeOption<&PyTzInfo>
instead ofOption<&PyObject>
:PyDateTime::new
,PyDateTime::new_with_fold
,PyTime::new
, andPyTime::new_with_fold
. #1588 - Move
PyTypeObject::type_object
method to thePyTypeInfo
trait, and deprecate thePyTypeObject
trait. #2287 - Methods of
Py
andPyAny
now acceptimpl IntoPy<Py<PyString>>
rather than just&str
to allow use of theintern!
macro. #2312 - Change the deprecated
pyproto
feature to be opt-in instead of opt-out. #2322 - Emit better error messages when
#[pyfunction]
return types do not implementIntoPy
. #2326 - Require
T: IntoPy
forimpl<T, const N: usize> IntoPy<PyObject> for [T; N]
instead ofT: ToPyObject
. #2326 - Deprecate the
ToBorrowedObject
trait. #2333 - Iterators over
PySet
andPyDict
will now panic if the underlying collection is mutated during the iteration. #2380 - Iterators over
PySet
andPyDict
will now panic if the underlying collection is mutated during the iteration. #2380 - Allow
#[classattr]
methods to be fallible. #2385 - Prevent multiple
#[pymethods]
with the same name for a single#[pyclass]
. #2399 - Fixup
lib_name
when usingPYO3_CONFIG_FILE
. #2404 - Add a message to the
ValueError
raised by the#[derive(FromPyObject)]
implementation for a tuple struct. #2414 - Allow
#[classattr]
methods to takePython
argument. #2456 - Rework
PyCapsule
type to resolve soundness issues: #2485PyCapsule::new
andPyCapsule::new_with_destructor
now takename: Option<CString>
instead of&CStr
.- The destructor
F
inPyCapsule::new_with_destructor
must now beSend
. PyCapsule::get_context
deprecated in favor ofPyCapsule::context
which doesn't take apy: Python<'_>
argument.PyCapsule::set_context
no longer takes apy: Python<'_>
argument.PyCapsule::name
now returnsPyResult<Option<&CStr>>
instead of&CStr
.
FromPyObject::extract
forVec<T>
no longer accepts Pythonstr
inputs. #2500- Ensure each
#[pymodule]
is only initialized once. #2523 pyo3_build_config::add_extension_module_link_args
now also emits linker arguments forwasm32-unknown-emscripten
. #2538- Type checks for
PySequence
andPyMapping
now require inputs to inherit from (or register with)collections.abc.Sequence
andcollections.abc.Mapping
respectively. #2477 - Disable
PyFunction
on when building for abi3 or PyPy. #2542 - Deprecate
Python::acquire_gil
. #2549
- Remove all functionality deprecated in PyO3 0.15. #2283
- Make the
Dict
,WeakRef
andBaseNativeType
members of thePyClass
private implementation details. #2572
- Enable incorrectly disabled FFI definition
PyThreadState_DeleteCurrent
. #2357 - Fix
wrap_pymodule
interactions with name resolution rules: it no longer "sees through" glob imports ofuse submodule::*
whensubmodule::submodule
is a#[pymodule]
. #2363 - Correct FFI definition
PyEval_EvalCodeEx
to take*const *mut PyObject
array arguments instead of*mut *mut PyObject
. #2368 - Fix "raw-ident" structs (e.g.
#[pyclass] struct r#RawName
) incorrectly havingr#
at the start of the class name created in Python. #2395 - Correct FFI definition
Py_tracefunc
to beunsafe extern "C" fn
(was previously safe). #2407 - Fix compile failure with
#[pyo3(from_py_with = "...")]
annotations on a field in a#[derive(FromPyObject)]
struct. #2414 - Fix FFI definitions
_PyDateTime_BaseTime
and_PyDateTime_BaseDateTime
lacking leading underscores in their names. #2421 - Remove FFI definition
PyArena
on Python 3.10 and up. #2421 - Fix FFI definition
PyCompilerFlags
missing membercf_feature_version
on Python 3.8 and up. #2423 - Fix FFI definition
PyAsyncMethods
missing memberam_send
on Python 3.10 and up. #2423 - Fix FFI definition
PyGenObject
having multiple incorrect members on various Python versions. #2423 - Fix FFI definition
PySyntaxErrorObject
missing membersend_lineno
andend_offset
on Python 3.10 and up. #2423 - Fix FFI definition
PyHeapTypeObject
missing memberht_module
on Python 3.9 and up. #2423 - Fix FFI definition
PyFrameObject
having multiple incorrect members on various Python versions. #2424 #2434 - Fix FFI definition
PyTypeObject
missing deprecated fieldtp_print
on Python 3.8. #2428 - Fix FFI definitions
PyDateTime_CAPI
.PyDateTime_Date
,PyASCIIObject
,PyBaseExceptionObject
,PyListObject
, andPyTypeObject
on PyPy. #2428 - Fix FFI definition
_inittab
fieldinitfunc
typo'd asinitfun
. #2431 - Fix FFI definitions
_PyDateTime_BaseTime
and_PyDateTime_BaseDateTime
incorrectly havingfold
member. #2432 - Fix FFI definitions
PyTypeObject
.PyHeapTypeObject
, andPyCFunctionObject
having incorrect members on PyPy 3.9. #2433 - Fix FFI definition
PyGetSetDef
to have*const c_char
fordoc
member (not*mut c_char
). #2439 - Fix
#[pyo3(from_py_with = "...")]
being ignored for 1-element tuple structs and transparent structs. #2440 - Use
memoffset
to avoid UB when computingPyCell
layout. #2450 - Fix incorrect enum names being returned by the generated
repr
for enums renamed by#[pyclass(name = "...")]
#2457 - Fix
PyObject_CallNoArgs
incorrectly being available when building for abi3 on Python 3.9. #2476 - Fix several clippy warnings generated by
#[pyfunction]
arguments. #2503
0.16.6 - 2022-08-23
- Fix soundness issues with
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. #2522PyCapsule::new
andPyCapsule::new_with_destructor
now take ownership of a copy of thename
to resolve a possible use-after-free.PyCapsule::name
now returns an emptyCStr
instead of dereferencing a null pointer if the capsule has no name.- The destructor
F
inPyCapsule::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).
- Panics during drop of panic payload caught by PyO3 will now abort. #2544
0.16.5 - 2022-05-15
- Add an experimental
generate-import-lib
feature to support auto-generating non-abi3 python import libraries for Windows targets. #2364 - Add FFI definition
Py_ExitStatusException
. #2374
- Deprecate experimental
generate-abi3-import-lib
feature in favor of the newgenerate-import-lib
feature. #2364
- Added missing
warn_default_encoding
field toPyConfig
on 3.10+. The previously missing field could result in incorrect behavior or crashes. #2370 - Fixed order of
pathconfig_warnings
andprogram_name
fields ofPyConfig
on 3.10+. Previously, the order of the fields was swapped and this could lead to incorrect behavior or crashes. #2370
0.16.4 - 2022-04-14
- Add
PyTzInfoAccess
trait for safe access to time zone information. #2263 - Add an experimental
generate-abi3-import-lib
feature to auto-generatepython3.dll
import libraries for Windows. #2282 - Add FFI definitions for
PyDateTime_BaseTime
andPyDateTime_BaseDateTime
. #2294
- Improved performance of failing calls to
FromPyObject::extract
which is common when functions accept multiple distinct types. #2279 - Default to "m" ABI tag when choosing
libpython
link name for CPython 3.7 on Unix. #2288 - Allow to compile "abi3" extensions without a working build host Python interpreter. #2293
- Crates depending on PyO3 can collect code coverage via LLVM instrumentation using stable Rust. #2286
- Fix segfault when calling FFI methods
PyDateTime_DATE_GET_TZINFO
orPyDateTime_TIME_GET_TZINFO
ondatetime
ortime
without a tzinfo. #2289 - Fix directory names starting with the letter
n
breaking serialization of the interpreter configuration on Windows since PyO3 0.16.3. #2299
0.16.3 - 2022-04-05
- Extend
parking_lot
dependency supported versions to include 0.12. #2239
- Add methods to
pyo3_build_config::InterpreterConfig
to run Python scripts using the configured executable. #2092 - Add
as_bytes
method toPy<PyBytes>
. #2235 - Add FFI definitions for
PyType_FromModuleAndSpec
,PyType_GetModule
,PyType_GetModuleState
andPyModule_AddType
. #2250 - Add
pyo3_build_config::cross_compiling_from_to
as a helper to detect when PyO3 is cross-compiling. #2253 - Add
#[pyclass(mapping)]
option to leave sequence slots empty in container implementations. #2265 - Add
PyString::intern
to enable usage of the Python's built-in string interning. #2268 - Add
intern!
macro which can be used to amortize the cost of creating Python strings by storing them inside aGILOnceCell
. #2269 - Add
PYO3_CROSS_PYTHON_IMPLEMENTATION
environment variable for selecting the default cross Python implementation. #2272
- Allow
#[pyo3(crate = "...", text_signature = "...")]
options to be used directly in#[pyclass(crate = "...", text_signature = "...")]
. #2234 - Make
PYO3_CROSS_LIB_DIR
environment variable optional when cross compiling. #2241 - Mark
METH_FASTCALL
calling convention as limited API on Python 3.10. #2250 - Deprecate
pyo3_build_config::cross_compiling
in favor ofpyo3_build_config::cross_compiling_from_to
. #2253
- Fix
abi3-py310
feature: use Python 3.10 ABI when available instead of silently falling back to the 3.9 ABI. #2242 - Use shared linking mode when cross compiling against a Framework bundle for macOS. #2233
- Fix panic during compilation when
PYO3_CROSS_LIB_DIR
is set for some host/target combinations. #2232 - Correct dependency version for
syn
to require minimal patch version 1.0.56. #2240
0.16.2 - 2022-03-15
- Warn 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
- Ensure build script of
pyo3-ffi
runs before that ofpyo3
to fix cross compilation. #2224
0.16.1 - 2022-03-05
- Extend
hashbrown
optional dependency supported versions to include 0.12. #2197
- Fix incorrect platform detection for Windows in
pyo3-build-config
. #2198 - Fix regression from 0.16 preventing cross compiling to aarch64 macOS. #2201
0.16.0 - 2022-02-27
- Update MSRV to Rust 1.48. #2004
- Update
indoc
optional dependency to 1.0. #2004 - Drop support for Python 3.6, remove
abi3-py36
feature. #2006 pyo3-build-config
no longer enables theresolve-config
feature by default. #2008- Update
inventory
optional dependency to 0.2. #2019 - Drop
paste
dependency. #2081 - The bindings found in
pyo3::ffi
are now a re-export of a separatepyo3-ffi
crate. #2126 - Support PyPy 3.9. #2143
- Add
PyCapsule
type exposing the Capsule API. #1980 - Add
pyo3_build_config::Sysconfigdata
and supporting APIs. #1996 - Add
Py::setattr
method. #2009 - Add
#[pyo3(crate = "some::path")]
option to all attribute macros (except the deprecated#[pyproto]
). #2022 - Enable
create_exception!
macro to take an optional docstring. #2027 - Enable
#[pyclass]
for fieldless (aka C-like) enums. #2034 - Add buffer magic methods
__getbuffer__
and__releasebuffer__
to#[pymethods]
. #2067 - Add support for paths in
wrap_pyfunction
andwrap_pymodule
. #2081 - Enable
wrap_pyfunction!
to wrap a#[pyfunction]
implemented in a different Rust module or crate. #2091 - Add
PyAny::contains
method (in
operator forPyAny
). #2115 - Add
PyMapping::contains
method (in
operator forPyMapping
). #2133 - Add garbage collection magic magic methods
__traverse__
and__clear__
to#[pymethods]
. #2159 - Add support for
from_py_with
on struct tuples and enums to override the default from-Python conversion. #2181 - Add
eq
,ne
,lt
,le
,gt
,ge
methods toPyAny
that wraprich_compare
. #2175 - Add
Py::is
andPyAny::is
methods to check for object identity. #2183 - Add support for the
__getattribute__
magic method. #2187
PyType::is_subclass
,PyErr::is_instance
andPyAny::is_instance
now operate run-time type object instead of a type known at compile-time. The old behavior is still available asPyType::is_subclass_of
,PyErr::is_instance_of
andPyAny::is_instance_of
. #1985- Rename some methods on
PyErr
(the old names are just marked deprecated for now): #2026pytype
->get_type
pvalue
->value
(and deprecate equivalentinstance
)ptraceback
->traceback
from_instance
->from_value
into_instance
->into_value
PyErr::new_type
now takes an optional docstring and now returnsPyResult<Py<PyType>>
rather than affi::PyTypeObject
pointer. #2027- Deprecate
PyType::is_instance
; it is inconsistent with otheris_instance
methods in PyO3. Instead oftyp.is_instance(obj)
, useobj.is_instance(typ)
. #2031 __getitem__
,__setitem__
and__delitem__
in#[pymethods]
now implement both a Python mapping and sequence by default. #2065- Improve performance and error messages for
#[derive(FromPyObject)]
for enums. #2068 - Reduce generated LLVM code size (to improve compile times) for:
- Respect Rust privacy rules for items wrapped with
wrap_pyfunction
andwrap_pymodule
. #2081 - Add modulo argument to
__ipow__
magic method. #2083 - Fix FFI definition for
_PyCFunctionFast
. #2126 PyDateTimeAPI
andPyDateTime_TimeZone_UTC
are now unsafe functions instead of statics. #2126PyDateTimeAPI
does not implicitly callPyDateTime_IMPORT
anymore to reflect the original Python API more closely. Before the first call toPyDateTime_IMPORT
a null pointer is returned. Therefore before calling any of the following FFI functionsPyDateTime_IMPORT
must be called to avoid undefined behavior: #2126PyDateTime_TimeZone_UTC
PyDate_Check
PyDate_CheckExact
PyDateTime_Check
PyDateTime_CheckExact
PyTime_Check
PyTime_CheckExact
PyDelta_Check
PyDelta_CheckExact
PyTZInfo_Check
PyTZInfo_CheckExact
PyDateTime_FromTimestamp
PyDate_FromTimestamp
- Deprecate the
gc
option forpyclass
(e.g.#[pyclass(gc)]
). Just implement a__traverse__
#[pymethod]
. #2159 - The
ml_meth
field ofPyMethodDef
is now represented by thePyMethodDefPointer
union. 2166 - Deprecate the
#[pyproto]
traits. #2173
- Remove all functionality deprecated in PyO3 0.14. #2007
- Remove
Default
impl forPyMethodDef
. #2166 - Remove
PartialEq
impl forPy
andPyAny
(use the newis
instead). #2183
- Fix undefined symbol for
PyObject_HasAttr
on PyPy. #2025 - Fix memory leak in
PyErr::into_value
. #2026 - Fix clippy warning
needless-option-as-deref
in code generated by#[pyfunction]
and#[pymethods]
. #2040 - Fix undefined behavior in
PySlice::indices
. #2061 - Fix the
wrap_pymodule!
macro using the wrong name for a#[pymodule]
with a#[pyo3(name = "..")]
attribute. #2081 - Fix magic methods in
#[pymethods]
accepting implementations with the wrong number of arguments. #2083 - Fix panic in
#[pyfunction]
generated code when a required argument following anOption
was not provided. #2093 - Fixed undefined behavior caused by incorrect
ExactSizeIterator
implementations. #2124 - Fix missing FFI definition
PyCMethod_New
on Python 3.9 and up. #2143 - Add missing FFI definitions
_PyLong_NumBits
and_PyLong_AsByteArray
on PyPy. #2146 - Fix memory leak in implementation of
AsPyPointer
forOption<T>
. #2160 - Fix FFI definition of
_PyLong_NumBits
to returnsize_t
instead ofc_int
. #2161 - Fix
TypeError
thrown when argument parsing failed missing the originating causes. 2177
0.15.2 - 2022-04-14
- Backport of PyPy 3.9 support from PyO3 0.16. #2262
0.15.1 - 2021-11-19
- Add implementations for
Py::as_ref
andPy::into_ref
forPy<PySequence>
,Py<PyIterator>
andPy<PyMapping>
. #1682 - Add
PyTraceback
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. #1969
- Fix creating
#[classattr]
by functions with the name of a known magic method. #1969 - Fix use of
catch_unwind
inallow_threads
which can cause fatal crashes. #1989 - Fix build failure on PyPy when abi3 features are activated. #1991
- Fix mingw platform detection. #1993
- Fix panic in
__get__
implementation when accessing descriptor on type object. #1997
0.15.0 - 2021-11-03
pyo3
'sCargo.toml
now advertiseslinks = "python"
to inform Cargo that it links against libpython. #1819- Added optional
anyhow
feature to convertanyhow::Error
intoPyErr
. #1822 - Support Python 3.10. #1889
- Added optional
eyre
feature to converteyre::Report
intoPyErr
. #1893 - Support PyPy 3.8. #1948
- Add
PyList::get_item_unchecked
andPyTuple::get_item_unchecked
to get items without bounds checks. #1733 - Support
#[doc = include_str!(...)]
attributes on Rust 1.54 and up. #1746 - Add
PyAny::py
as a convenience forPyNativeType::py
. #1751 - Add implementation of
std::ops::Index<usize>
forPyList
,PyTuple
andPySequence
. #1825 - Add range indexing implementations of
std::ops::Index
forPyList
,PyTuple
andPySequence
. #1829 - Add
PyMapping
type to represent the Python mapping protocol. #1844 - Add commonly-used sequence methods to
PyList
andPyTuple
. #1849 - Add
as_sequence
methods toPyList
andPyTuple
. #1860 - Add support for magic methods in
#[pymethods]
, intended as a replacement for#[pyproto]
. #1864 - Add
abi3-py310
feature. #1889 - Add
PyCFunction::new_closure
to create a Python function from a Rust closure. #1901 - Add support for positional-only arguments in
#[pyfunction]
. #1925 - Add
PyErr::take
to attempt to fetch a Python exception if present. #1957
PyList
,PyTuple
andPySequence
's APIs now accepts onlyusize
indices instead ofisize
. #1733, #1802, #1803PyList::get_item
andPyTuple::get_item
now returnPyResult<&PyAny>
instead of panicking. #1733PySequence::in_place_repeat
andPySequence::in_place_concat
now returnPyResult<&PySequence>
instead ofPyResult<()>
, which is needed in case of immutable sequences such as tuples. #1803PySequence::get_slice
now returnsPyResult<&PySequence>
instead ofPyResult<&PyAny>
. #1829- Deprecate
PyTuple::split_from
. #1804 - Deprecate
PyTuple::slice
, new methodPyTuple::get_slice
added withusize
indices. #1828 - Deprecate FFI definitions
PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,PyParser_SimpleParseFileFlags
when building for Python 3.9. #1830 - Mark FFI definitions removed in Python 3.10
PyParser_ASTFromString
,PyParser_ASTFromStringObject
,PyParser_ASTFromFile
,PyParser_ASTFromFileObject
,PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,PyParser_SimpleParseFileFlags
,PyParser_SimpleParseString
,PyParser_SimpleParseFile
,Py_SymtableString
, andPy_SymtableStringObject
. #1830 #[pymethods]
now handles magic methods similarly to#[pyproto]
. In the future,#[pyproto]
may be deprecated. #1864- Deprecate FFI definitions
PySys_AddWarnOption
,PySys_AddWarnOptionUnicode
andPySys_HasWarnOptions
. #1887 - Deprecate
#[call]
attribute in favor of usingfn __call__
. #1929 - Fix missing FFI definition
_PyImport_FindExtensionObject
on Python 3.10. #1942 - Change
PyErr::fetch
to panic in debug mode if no exception is present. #1957
- Fix building with a conda environment on Windows. #1873
- Fix panic on Python 3.6 when calling
Python::with_gil
with Python initialized but threading not initialized. #1874 - Fix incorrect linking to version-specific DLL instead of
python3.dll
when cross-compiling to Windows withabi3
. #1880 - Fix FFI definition for
PyTuple_ClearFreeList
incorrectly being present for Python 3.9 and up. #1887 - Fix panic in generated
#[derive(FromPyObject)]
for enums. #1888 - Fix cross-compiling to Python 3.7 builds with the "m" abi flag. #1908
- Fix
__mod__
magic method fallback to__rmod__
. #1934. - Fix missing FFI definition
_PyImport_FindExtensionObject
on Python 3.10. #1942
0.14.5 - 2021-09-05
- Make
pyo3_build_config::InterpreterConfig
and subfields public. #1848 - Add
resolve-config
feature to thepyo3-build-config
to control whether its build script does anything. #1856
- Fix 0.14.4 compile regression on
s390x-unknown-linux-gnu
target. #1850
0.14.4 - 2021-08-29
- Mark
PyString::data
asunsafe
and disable it and some supporting PyUnicode FFI APIs (which depend on a C bitfield) on big-endian targets. #1834
0.14.3 - 2021-08-22
- Add
PyString::data
to access the raw bytes stored in a Python string. #1794
- Raise
AttributeError
to avoid panic when callingdel
on a#[setter]
defined class property. #1779 - Restrict FFI definitions
PyGILState_Check
andPy_tracefunc
to the unlimited API. #1787 - Add missing
_type
field toPyStatus
struct definition. #1791 - Reduce lower bound
num-complex
optional dependency to support interop withrust-numpy
andndarray
when building with the MSRV of 1.41 #1799 - Fix memory leak in
Python::run_code
. #1806 - Fix memory leak in
PyModule::from_code
. #1810 - Remove use of
pyo3::
inpyo3::types::datetime
which broke builds using-Z avoid-dev-deps
#1811
0.14.2 - 2021-08-09
- Add
indexmap
feature to addToPyObject
,IntoPy
andFromPyObject
implementations forindexmap::IndexMap
. #1728 - Add
pyo3_build_config::add_extension_module_link_args
to use in build scripts to set linker arguments (for macOS). #1755 - Add
Python::with_gil_unchecked
unsafe variation ofPython::with_gil
to allow obtaining aPython
in scenarios wherePython::with_gil
would fail. #1769
PyErr::new
no longer acquires the Python GIL internally. #1724- Reverted PyO3 0.14.0's use of
cargo:rustc-cdylib-link-arg
in its build script, as Cargo unintentionally allowed crates to pass linker args to downstream crates in this way. Projects supporting macOS may need to restore.cargo/config.toml
files. #1755
- Fix regression in 0.14.0 rejecting usage of
#[doc(hidden)]
on structs and functions annotated with PyO3 macros. #1722 - Fix regression in 0.14.0 leading to incorrect code coverage being computed for
#[pyfunction]
s. #1726 - Fix incorrect FFI definition of
Py_Buffer
on PyPy. #1737 - Fix incorrect calculation of
dictoffset
on 32-bit Windows. #1475 - Fix regression in 0.13.2 leading to linking to incorrect Python library on Windows "gnu" targets. #1759
- Fix compiler warning: deny trailing semicolons in expression macro. #1762
- Fix incorrect FFI definition of
Py_DecodeLocale
. The 2nd argument is now*mut Py_ssize_t
instead ofPy_ssize_t
. #1766
0.14.1 - 2021-07-04
- Implement
IntoPy<PyObject>
for&PathBuf
and&OsString
. #1712
- Fix crashes on PyPy due to incorrect definitions of
PyList_SET_ITEM
. #1713
0.14.0 - 2021-07-03
- Update
num-bigint
optional dependency to 0.4. #1481 - Update
num-complex
optional dependency to 0.4. #1482 - Extend
hashbrown
optional dependency supported versions to include 0.11. #1496 - Support PyPy 3.7. #1538
- Extend conversions for
[T; N]
to allN
using const generics (on Rust 1.51 and up). #1128 - Add conversions between
OsStr
/OsString
and Python strings. #1379 - Add conversions between
Path
/PathBuf
and Python strings (andpathlib.Path
objects). #1379 #1654 - Add a new set of
#[pyo3(...)]
attributes to control various PyO3 macro functionality: - Add FFI definition
PyCFunction_CheckExact
for Python 3.9 and later. #1425 - Add FFI definition
Py_IS_TYPE
. #1429 - Add FFI definition
_Py_InitializeMain
. #1473 - Add FFI definitions from
cpython/import.h
.#1475 - Add tuple and unit struct support for
#[pyclass]
macro. #1504 - Add FFI definition
PyDateTime_TimeZone_UTC
. #1572 - Add support for
#[pyclass(extends=Exception)]
. #1591 - Add
PyErr::cause
andPyErr::set_cause
. #1679 - Add FFI definitions from
cpython/pystate.h
. #1687 - Add
wrap_pyfunction!
macro topyo3::prelude
. #1695
- Allow only one
#[pymethods]
block per#[pyclass]
by default, to remove the dependency oninventory
. Add amultiple-pymethods
feature to opt-in the original behavior and dependency oninventory
. #1457 - Change
PyTimeAccess::get_fold
to return abool
instead of au8
. #1397 - Deprecate FFI definition
PyCFunction_Call
for Python 3.9 and up. #1425 - Deprecate FFI definition
PyModule_GetFilename
. #1425 - The
auto-initialize
feature is no longer enabled by default. #1443 - Change
PyCFunction::new
andPyCFunction::new_with_keywords
to take&'static str
arguments rather than implicitly copying (and leaking) them. #1450 - Deprecate
PyModule::call
,PyModule::call0
,PyModule::call1
andPyModule::get
. #1492 - Add length information to
PyBufferError
s raised fromPyBuffer::copy_to_slice
andPyBuffer::copy_from_slice
. #1534 - Automatically set
-undefined
anddynamic_lookup
linker arguments on macOS with theextension-module
feature. #1539 - Deprecate
#[pyproto]
methods which are easier to implement as#[pymethods]
: #1560PyBasicProtocol::__bytes__
andPyBasicProtocol::__format__
PyContextProtocol::__enter__
andPyContextProtocol::__exit__
PyDescrProtocol::__delete__
andPyDescrProtocol::__set_name__
PyMappingProtocol::__reversed__
PyNumberProtocol::__complex__
andPyNumberProtocol::__round__
PyAsyncProtocol::__aenter__
andPyAsyncProtocol::__aexit__
- Deprecate several attributes in favor of the new
#[pyo3(...)]
options: - Reduce LLVM line counts to improve compilation times. #1604
- No longer call
PyEval_InitThreads
in#[pymodule]
init code. #1630 - Use
METH_FASTCALL
argument passing convention, when possible, to improve#[pyfunction]
and method performance. #1619, #1660 - Filter sysconfigdata candidates by architecture when cross-compiling. #1626
- Remove deprecated exception names
BaseException
etc. #1426 - Remove deprecated methods
Python::is_instance
,Python::is_subclass
,Python::release
,Python::xdecref
, andPy::from_owned_ptr_or_panic
. #1426 - Remove many FFI definitions which never existed in the Python C-API:
- Remove pyclass implementation details from
PyTypeInfo
: - Remove
PYO3_CROSS_INCLUDE_DIR
environment variable and the associated C header parsing functionality. #1521 - Remove
raw_pycfunction!
macro. #1619 - Remove
PyClassAlloc
trait. #1657 - Remove
PyList::get_parked_item
. #1664
- Remove FFI definition
PyCFunction_ClearFreeList
for Python 3.9 and later. #1425 PYO3_CROSS_LIB_DIR
environment variable no long required when compiling for x86-64 Python from macOS arm64 and reverse. #1428- Fix FFI definition
_PyEval_RequestCodeExtraIndex
, which took an argument of the wrong type. #1429 - Fix FFI definition
PyIndex_Check
missing with theabi3
feature. #1436 - Fix incorrect
TypeError
raised when keyword-only argument passed along with a positional argument in*args
. #1440 - Fix inability to use a named lifetime for
&PyTuple
of*args
in#[pyfunction]
. #1440 - Fix use of Python argument for
#[pymethods]
inside macro expansions. #1505 - No longer include
__doc__
in__all__
generated for#[pymodule]
. #1509 - Always use cross-compiling configuration if any of the
PYO3_CROSS
family of environment variables are set. #1514 - Support
EnvironmentError
,IOError
, andWindowsError
on PyPy. #1533 - Fix unnecessary rebuilds when cycling between
cargo check
andcargo clippy
in a Python virtualenv. #1557 - Fix segfault when dereferencing
ffi::PyDateTimeAPI
without the GIL. #1563 - Fix memory leak in
FromPyObject
implementations foru128
andi128
. #1638 - Fix
#[pyclass(extends=PyDict)]
leaking the dict contents on drop. #1657 - Fix segfault when calling
PyList::get_item
with negative indices. #1668 - Fix FFI definitions of
PyEval_SetProfile
/PyEval_SetTrace
to takeOption<Py_tracefunc>
parameters. #1692 - Fix
ToPyObject
impl forHashSet
to accept non-default hashers. #1702
0.13.2 - 2021-02-12
- Lower minimum supported Rust version to 1.41. #1421
- Add unsafe API
with_embedded_python_interpreter
to initialize a Python interpreter, execute a closure, and finalize the interpreter. #1355 - Add
serde
feature which provides implementations ofSerialize
andDeserialize
forPy<T>
. #1366 - Add FFI definition
_PyCFunctionFastWithKeywords
on Python 3.7 and up. #1384 - Add
PyDateTime::new_with_fold
method. #1398 - Add
size_hint
impls for{PyDict,PyList,PySet,PyTuple}Iterator
s. #1699
prepare_freethreaded_python
will no longer register anatexit
handler to callPy_Finalize
. This resolves a number of issues with incompatible C extensions causing crashes at finalization. #1355- Mark
PyLayout::py_init
,PyClassDict::clear_dict
, andopt_to_pyobj
safe, as they do not perform any unsafe operations. #1404
- Fix support for using
r#raw_idents
as argument names in pyfunctions. #1383 - Fix typo in FFI definition for
PyFunction_GetCode
(was incorrectlyPyFunction_Code
). #1387 - Fix FFI definitions
PyMarshal_WriteObjectToString
andPyMarshal_ReadObjectFromString
as available in limited API. #1387 - Fix FFI definitions
PyListObject
and those fromfuncobject.h
as requiring non-limited API. #1387 - Fix unqualified
Result
usage inpyobject_native_type_base
. #1402 - Fix build on systems where the default Python encoding is not UTF-8. #1405
- Fix build on mingw / MSYS2. #1423
0.13.1 - 2021-01-10
- Add support for
#[pyclass(dict)]
and#[pyclass(weakref)]
with theabi3
feature on Python 3.9 and up. #1342 - Add FFI definitions
PyOS_BeforeFork
,PyOS_AfterFork_Parent
,PyOS_AfterFork_Child
for Python 3.7 and up. #1348 - Add an
auto-initialize
feature to control whether PyO3 should automatically initialize an embedded Python interpreter. For compatibility this feature is enabled by default in PyO3 0.13.1, but is planned to become opt-in from PyO3 0.14.0. #1347 - Add support for cross-compiling to Windows without needing
PYO3_CROSS_INCLUDE_DIR
. #1350
- Deprecate FFI definitions
PyEval_CallObjectWithKeywords
,PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
when building for Python 3.9. #1338 - Deprecate FFI definitions
PyGetSetDef_DICT
andPyGetSetDef_INIT
which have never been in the Python API. #1341 - Deprecate FFI definitions
PyGen_NeedsFinalizing
,PyImport_Cleanup
(removed in 3.9), andPyOS_InitInterrupts
(3.10). #1348 - Deprecate FFI definition
PyOS_AfterFork
for Python 3.7 and up. #1348 - Deprecate FFI definitions
PyCoro_Check
,PyAsyncGen_Check
, andPyCoroWrapper_Check
, which have never been in the Python API (for the first two, it is possible to usePyCoro_CheckExact
andPyAsyncGen_CheckExact
instead; these are the actual functions provided by the Python API). #1348 - Deprecate FFI definitions for
PyUnicode_FromUnicode
,PyUnicode_AsUnicode
andPyUnicode_AsUnicodeAndSize
, which will be removed from 3.12 and up due to PEP 623. #1370
- Remove FFI definition
PyFrame_ClearFreeList
when building for Python 3.9. #1341 - Remove FFI definition
_PyDict_Contains
when building for Python 3.10. #1341 - Remove FFI definitions
PyGen_NeedsFinalizing
andPyImport_Cleanup
(for 3.9 and up), andPyOS_InitInterrupts
(3.10). #1348
- Stop including
Py_TRACE_REFS
config setting automatically ifPy_DEBUG
is set on Python 3.8 and up. #1334 - Remove
#[deny(warnings)]
attribute (and instead refuse warnings only in CI). #1340 - Fix deprecation warning for missing
__module__
with#[pyclass]
. #1343 - Correct return type of
PyFrozenSet::empty
to&PyFrozenSet
(was incorrectly&PySet
). #1351 - Fix missing
Py_INCREF
on heap type objects on Python versions before 3.8. #1365
0.13.0 - 2020-12-22
- Drop support for Python 3.5 (as it is now end-of-life). #1250
- Bump minimum supported Rust version to 1.45. #1272
- Bump indoc dependency to 1.0. #1272
- Bump paste dependency to 1.0. #1272
- Rename internal crates
pyo3cls
andpyo3-derive-backend
topyo3-macros
andpyo3-macros-backend
respectively. #1317
- Add support for building for CPython limited API. Opting-in to the limited API enables a single extension wheel built with PyO3 to be installable on multiple Python versions. This required a few minor changes to runtime behavior of of PyO3
#[pyclass]
types. See the migration guide for full details. #1152- Add feature flags
abi3-py36
,abi3-py37
,abi3-py38
etc. to set the minimum Python version when using the limited API. #1263
- Add feature flags
- Add argument names to
TypeError
messages generated by pymethod wrappers. #1212 - Add FFI definitions for PEP 587 "Python Initialization Configuration". #1247
- Add FFI definitions for
PyEval_SetProfile
andPyEval_SetTrace
. #1255 - Add FFI definitions for context.h functions (
PyContext_New
, etc). #1259 - Add
PyAny::is_instance
method. #1276 - Add support for conversion between
char
andPyString
. #1282 - Add FFI definitions for
PyBuffer_SizeFromFormat
,PyObject_LengthHint
,PyObject_CallNoArgs
,PyObject_CallOneArg
,PyObject_CallMethodNoArgs
,PyObject_CallMethodOneArg
,PyObject_VectorcallDict
, andPyObject_VectorcallMethod
. #1287 - Add conversions between
u128
/i128
andPyLong
for PyPy. #1310 - Add
Python::version
andPython::version_info
to get the running interpreter version. #1322 - Add conversions for tuples of length 10, 11, and 12. #1454
- Change return type of
PyType::name
fromCow<str>
toPyResult<&str>
. #1152 #[pyclass(subclass)]
is now required for subclassing from Rust (was previously just required for subclassing from Python). #1152- Change
PyIterator
to be consistent with other native types: it is now used as&PyIterator
instead ofPyIterator<'a>
. #1176 - Change formatting of
PyDowncastError
messages to be closer to Python's builtin error messages. #1212 - Change
Debug
andDisplay
impls forPyException
to be consistent withPyAny
. #1275 - Change
Debug
impl ofPyErr
to output more helpful information (acquiring the GIL if necessary). #1275 - Rename
PyTypeInfo::is_instance
andPyTypeInfo::is_exact_instance
toPyTypeInfo::is_type_of
andPyTypeInfo::is_exact_type_of
. #1278 - Optimize
PyAny::call0
,Py::call0
andPyAny::call_method0
andPy::call_method0
on Python 3.9 and up. #1287 - Require double-quotes for pyclass name argument e.g
#[pyclass(name = "MyClass")]
. #1303
- Deprecate
Python::is_instance
,Python::is_subclass
,Python::release
, andPython::xdecref
. #1292
- Remove deprecated ffi definitions
PyUnicode_AsUnicodeCopy
,PyUnicode_GetMax
,_Py_CheckRecursionLimit
,PyObject_AsCharBuffer
,PyObject_AsReadBuffer
,PyObject_CheckReadBuffer
andPyObject_AsWriteBuffer
, which will be removed in Python 3.10. #1217 - Remove unused
python3
feature. #1235
- Fix missing field in
PyCodeObject
struct (co_posonlyargcount
) - caused invalid access to other fields in Python >3.7. #1260 - Fix building for
x86_64-unknown-linux-musl
target fromx86_64-unknown-linux-gnu
host. #1267 - Fix
#[text_signature]
interacting badly with rustr#raw_identifiers
. #1286 - Fix FFI definitions for
PyObject_Vectorcall
andPyVectorcall_Call
. #1287 - Fix building with Anaconda python inside a virtualenv. #1290
- Fix definition of opaque FFI types. #1312
- Fix using custom error type in pyclass
#[new]
methods. #1319
0.12.4 - 2020-11-28
- Fix reference count bug in implementation of
From<Py<T>>
forPyObject
, a regression introduced in PyO3 0.12. #1297
0.12.3 - 2020-10-12
- Fix support for Rust versions 1.39 to 1.44, broken by an incorrect internal update to paste 1.0 which was done in PyO3 0.12.2. #1234
0.12.2 - 2020-10-12
- Add support for keyword-only arguments without default values in
#[pyfunction]
. #1209 - Add
Python::check_signals
as a safe a wrapper forPyErr_CheckSignals
. #1214
- Fix invalid document for protocol methods. #1169
- Hide docs of PyO3 private implementation details in
pyo3::class::methods
. #1169 - Fix unnecessary rebuild on PATH changes when the python interpreter is provided by PYO3_PYTHON. #1231
0.12.1 - 2020-09-16
- Fix building for a 32-bit Python on 64-bit Windows with a 64-bit Rust toolchain. #1179
- Fix building on platforms where
c_char
isu8
. #1182
0.12.0 - 2020-09-12
- Add FFI definitions
Py_FinalizeEx
,PyOS_getsig
, andPyOS_setsig
. #1021 - Add
PyString::to_str
for accessingPyString
as&str
. #1023 - Add
Python::with_gil
for executing a closure with the Python GIL. #1037 - Add type information to failures in
PyAny::downcast
. #1050 - Implement
Debug
forPyIterator
. #1051 - Add
PyBytes::new_with
andPyByteArray::new_with
for initialisingbytes
andbytearray
objects using a closure. #1074 - Add
#[derive(FromPyObject)]
macro for enums and structs. #1065 - Add
Py::as_ref
andPy::into_ref
for convertingPy<T>
to&T
. #1098 - Add ability to return
Result
types other thanPyResult
from#[pyfunction]
,#[pymethod]
and#[pyproto]
functions. #1106. - Implement
ToPyObject
,IntoPy
, andFromPyObject
for hashbrown'sHashMap
andHashSet
types (requires thehashbrown
feature). #1114 - Add
#[pyfunction(pass_module)]
and#[pyfn(pass_module)]
to pass the module object as the first function argument. #1143 - Add
PyModule::add_function
andPyModule::add_submodule
as typed alternatives toPyModule::add_wrapped
. #1143 - Add native
PyCFunction
andPyFunction
types. #1163
- Rework exception types: #1024 #1115
- Rename exception types from e.g.
RuntimeError
toPyRuntimeError
. The old names continue to exist but are deprecated. - Exception objects are now accessible as
&T
orPy<T>
, just like other Python-native types. - Rename
PyException::py_err
toPyException::new_err
. - Rename
PyUnicodeDecodeErr::new_err
toPyUnicodeDecodeErr::new
. - Remove
PyStopIteration::stop_iteration
.
- Rename exception types from e.g.
- Require
T: Send
for the return valueT
ofPython::allow_threads
. #1036 - Rename
PYTHON_SYS_EXECUTABLE
toPYO3_PYTHON
. The old name will continue to work (undocumented) but will be removed in a future release. #1039 - Remove
unsafe
from signature ofPyType::as_type_ptr
. #1047 - Change return type of
PyIterator::from_object
toPyResult<PyIterator>
(wasResult<PyIterator, PyDowncastError>
). #1051 IntoPy
is no longer implied byFromPy
. #1063- Change
PyObject
to be a type alias forPy<PyAny>
. #1063 - Rework
PyErr
to be compatible with thestd::error::Error
trait: #1067 #1115- Implement
Display
,Error
,Send
andSync
forPyErr
andPyErrArguments
. - Add
PyErr::instance
for accessingPyErr
as&PyBaseException
. PyErr
's fields are now an implementation detail. The equivalent values can be accessed withPyErr::ptype
,PyErr::pvalue
andPyErr::ptraceback
.- Change receiver of
PyErr::print
andPyErr::print_and_set_sys_last_vars
to&self
(wasself
). - Remove
PyErrValue
,PyErr::from_value
,PyErr::into_normalized
, andPyErr::normalize
. - Remove
PyException::into
. - Remove
Into<PyResult<T>>
forPyErr
andPyException
.
- Implement
- Change methods generated by
#[pyproto]
to returnNotImplemented
if Python should try a reversed operation. #1072 - Change argument to
PyModule::add
toimpl IntoPy<PyObject>
(wasimpl ToPyObject
). #1124
- Remove many exception and
PyErr
APIs; see the "changed" section above. #1024 #1067 #1115 - Remove
PyString::to_string
(use newPyString::to_str
). #1023 - Remove
PyString::as_bytes
. #1023 - Remove
Python::register_any
. #1023 - Remove
GILGuard::acquire
from the public API. UsePython::acquire_gil
orPython::with_gil
. #1036 - Remove the
FromPy
trait. #1063 - Remove the
AsPyRef
trait. #1098
- Correct FFI definitions
Py_SetProgramName
andPy_SetPythonHome
to take*const
arguments (was*mut
). #1021 - Fix
FromPyObject
fornum_bigint::BigInt
for Python objects with an__index__
method. #1027 - Correct FFI definition
_PyLong_AsByteArray
to take*mut c_uchar
argument (was*const c_uchar
). #1029 - Fix segfault with
#[pyclass(dict, unsendable)]
. #1058 #1059 - Fix using
&Self
as an argument type for functions in a#[pymethods]
block. #1071 - Fix best-effort build against PyPy 3.6. #1092
- Fix many cases of lifetime elision in
#[pyproto]
implementations. #1093 - Fix detection of Python build configuration when cross-compiling. #1095
- Always link against libpython on android with the
extension-module
feature. #1095 - Fix the
+
operator not trying__radd__
when both__add__
and__radd__
are defined inPyNumberProtocol
(and similar for all other reversible operators). #1107 - Fix building with Anaconda python. #1175
0.11.1 - 2020-06-30
#[pyclass(unsendable)]
. #1009
- Update
parking_lot
dependency to0.11
. #1010
0.11.0 - 2020-06-28
- Support stable versions of Rust (>=1.39). #969
- Add FFI definition
PyObject_AsFileDescriptor
. #938 - Add
PyByteArray::data
,PyByteArray::as_bytes
, andPyByteArray::as_bytes_mut
. #967 - Add
GILOnceCell
to use in situations wherelazy_static
oronce_cell
can deadlock. #975 - Add
Py::borrow
,Py::borrow_mut
,Py::try_borrow
, andPy::try_borrow_mut
for accessing#[pyclass]
values. #976 - Add
IterNextOutput
andIterANextOutput
for returning from__next__
/__anext__
. #997
- Simplify internals of
#[pyo3(get)]
attribute. (Remove the hidden APIGetPropertyValue
.) #934 - Call
Py_Finalize
at exit to flush buffers, etc. #943 - Add type parameter to PyBuffer. #951
- Require
Send
bound for#[pyclass]
. #966 - Add
Python
argument to most methods onPyObject
andPy<T>
to ensure GIL safety. #970 - Change signature of
PyTypeObject::type_object
- now takesPython
argument and returns&PyType
. #970 - Change return type of
PyTuple::slice
andPyTuple::split_from
fromPy<PyTuple>
to&PyTuple
. #970 - Change return type of
PyTuple::as_slice
to&[&PyAny]
. #971 - Rename
PyTypeInfo::type_object
totype_object_raw
, and addPython
argument. #975 - Update
num-complex
optional dependendency from0.2
to0.3
. #977 - Update
num-bigint
optional dependendency from0.2
to0.3
. #978 #[pyproto]
is re-implemented without specialization. #961PyClassAlloc::alloc
is renamed toPyClassAlloc::new
. #990#[pyproto]
methods can now have return valueT
orPyResult<T>
(previously onlyPyResult<T>
was supported). #996#[pyproto]
methods can now skip annotating the return type if it is()
. #998
- Remove
ManagedPyRef
(unused, and needs specialization) #930
- Fix passing explicit
None
toOption<T>
argument#[pyfunction]
with a default value. #936 - Fix
PyClass.__new__
's not respecting subclasses when inherited by a Python class. #990 - Fix returning
Option<T>
from#[pyproto]
methods. #996 - Fix accepting
PyRef<Self>
andPyRefMut<Self>
to#[getter]
and#[setter]
methods. #999
0.10.1 - 2020-05-14
- Fix deadlock in
Python::acquire_gil
after dropping aPyObject
orPy<T>
. #924
0.10.0 - 2020-05-13
- Add FFI definition
_PyDict_NewPresized
. #849 - Implement
IntoPy<PyObject>
forHashSet
andBTreeSet
. #864 - Add
PyAny::dir
method. #886 - Gate macros behind a
macros
feature (enabled by default). #897 - Add ability to define class attributes using
#[classattr]
on functions in#[pymethods]
. #905 - Implement
Clone
forPyObject
andPy<T>
. #908 - Implement
Deref<Target = PyAny>
for all builtin types. (PyList
,PyTuple
,PyDict
etc.) #911 - Implement
Deref<Target = PyAny>
forPyCell<T>
. #911 - Add
#[classattr]
support for associated constants in#[pymethods]
. #914
- Panics will now be raised as a Python
PanicException
. #797 - Change
PyObject
andPy<T>
reference counts to decrement immediately upon drop when the GIL is held. #851 - Allow
PyIterProtocol
methods to use eitherPyRef
orPyRefMut
as the receiver type. #856 - Change the implementation of
FromPyObject
forPy<T>
to apply to a wider range ofT
, including allT: PyClass
. #880 - Move all methods from the
ObjectProtocol
trait to thePyAny
struct. #911 - Remove need for
#![feature(specialization)]
in crates depending on PyO3. #917
- Remove
PyMethodsProtocol
trait. #889 - Remove
num-traits
dependency. #895 - Remove
ObjectProtocol
trait. #911 - Remove
PyAny::None
. Users should usePython::None
instead. #911 - Remove all
*ProtocolImpl
traits. #917
- Fix support for
__radd__
and other__r*__
methods as implementations for Python mathematical operators. #839 - Fix panics during garbage collection when traversing objects that were already mutably borrowed. #855
- Prevent
&'static
references to Python objects as arguments to#[pyfunction]
and#[pymethods]
. #869 - Fix lifetime safety bug with
AsPyRef::as_ref
. #876 - Fix
#[pyo3(get)]
attribute onPy<T>
fields. #880 - Fix segmentation faults caused by functions such as
PyList::get_item
returning borrowed objects when it was not safe to do so. #890 - Fix segmentation faults caused by nested
Python::acquire_gil
calls creating dangling references. #893 - Fix segmentatation faults when a panic occurs during a call to
Python::allow_threads
. #912
0.9.2 - 2020-04-09
FromPyObject
implementations forHashSet
andBTreeSet
. #842
- Correctly detect 32bit architecture. #830
0.9.1 - 2020-03-23
0.9.0 - 2020-03-19
PyCell
, which has RefCell-like features. #770PyClass
,PyLayout
,PyClassInitializer
. #683- Implemented
IntoIterator
forPySet
andPyFrozenSet
. #716 FromPyObject
is now automatically implemented forT: Clone
pyclasses. #730#[pyo3(get)]
and#[pyo3(set)]
will now use the Rust doc-comment from the field for the Python property. #755#[setter]
functions may now take an argument ofPyo3::Python
. #760PyTypeInfo::BaseLayout
andPyClass::BaseNativeType
. #770PyDowncastImpl
. #770- Implement
FromPyObject
andIntoPy<PyObject>
traits for arrays (up to 32). #778 migration.md
andtypes.md
in the guide. #795, #802ffi::{_PyBytes_Resize, _PyDict_Next, _PyDict_Contains, _PyDict_GetDictPtr}
. #820
#[new]
does not takePyRawObject
and can returnSelf
. #683- The blanket implementations for
FromPyObject
for&T
and&mut T
are no longer specializable. ImplementPyTryFrom
for your type to control the behavior ofFromPyObject::extract
for your types. #713 - The implementation for
IntoPy<U> for T
whereU: FromPy<T>
is no longer specializable. Control the behavior of this via the implementation ofFromPy
. #713 - Use
parking_lot::Mutex
instead ofspin::Mutex
. #734 - Bumped minimum Rust version to
1.42.0-nightly 2020-01-21
. #761 PyRef
andPyRefMut
are renewed forPyCell
. #770- Some new FFI functions for Python 3.8. #784
PyAny
is now on the top level module and prelude. #816
PyRawObject
. #683PyNoArgsFunction
. #741initialize_type
. To set the module name for a#[pyclass]
, use themodule
argument to the macro. #751AsPyRef::as_mut/with/with_mut/into_py/into_mut_py
. #770PyTryFrom::try_from_mut/try_from_mut_exact/try_from_mut_unchecked
. #770Python::mut_from_owned_ptr/mut_from_borrowed_ptr
. #770ObjectProtocol::get_base/get_mut_base
. #770
- Fixed unsoundness of subclassing. #683.
- Clear error indicator when the exception is handled on the Rust side. #719
- Usage of raw identifiers with
#[pyo3(set)]
. #745 - Usage of
PyObject
with#[pyo3(get)]
. #760 #[pymethods]
used in conjunction with#[cfg]
. #769"*"
in a#[pyfunction()]
argument list incorrectly accepting any number of positional arguments (useargs = "*"
when this behavior is desired). #792PyModule::dict
. #809- Fix the case where
DESCRIPTION
is not null-terminated. #822
0.8.5 - 2020-01-05
- Implemented
FromPyObject
forHashMap
andBTreeMap
- Support for
#[name = "foo"]
attribute for#[pyfunction]
and in#[pymethods]
. #692
0.8.4 - 2019-12-14
- Support for
#[text_signature]
attribute. #675
0.8.3 - 2019-11-23
#[init]
is removed. #658
- Now all
&Py~
types have!Send
bound. #655 - Fix a compile error raised by the stabilization of
!
type. #672.
0.8.2 - 2019-10-27
- FFI compatibility for PEP 590 Vectorcall. #641
- Fix PySequenceProtocol::set_item. #624
- Fix a corner case of BigInt::FromPyObject. #630
- Fix index errors in parameter conversion. #631
- Fix handling of invalid utf-8 sequences in
PyString::as_bytes
. #639 andPyString::to_string_lossy
#642. - Remove
__contains__
and__iter__
from PyMappingProtocol. #644 - Fix proc-macro definition of PySetAttrProtocol. #645
0.8.1 - 2019-10-08
- Conversion between num-bigint and Python int. #608
- Make sure the right Python interpreter is used in OSX builds. #604
- Patch specialization being broken by Rust 1.40. #614
- Fix a segfault around PyErr. #597
0.8.0 - 2019-09-16
module
argument topyclass
macro. #499py_run!
macro #512- Use existing fields and methods before calling custom getattr. #505
PyBytes
can now be indexed just likeVec<u8>
- Implement
IntoPy<PyObject>
forPyRef
andPyRefMut
.
- Implementing the Using the
gc
parameter forpyclass
(e.g.#[pyclass(gc)]
) without implementing theclass::PyGCProtocol
trait is now a compile-time error. Failing to implement this trait could lead to segfaults. #532 PyByteArray::data
has been replaced withPyDataArray::to_vec
because returning a&[u8]
is unsound. (See this comment for a great write-up for why that was unsound)- Replace
mashup
withpaste
. GILPool
gained aPython
marker to prevent it from being misused to release Python objects without the GIL held.
IntoPyObject
was replaced withIntoPy<PyObject>
#[pyclass(subclass)]
is hidden aunsound-subclass
feature because it's causing segmentation faults.
- More readable error message for generics in pyclass #503
0.7.0 - 2019-05-26
- PyPy support by omerbenamram in #393
- Have
PyModule
generate an index of its members (__all__
list). - Allow
slf: PyRef<T>
for pyclass(#419) - Allow to use lifetime specifiers in
pymethods
- Add
marshal
module. #460
Python::run
returnsPyResult<()>
instead ofPyResult<&PyAny>
.- Methods decorated with
#[getter]
and#[setter]
can now omit wrapping the result type inPyResult
if they don't raise exceptions.
type_object::PyTypeObject
has been marked unsafe because breaking the contracttype_object::PyTypeObject::init_type
can lead to UB.- Fixed automatic derive of
PySequenceProtocol
implementation in #423. - Capitalization & better wording to README.md.
- Docstrings of properties is now properly set using the doc of the
#[getter]
method. - Fixed issues with
pymethods
crashing on doc comments containing double quotes. PySet::new
andPyFrozenSet::new
now returnPyResult<&Py[Frozen]Set>
; exceptions are raised if the items are not hashable.- Fixed building using
venv
on Windows. PyTuple::new
now returns&PyTuple
instead ofPy<PyTuple>
.- Fixed several issues with argument parsing; notable, the
*args
and**kwargs
tuple/dict now doesn't contain arguments that are otherwise assigned to parameters.
0.6.0 - 2019-03-28
- Currently, #341 causes
cargo test
to fail with weird linking errors when theextension-module
feature is activated. For now you can work around this by making theextension-module
feature optional and running the tests withcargo test --no-default-features
:
[dependencies.pyo3]
version = "0.6.0"
[features]
extension-module = ["pyo3/extension-module"]
default = ["extension-module"]
- Added a
wrap_pymodule!
macro similar to the existingwrap_pyfunction!
macro. Only available on python 3 - Added support for cross compiling (e.g. to arm v7) by mtp401 in #327. See the "Cross Compiling" section in the "Building and Distribution" chapter of the guide for more details.
- The
PyRef
andPyRefMut
types, which allow to differentiate between an instance of a rust struct on the rust heap and an instance that is embedded inside a python object. By kngwyu in #335 - Added
FromPy<T>
andIntoPy<T>
which are equivalent toFrom<T>
andInto<T>
except that they require a gil token. - Added
ManagedPyRef
, which should eventually replaceToBorrowedObject
.
- Renamed
PyObjectRef
toPyAny
in #388 - Renamed
add_function
toadd_wrapped
as it now also supports modules. - Renamed
#[pymodinit]
to#[pymodule]
py.init(|| value)
becomesPy::new(value)
py.init_ref(|| value)
becomesPyRef::new(value)
py.init_mut(|| value)
becomesPyRefMut::new(value)
.PyRawObject::init
is now infallible, e.g. it returns()
instead ofPyResult<()>
.- Renamed
py_exception!
tocreate_exception!
and refactored the error macros. - Renamed
wrap_function!
towrap_pyfunction!
- Renamed
#[prop(get, set)]
to#[pyo3(get, set)]
#[pyfunction]
now supports the same arguments as#[pyfn()]
- Some macros now emit proper spanned errors instead of panics.
- Migrated to the 2018 edition
crate::types::exceptions
moved tocrate::exceptions
- Replace
IntoPyTuple
withIntoPy<Py<PyTuple>>
. IntoPyPointer
andToPyPointer
moved into the crate root.class::CompareOp
moved intoclass::basic::CompareOp
- PyTypeObject is now a direct subtrait PyTypeCreate, removing the old cyclical implementation in #350
- Add
PyList::{sort, reverse}
by chr1sj0nes in #357 and #358 - Renamed the
typeob
module totype_object
PyToken
was removed due to unsoundness (See #94).- Removed the unnecessary type parameter from
PyObjectAlloc
NoArgs
. Just use an empty tuplePyObjectWithGIL
.PyNativeType
is sufficient now that PyToken is removed.
- A soudness hole where every instances of a
#[pyclass]
struct was considered to be part of a python object, even though you can create instances that are not part of the python heap. This was fixed throughPyRef
andPyRefMut
. - Fix kwargs support in #328.
- Add full support for
__dict__
in #403.
0.5.3 - 2019-01-04
- Fix memory leak in ArrayList by kngwyu #316
0.5.2 - 2018-11-25
- Fix undeterministic segfaults when creating many objects by kngwyu in #281
0.5.1 - 2018-11-24
Yanked
0.5.0 - 2018-11-11
#[pyclass]
objects can now be returned from rust functionsPyComplex
by kngwyu in #226PyDict::from_sequence
, equivalent todict([(key, val), ...])
- Bindings for the
datetime
standard library types:PyDate
,PyTime
,PyDateTime
,PyTzInfo
,PyDelta
with associatedffi
types, by pganssle #200. PyString
,PyUnicode
, andPyBytes
now have anas_bytes
method that returns&[u8]
.PyObjectProtocol::get_type_ptr
by ijl in #242
- Removes the types from the root module and the prelude. They now live in
pyo3::types
instead. - All exceptions are constructed with
py_err
instead ofnew
, as they returnPyErr
and notSelf
. as_mut
and friends take and&mut self
instead of&self
ObjectProtocol::call
now takes anOption<&PyDict>
for the kwargs instead of anIntoPyDictPointer
.IntoPyDictPointer
was replace byIntoPyDict
which doesn't convertPyDict
itself anymore and returns aPyDict
instead of*mut PyObject
.PyTuple::new
now takes anIntoIterator
instead of a slice- Updated to syn 0.15
- Splitted
PyTypeObject
intoPyTypeObject
without the create method andPyTypeCreate
with requiresPyObjectAlloc<Self> + PyTypeInfo + Sized
. - Ran
cargo edition --fix
which prefixed path withcrate::
for rust 2018 - Renamed
async
topyasync
as async will be a keyword in the 2018 edition. - Starting to use
NonNull<*mut PyObject>
for Py and PyObject by ijl #260
- Removed most entries from the prelude. The new prelude is small and clear.
- Slowly removing specialization uses
PyString
,PyUnicode
, andPyBytes
no longer have adata
method (replaced byas_bytes
) andPyStringData
has been removed.- The pyobject_extract macro
- Added an explanation that the GIL can temporarily be released even while holding a GILGuard.
- Lots of clippy errors
- Fix segfault on calling an unknown method on a PyObject
- Work around a bug in the rust compiler by kngwyu #252
- Fixed a segfault with subclassing pyo3 create classes and using
__class__
by kngwyu #263
0.4.1 - 2018-08-20
- PyTryFrom's error is always to
PyDowncastError
- Fixed compilation on nightly since
use_extern_macros
was stabilized
- The pyobject_downcast macro
0.4.0 - 2018-07-30
- Merged both examples into one
- Rustfmt all the things ✔️
- Switched to Keep a Changelog
- Conversions from tuples to PyDict due to rust-lang/rust#52050
0.3.2 - 2018-07-22
- Replaced
concat_idents
with mashup
0.3.1 - 2018-07-18
- Fixed scoping bug in pyobject_native_type that would break rust-numpy
0.3.0 - 2018-07-18
- A few internal macros became part of the public api (#155, #186)
- Always clone in getters. This allows using the get-annotation on all Clone-Types
- Upgraded to syn 0.14 which means much better error messages 🎉
- 128 bit integer support by kngwyu (#137)
proc_macro
has been stabilized on nightly (rust-lang/rust#52081). This means that we can remove theproc_macro
feature, but now we need theuse_extern_macros
from the 2018 edition instead.- All proc macro are now prefixed with
py
and live in the prelude. This means you can use#[pyclass]
,#[pymethods]
,#[pyproto]
,#[pyfunction]
and#[pymodinit]
directly, at least after ause pyo3::prelude::*
. They were also moved into a module calledproc_macro
. You shouldn't use#[pyo3::proc_macro::pyclass]
or other longer paths in attributes becauseproc_macro_path_invoc
isn't going to be stabilized soon. - Renamed the
base
option in thepyclass
macro toextends
. #[pymodinit]
uses the function name as module name, unless the name is overrriden with#[pymodinit(name)]
- The guide is now properly versioned.
0.2.7 - 2018-05-18
- Fix nightly breakage with proc_macro_path
0.2.6 - 2018-04-03
- Fix compatibility with TryFrom trait #137
0.2.5 - 2018-02-21
- CPython 3.7 support
- Embedded CPython 3.7b1 crashes on initialization #110
- Generated extension functions are weakly typed #108
- call_method* crashes when the method does not exist #113
- Allow importing exceptions from nested modules #116
0.2.4 - 2018-01-19
- Allow to get mutable ref from PyObject #106
- Drop
RefFromPyObject
trait - Add Python::register_any method
- Fix impl
FromPyObject
forPy<T>
- Mark method that work with raw pointers as unsafe #95
0.2.3 - 11-27-2017
- Rustup to 1.23.0-nightly 2017-11-07
- Proper
c_char
usage #93
- Remove use of now unneeded 'AsciiExt' trait
0.2.2 - 09-26-2017
- Rustup to 1.22.0-nightly 2017-09-30
0.2.1 - 09-26-2017
- Fix rustc const_fn nightly breakage
0.2.0 - 08-12-2017
- Added inheritance support #15
- Added weakref support #56
- Added subclass support #64
- Added
self.__dict__
supoort #68 - Added
pyo3::prelude
module #70 - Better
Iterator
support for PyTuple, PyList, PyDict #75 - Introduce IntoPyDictPointer similar to IntoPyTuple #69
- Allow to add gc support without implementing PyGCProtocol #57
- Refactor
PyErr
implementation. Droppy
parameter from constructor.
0.1.0 - 07-23-2017
- Initial release