Skip to content

Commit a6b7d90

Browse files
Merge branch 'introspection-allow-property-signature' of https://github.com/varchasgopalaswamy/pyo3 into introspection-allow-property-signature
2 parents 2b6633c + 73f9ae0 commit a6b7d90

File tree

176 files changed

+3622
-1604
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+3622
-1604
lines changed

.github/workflows/benches.yml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,23 @@ on:
55
branches:
66
- "main"
77
pull_request:
8-
# `workflow_dispatch` allows CodSpeed to trigger backtest
9-
# performance analysis in order to generate initial data.
10-
workflow_dispatch:
118

129
concurrency:
1310
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}-benches
1411
cancel-in-progress: true
1512

13+
env:
14+
UV_PYTHON: "3.14t"
15+
1616
jobs:
1717
benchmarks:
1818
runs-on: ubuntu-24.04
1919
steps:
20-
- uses: actions/checkout@v6.0.1
21-
- uses: actions/setup-python@v6
20+
- uses: actions/checkout@v6.0.2
21+
- uses: astral-sh/setup-uv@v7
2222
with:
23-
python-version: "3.14"
23+
# codspeed action needs to be run from within the final Python environment
24+
activate-environment: true
2425
- uses: dtolnay/rust-toolchain@stable
2526
with:
2627
components: rust-src
@@ -38,12 +39,9 @@ jobs:
3839
with:
3940
tool: cargo-codspeed
4041

41-
- name: Install nox
42-
run: pip install nox[uv]
43-
4442
- name: Run the benchmarks
4543
uses: CodSpeedHQ/action@v4
4644
with:
47-
run: nox -s codspeed
45+
run: uvx nox -s codspeed
4846
token: ${{ secrets.CODSPEED_TOKEN }}
49-
mode: instrumentation
47+
mode: simulation

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
runs-on: ${{ inputs.os }}
3333
if: ${{ !(startsWith(inputs.python-version, 'graalpy') && startsWith(inputs.os, 'windows')) }}
3434
steps:
35-
- uses: actions/checkout@v6.0.1
35+
- uses: actions/checkout@v6.0.2
3636
with:
3737
# For PRs, we need to run on the real PR head, not the resultant merge of the PR into the target branch.
3838
#

.github/workflows/changelog.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
name: Check changelog entry
1010
runs-on: ubuntu-latest
1111
steps:
12-
- uses: actions/checkout@v6.0.1
12+
- uses: actions/checkout@v6.0.2
1313
- uses: actions/setup-python@v6
1414
with:
1515
python-version: '3.14'

.github/workflows/ci-cache-warmup.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
cross-compilation-windows:
1010
runs-on: ubuntu-latest
1111
steps:
12-
- uses: actions/checkout@v6.0.1
12+
- uses: actions/checkout@v6.0.2
1313
- uses: actions/setup-python@v6
1414
with:
1515
python-version: "3.14"

.github/workflows/ci.yml

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
fmt:
1818
runs-on: ubuntu-latest
1919
steps:
20-
- uses: actions/checkout@v6.0.1
20+
- uses: actions/checkout@v6.0.2
2121
- uses: actions/setup-python@v6
2222
with:
2323
python-version: "3.14"
@@ -38,7 +38,7 @@ jobs:
3838
MSRV: ${{ steps.resolve-msrv.outputs.MSRV }}
3939
verbose: ${{ runner.debug == '1' }}
4040
steps:
41-
- uses: actions/checkout@v6.0.1
41+
- uses: actions/checkout@v6.0.2
4242
- uses: actions/setup-python@v6
4343
with:
4444
python-version: "3.14"
@@ -51,7 +51,7 @@ jobs:
5151
needs: [fmt]
5252
runs-on: ubuntu-latest
5353
steps:
54-
- uses: actions/checkout@v6.0.1
54+
- uses: actions/checkout@v6.0.2
5555
- uses: actions/setup-python@v6
5656
with:
5757
python-version: "3.14"
@@ -69,7 +69,7 @@ jobs:
6969
needs: [fmt, resolve]
7070
runs-on: ubuntu-latest
7171
steps:
72-
- uses: actions/checkout@v6.0.1
72+
- uses: actions/checkout@v6.0.2
7373
- uses: dtolnay/rust-toolchain@master
7474
with:
7575
toolchain: ${{ needs.resolve.outputs.MSRV }}
@@ -117,7 +117,7 @@ jobs:
117117
name: clippy/${{ matrix.target }}/${{ matrix.rust }}
118118
continue-on-error: ${{ matrix.rust != 'stable' }}
119119
steps:
120-
- uses: actions/checkout@v6.0.1
120+
- uses: actions/checkout@v6.0.2
121121
- uses: dtolnay/rust-toolchain@master
122122
with:
123123
toolchain: ${{ matrix.rust }}
@@ -392,7 +392,7 @@ jobs:
392392
needs: [fmt]
393393
runs-on: ubuntu-latest
394394
steps:
395-
- uses: actions/checkout@v6.0.1
395+
- uses: actions/checkout@v6.0.2
396396
- uses: actions/setup-python@v6
397397
with:
398398
python-version: "3.14"
@@ -413,7 +413,7 @@ jobs:
413413
needs: [fmt]
414414
runs-on: ubuntu-latest
415415
steps:
416-
- uses: actions/checkout@v6.0.1
416+
- uses: actions/checkout@v6.0.2
417417
- uses: actions/setup-python@v6
418418
with:
419419
python-version: "3.14"
@@ -435,7 +435,7 @@ jobs:
435435
needs: [fmt]
436436
runs-on: ubuntu-latest
437437
steps:
438-
- uses: actions/checkout@v6.0.1
438+
- uses: actions/checkout@v6.0.2
439439
- uses: actions/setup-python@v6
440440
with:
441441
python-version: "3.14"
@@ -453,7 +453,7 @@ jobs:
453453
needs: [fmt]
454454
runs-on: ubuntu-latest
455455
steps:
456-
- uses: actions/checkout@v6.0.1
456+
- uses: actions/checkout@v6.0.2
457457
- uses: actions/setup-python@v6
458458
with:
459459
# TODO bump emscripten builds to test on 3.13
@@ -498,7 +498,7 @@ jobs:
498498
WASI_SDK_PATH: "/opt/wasi-sdk"
499499
CPYTHON_PATH: "${{ github.workspace }}/wasi/cpython"
500500
steps:
501-
- uses: actions/checkout@v6.0.1
501+
- uses: actions/checkout@v6.0.2
502502
- uses: actions/setup-python@v6
503503
with:
504504
python-version: 3.14
@@ -521,7 +521,7 @@ jobs:
521521
with:
522522
path: ${{ env.CPYTHON_PATH }}/cross-build/
523523
key: wasm32-wasip1-python
524-
- uses: actions/checkout@v6.0.1
524+
- uses: actions/checkout@v6.0.2
525525
with:
526526
repository: python/cpython
527527
ref: 3.14
@@ -570,7 +570,7 @@ jobs:
570570
needs: [fmt]
571571
runs-on: ubuntu-latest
572572
steps:
573-
- uses: actions/checkout@v6.0.1
573+
- uses: actions/checkout@v6.0.2
574574
- uses: Swatinem/rust-cache@v2
575575
with:
576576
save-if: ${{ github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'CI-save-pr-cache') }}
@@ -614,7 +614,7 @@ jobs:
614614
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || github.event_name != 'pull_request' }}
615615
runs-on: ubuntu-latest
616616
steps:
617-
- uses: actions/checkout@v6.0.1
617+
- uses: actions/checkout@v6.0.2
618618
- uses: actions/setup-python@v6
619619
with:
620620
python-version: "3.14"
@@ -638,7 +638,7 @@ jobs:
638638
include:
639639
- rust: ${{ needs.resolve.outputs.MSRV }}
640640
steps:
641-
- uses: actions/checkout@v6.0.1
641+
- uses: actions/checkout@v6.0.2
642642
- uses: actions/setup-python@v6
643643
with:
644644
python-version: "3.14"
@@ -683,7 +683,7 @@ jobs:
683683
target: "aarch64-pc-windows-msvc"
684684
flags: "-i python3.13 --features generate-import-lib"
685685
steps:
686-
- uses: actions/checkout@v6.0.1
686+
- uses: actions/checkout@v6.0.2
687687
- uses: actions/setup-python@v6
688688
with:
689689
python-version: "3.14"
@@ -713,7 +713,7 @@ jobs:
713713
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || github.event_name != 'pull_request' }}
714714
runs-on: ubuntu-latest
715715
steps:
716-
- uses: actions/checkout@v6.0.1
716+
- uses: actions/checkout@v6.0.2
717717
- uses: actions/setup-python@v6
718718
with:
719719
python-version: "3.14"
@@ -763,7 +763,7 @@ jobs:
763763
]
764764
runs-on: ${{ matrix.platform.os }}
765765
steps:
766-
- uses: actions/checkout@v6.0.1
766+
- uses: actions/checkout@v6.0.2
767767
- uses: dtolnay/rust-toolchain@stable
768768
with:
769769
targets: ${{ matrix.platform.rust-target }}
@@ -785,7 +785,7 @@ jobs:
785785
if: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-build-full') && github.event_name == 'pull_request' }}
786786
runs-on: ubuntu-latest
787787
steps:
788-
- uses: actions/checkout@v6.0.1
788+
- uses: actions/checkout@v6.0.2
789789
- uses: dtolnay/rust-toolchain@stable
790790
with:
791791
components: rust-src

.github/workflows/coverage-pr-base.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
coverage-pr-base:
1313
runs-on: ubuntu-latest
1414
steps:
15-
- uses: actions/checkout@v6.0.1
15+
- uses: actions/checkout@v6.0.2
1616
- uses: actions/setup-python@v6
1717
with:
1818
python-version: '3.14'

.github/workflows/netlify-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
outputs:
2222
tag_name: ${{ steps.prepare_tag.outputs.tag_name }}
2323
steps:
24-
- uses: actions/checkout@v6.0.1
24+
- uses: actions/checkout@v6.0.2
2525
- uses: actions/setup-python@v6
2626
with:
2727
python-version: "3.14"

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
runs-on: ubuntu-latest
1818
environment: release
1919
steps:
20-
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
20+
- uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v5.0.1
2121
with:
2222
# The tag to build or the tag received by the tag event
2323
ref: ${{ github.event.inputs.version || github.ref }}

CHANGELOG.md

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,108 @@ To see unreleased changes, please see the [CHANGELOG on the main branch guide](h
1010

1111
<!-- towncrier release notes start -->
1212

13+
## [0.28.0] - 2026-02-01
14+
15+
### Packaging
16+
17+
- Bump MSRV to Rust 1.83. [#5531](https://github.com/PyO3/pyo3/pull/5531)
18+
- Bump minimum supported `quote` version to 1.0.37. [#5531](https://github.com/PyO3/pyo3/pull/5531)
19+
- Bump supported GraalPy version to 25.0. [#5542](https://github.com/PyO3/pyo3/pull/5542)
20+
- Drop `memoffset` dependency. [#5545](https://github.com/PyO3/pyo3/pull/5545)
21+
- Support for free-threaded Python is now opt-out rather than opt-in. [#5564](https://github.com/PyO3/pyo3/pull/5564)
22+
- Bump `target-lexicon` dependency to 0.13.3. [#5571](https://github.com/PyO3/pyo3/pull/5571)
23+
- Drop `indoc` and `unindent` dependencies. [#5608](https://github.com/PyO3/pyo3/pull/5608)
24+
25+
### Added
26+
27+
- Add `__init__` support in `#[pymethods]`. [#4951](https://github.com/PyO3/pyo3/pull/4951)
28+
- Expose `PySuper` on PyPy, GraalPy and ABI3 [#4951](https://github.com/PyO3/pyo3/pull/4951)
29+
- Add `PyString::from_fmt` and `py_format!` macro. [#5199](https://github.com/PyO3/pyo3/pull/5199)
30+
- Add `#[pyclass(new = "from_fields")]` option. [#5421](https://github.com/PyO3/pyo3/pull/5421)
31+
- Add `pyo3::buffer::PyUntypedBuffer`, a type-erased form of `PyBuffer<T>`. [#5458](https://github.com/PyO3/pyo3/pull/5458)
32+
- Add `PyBytes::new_with_writer` [#5517](https://github.com/PyO3/pyo3/pull/5517)
33+
- Add `PyClass::NAME`. [#5579](https://github.com/PyO3/pyo3/pull/5579)
34+
- Add `pyo3_build_config::add_libpython_rpath_link_args`. [#5624](https://github.com/PyO3/pyo3/pull/5624)
35+
- Add `PyBackedStr::clone_ref` and `PyBackedBytes::clone_ref` methods. [#5654](https://github.com/PyO3/pyo3/pull/5654)
36+
- Add `PyCapsule::new_with_pointer` and `PyCapsule::new_with_pointer_and_destructor` for creating capsules with raw pointers. [#5689](https://github.com/PyO3/pyo3/pull/5689)
37+
- Add `#[deleter]` attribute to implement property deleters in `#[methods]`. [#5699](https://github.com/PyO3/pyo3/pull/5699)
38+
- Add `IntoPyObject` and `FromPyObject` implementations for `uuid::NonNilUuid`. [#5707](https://github.com/PyO3/pyo3/pull/5707)
39+
- Add `PyBackedStr::as_str` and `PyBackedStr::as_py_str` methods. [#5723](https://github.com/PyO3/pyo3/pull/5723)
40+
- Add support for subclassing native types (`PyDict`, exceptions, ...) when building for abi3 on Python 3.12+. [#5733](https://github.com/PyO3/pyo3/pull/5733)
41+
- Add support for subclassing `PyList` when building for Python 3.12+. [#5734](https://github.com/PyO3/pyo3/pull/5734)
42+
- FFI definitions:
43+
- Add FFI definitions `PyEval_GetFrameBuiltins`, `PyEval_GetFrameGlobals` and `PyEval_GetFrameLocals` on Python 3.13 and up. [#5590](https://github.com/PyO3/pyo3/pull/5590)
44+
- Add FFI definitions `PyObject_New`, `PyObject_NewVar`, `PyObject_GC_Resize`, `PyObject_GC_New`, and `PyObject_GC_NewVar`. [#5591](https://github.com/PyO3/pyo3/pull/5591)
45+
- Added FFI definitions and an unsafe Rust API wrapping `Py_BEGIN_CRITICAL_SECTION_MUTEX` and `Py_BEGIN_CRITICAL_SECTION_MUTEX2`. [#5642](https://github.com/PyO3/pyo3/pull/5642)
46+
- Add FFI definition `PyDict_GetItemStringRef` on Python 3.13 and up. [#5659](https://github.com/PyO3/pyo3/pull/5659)
47+
- Add FFI definition `PyIter_NextItem` on Python 3.14 and up, and `compat::PyIter_NextItem` for older versions. [#5661](https://github.com/PyO3/pyo3/pull/5661)
48+
- Add FFI definitions `PyThreadState_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`. [#5711](https://github.com/PyO3/pyo3/pull/5711)
49+
- Add FFI definitions `PyImport_ImportModuleAttr` and `PyImport_ImportModuleAttrString` on Python 3.14+. [#5737](https://github.com/PyO3/pyo3/pull/5737)
50+
- Add FFI definitions for the `PyABIInfo` and `PyModExport` APIs available in Python 3.15. [#5746](https://github.com/PyO3/pyo3/pull/5746)
51+
- `experimental-inspect`:
52+
- Emit base classes. [#5331](https://github.com/PyO3/pyo3/pull/5331)
53+
- Emit `@typing.final` on final classes. [#5552](https://github.com/PyO3/pyo3/pull/5552)
54+
- Generate nested classes for complex enums. [#5708](https://github.com/PyO3/pyo3/pull/5708)
55+
- Emit `async` keyword for async functions. [#5731](https://github.com/PyO3/pyo3/pull/5731)
56+
57+
### Changed
58+
59+
- Call `sys.unraisablehook` instead of `PyErr_Print` if panicking on null FFI pointer in `Bound`, `Borrowed` and `Py` constructors. [#5496](https://github.com/PyO3/pyo3/pull/5496)
60+
- Use PEP-489 multi-phase initialization for `#[pymodule]`. [#5525](https://github.com/PyO3/pyo3/pull/5525)
61+
- Deprecate implicit by-value implementation of `FromPyObject` for `#[pyclass]`. [#5550](https://github.com/PyO3/pyo3/pull/5550)
62+
- Deprecate `PyTypeInfo::NAME` and `PyTypeInfo::MODULE`. [#5579](https://github.com/PyO3/pyo3/pull/5579)
63+
- Deprecate `Py<T>::from_{owned,borrowed}[or_{err,opt}]` constructors from raw pointer. [#5585](https://github.com/PyO3/pyo3/pull/5585)
64+
- Deprecate FFI definitions `PyEval_AcquireLock` and `PyEval_ReleaseLock`. [#5590](https://github.com/PyO3/pyo3/pull/5590)
65+
- Relax `'py: 'a` bound in `Py::extract`. [#5594](https://github.com/PyO3/pyo3/pull/5594)
66+
- Add a `T: PyTypeCheck` bound to the `IntoPyObject` implementations on `Bound<T>`, `Borrowed<T>` and `Py<T>`. [#5640](https://github.com/PyO3/pyo3/pull/5640)
67+
- The `with_critical_section` and `with_critical_section2` functions are moved to `pyo3::sync::critical_section`. [#5642](https://github.com/PyO3/pyo3/pull/5642)
68+
- Use `PyIter_NextItem` in `PyIterator::next` implementation. [#5661](https://github.com/PyO3/pyo3/pull/5661)
69+
- `IntoPyObject` for simple enums now uses a singleton value, allowing identity (python `is`) comparisons. [#5665](https://github.com/PyO3/pyo3/pull/5665)
70+
- Allow any `Sequence[int]` in `FromPyObject` on `Cow<[u8]>` and change the error type to `PyErr`. [#5667](https://github.com/PyO3/pyo3/pull/5667)
71+
- `async` pymethods now borrow `self` only for the duration of awaiting the future, not the entire method call. [#5684](https://github.com/PyO3/pyo3/pull/5684)
72+
- Change `CastError` formatted message to directly describe the "is not an instance of" failure condition. [#5693](https://github.com/PyO3/pyo3/pull/5693)
73+
- Add `#[inline]` hints to many methods on `PyBackedStr`. [#5723](https://github.com/PyO3/pyo3/pull/5723)
74+
- Remove redundant internal counters from `BoundSetIterator` and `BoundFrozenSetIterator`. [#5725](https://github.com/PyO3/pyo3/pull/5725)
75+
- Implement `PyIterator::size_hint` on abi3 builds (previously was only on unlimited API builds). [#5727](https://github.com/PyO3/pyo3/pull/5727)
76+
- Deprecate FFI definition `PyImport_ImportModuleNoBlock` (deprecated in Python 3.13). [#5737](https://github.com/PyO3/pyo3/pull/5737)
77+
- `#[new]` can now return arbitrary Python objects. [#5739](https://github.com/PyO3/pyo3/pull/5739)
78+
- `experimental-inspect`:
79+
- Introduce `TypeHint` and make use of it to encode type hint annotations. [#5438](https://github.com/PyO3/pyo3/pull/5438)
80+
- Rename `PyType{Info,Check}::TYPE_INFO` into `PyType{Info,Check}::TYPE_HINT`. [#5438](https://github.com/PyO3/pyo3/pull/5438) [#5619](https://github.com/PyO3/pyo3/pull/5619) [#5641](https://github.com/PyO3/pyo3/pull/5641)
81+
- Fill annotations on function arguments and return values for all types supported natively by PyO3. [#5634](https://github.com/PyO3/pyo3/pull/5634) [#5637](https://github.com/PyO3/pyo3/pull/5637) [#5639](https://github.com/PyO3/pyo3/pull/5639)
82+
- Use `_typeshed.Incomplete` instead of `typing.Any` as default type hint, to make it easier to spot incomplete trait implementations. [#5744](https://github.com/PyO3/pyo3/pull/5744)
83+
- Use general Python expression syntax for type hints. [#5671](https://github.com/PyO3/pyo3/pull/5671)
84+
85+
### Removed
86+
87+
- Remove all functionality deprecated in PyO3 0.25 and 0.26. [#5740](https://github.com/PyO3/pyo3/pull/5740)
88+
- FFI definitions:
89+
- Remove FFI definition `PyEval_GetCallStats` (removed from CPython in Python 3.7). [#5590](https://github.com/PyO3/pyo3/pull/5590)
90+
- Remove FFI definitions `PyEval_AcquireLock` and `PyEval_ReleaseLock` on Python 3.13 and up. [#5590](https://github.com/PyO3/pyo3/pull/5590)
91+
- Remove private FFI definitions `_PyObject_New`, `_PyObject_NewVar`, `_PyObject_GC_Resize`, `_PyObject_GC_New`, and `_PyObject_GC_NewVar`. [#5591](https://github.com/PyO3/pyo3/pull/5591)
92+
- Remove private FFI definitions `_PyDict_SetItem_KnownHash`, `_PyDict_Next`, `_PyDict_NewPresized`, `_PyDict_Contains_KnownHash`, and `_PyDict_Contains`. [#5659](https://github.com/PyO3/pyo3/pull/5659)
93+
- Remove private FFI definitions `_PyFrameEvalFunction`, `_PyInterpreterState_GetEvalFrameFunc` and `_PyInterpreterState_SetEvalFrameFunc`. [#5711](https://github.com/PyO3/pyo3/pull/5711)
94+
- Remove private FFI definitions `_PyImport_IsInitialized`, `_PyImport_SetModule`, `_PyImport_SetModuleString`, `_PyImport_AcquireLock`, `_PyImport_ReleaseLock`, `_PyImport_FindBuiltin`, `_PyImport_FindExtensionObject`, `_PyImport_FixupBuiltin`, and `_PyImport_FixupExtensionObject`. [#5737](https://github.com/PyO3/pyo3/pull/5737)
95+
96+
### Fixed
97+
98+
- Fix `PyModuleMethods::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. [#5375](https://github.com/PyO3/pyo3/pull/5375)
99+
- Link with libpython for Cygwin extension modules. [#5571](https://github.com/PyO3/pyo3/pull/5571)
100+
- Link against the limited API DLL for Cygwin when abi3 is used. [#5574](https://github.com/PyO3/pyo3/pull/5574)
101+
- Handle errors in `PyIterator` when calling `size_hint` [#5604](https://github.com/PyO3/pyo3/pull/5604)
102+
- Link with libpython for iOS extension modules. [#5605](https://github.com/PyO3/pyo3/pull/5605)
103+
- Correct `IntoPyObject` output type of `PyBackedStr` to be `PyString`, not `PyAny`. [#5655](https://github.com/PyO3/pyo3/pull/5655)
104+
- Fix `async` functions to return `None` rather than empty tuple `()`. [#5685](https://github.com/PyO3/pyo3/pull/5685)
105+
- Fix compile error when using references to `#[pyclass]` types (e.g. `&MyClass`) as arguments to async `#[pyfunction]`s. [#5725](https://github.com/PyO3/pyo3/pull/5725)
106+
- FFI definitions:
107+
- Fix FFI definition `PyMemberDescrObject.d_member` to use `PyMemberDef` for Python 3.11+ (was incorrectly `PyGetSetDef`). [#5647](https://github.com/PyO3/pyo3/pull/5647)
108+
- Mark FFI definition `PyThreadState_GetFrame` available with abi3 in 3.10+. [#5711](https://github.com/PyO3/pyo3/pull/5711)
109+
- Fix FFI definition `PyImport_GetModule` on PyPy. [#5737](https://github.com/PyO3/pyo3/pull/5737)
110+
- `experimental-inspect`:
111+
- fix `__new__` return type to be the built object type and not `None`. [#5555](https://github.com/PyO3/pyo3/pull/5555)
112+
- fix imports of decorators. [#5618](https://github.com/PyO3/pyo3/pull/5618)
113+
- fix the return type annotation of `PyResult<()>` (must be `None` and not `tuple`) [#5674](https://github.com/PyO3/pyo3/pull/5674)
114+
13115
## [0.27.2] - 2025-11-30
14116

15117
### Changed
@@ -2387,7 +2489,9 @@ Yanked
23872489

23882490
- Initial release
23892491

2390-
[Unreleased]: https://github.com/pyo3/pyo3/compare/v0.27.1...HEAD
2492+
[Unreleased]: https://github.com/pyo3/pyo3/compare/v0.28.0...HEAD
2493+
[0.28.0]: https://github.com/pyo3/pyo3/compare/v0.27.2...v0.28.0
2494+
[0.27.2]: https://github.com/pyo3/pyo3/compare/v0.27.1...v0.27.2
23912495
[0.27.1]: https://github.com/pyo3/pyo3/compare/v0.27.0...v0.27.1
23922496
[0.27.0]: https://github.com/pyo3/pyo3/compare/v0.26.0...v0.27.0
23932497
[0.26.0]: https://github.com/pyo3/pyo3/compare/v0.25.1...v0.26.0

0 commit comments

Comments
 (0)