3.15rc2 Is the Last Candidate. Ship the Wheel or Skip October

CPython called rc2 the final 3.15 candidate: 144 fixes since rc1, ABI still frozen, final on October 1. The job is cibuildwheel, not rereading the PEP list.

Python 3.15.0rc2 landed on September 1. The release page calls it the last planned candidate: about 144 bugfixes, build fixes, and docs changes from 76 people since rc1. Final is October 1. ABI does not move again in 3.15. Preview builds are still not for production. Wheels built against the candidates are supposed to work on the final.

We already did rc1 as an ABI freeze plus Ruff’s except rewrite and the May feature freeze. This is not that tour. This is the sixteen-day warning. If you maintain a package and you still do not have a cp315 wheel on TestPyPI, October 1 will be a support ticket, not a celebration.

What rc2 actually changed

rc1, August 4, locked the binary interface. rc2 is the cleanup pass. Only reviewed bug fixes. That is the release manager saying: stop waiting for a surprise PEP. There isn’t one.

The call to action on the download page is aimed at maintainers, not at people rewriting blogs about frozendict. Prepare projects for 3.15 now. Publish wheels. Binary wheels built on the candidates should install on 3.15.0. Report bugs on the CPython tracker, not on a Slack screenshot.

If you skipped rc1 because “it’s just a candidate,” you now have one candidate left and a calendar. Sixteen days is enough for cibuildwheel and not enough for a packaging redesign.

The interpreter still has the same headline features the freeze already listed: PEP 810 lazy imports, frozendict, sentinel, UTF-8 by default, unpacking in comprehensions, a JIT they quote at 8–9% geomean on x86-64 Linux versus the standard interpreter and 12–13% on AArch64 macOS versus the tail-calling interpreter. Official Windows 64-bit builds use the tail-calling interpreter. Official macOS installers still ship free-threading support by default. None of that is new this week. The new part is that the door for “maybe they will revert it” is shut.

The wheel is the practice

Best practice in September is not a style guide. It is a matrix.

  • Run cibuildwheel with 3.15rc2 on the same images you use for 3.12–3.14.
  • If you claim free-threaded support, build that wheel too. The macOS installer default is how civilians will test you.
  • Upload to TestPyPI first. Then a real extra on PyPI once the installers are boring.
  • Pin the rc in CI as an allowed-failure job if you must, but do not hide the red X. A red X in September is cheaper than a yanked wheel on October 2.

Lazy imports already got a web-dev write-up. If your library is imported at FastAPI startup, test the PEP 810 path on rc2, not on a blog snippet. If your library is a C extension, the ABI freeze from rc1 is the whole story: rebuild, don’t redesign.

Do not treat the 8–9% JIT figure as a reason to skip profiling. It is a geomean on their suite, on x86-64 Linux, against the standard interpreter. Your allocator-heavy worker may not notice. Your CLI might. Measure once on rc2 so you have a baseline when users paste sys.version in October.

What not to do before October 1

Do not switch production to rc2. The page says that out loud.

Do not rewrite except parentheses because Ruff 0.15 wants them gone on 3.14. We already covered that fight. Pin the linter. Do not let a formatter drive your 3.15 migration.

Do not wait for “what’s new” to get shorter. What’s new is frozen. The remaining diffs are bugs. If your project still fails on rc2, that is your bug or CPython’s. File it. A report on September 16 has a chance. A report on October 2 is a pile.

If you only have pure Python, still publish a 3.15 wheel or at least a Requires-Python that you tested. Source installs from an sdist will hit rc2 users the day they uv python install 3.15. uv will happily fetch the interpreter. Your job is not to win a resolver benchmark. It is to not 500 on import.

A boring checklist for the next two weeks

  1. Add 3.15rc2 to CI today.
  2. Build wheels. Upload somewhere public.
  3. Run the free-threaded build if you advertise it.
  4. Skim What’s New only for the APIs you actually call. Skip the Odyssey quote at the bottom of the release page unless you need a break.
  5. On October 1, rebuild against final even if the ABI promise holds. Trust, then verify the tag.

rc2 is the last rehearsal. The audience shows up in sixteen days. Ship the wheel.

Spread The Article

Share this guide

Send this article to your network or keep a copy of the direct link.

X Facebook LinkedIn Reddit Telegram

Discussion

Leave a comment

No comments yet

Be the first to start the conversation.