<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi" -->

---
title: Python 3.15.0 release candidate 2 is out, final release...
description: Python 3.15.0 release candidate 2 is out with roughly 144 bugfixes since RC1, and no further ABI changes are expected before the final release on October 1,...
canonical: https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Python 3.15.0 release candidate 2 is out, final release set for October 1 | daily.dev
og:description: Python 3.15.0 release candidate 2 is out with roughly 144 bugfixes since RC1, and no further ABI changes are expected before the final release on October 1,...
og:url: https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi
og:image: https://api.daily.dev/og/posts/e7z4rs7ZI.png
og:image:alt: Python 3.15.0 release candidate 2 is out, final release set for October 1
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Python 3.15.0 release candidate 2 is out, final release set for October 1

**[Collections](https://daily.dev/sources/collections)** · 3 min read · 1 upvotes · 0 comments

## Summary

Python 3.15.0 release candidate 2 is out with roughly 144 bugfixes since RC1, and no further ABI changes are expected before the final release on October 1, 2026. Maintainers of third-party packages are urged to test against 3.15 now, publish binary wheels, and add the Python 3.15 Trove classifier. Major features include lazy imports (PEP 810), new frozendict and sentinel built-in types, a dedicated profiling package with the Tachyon sampling profiler, frame pointers enabled by default, unpacking in comprehensions, UTF-8 as the default encoding, TypedDict extra items, disjoint bases checks, a new PyBytesWriter C API, a stable ABI for free-threaded builds, and JIT compiler upgrades yielding 8-13% performance gains.

## Content

## Python 3.15 release candidate 2 is out

Python 3.15.0 release candidate 2 is available now, and it's the last planned RC before the final release on **October 1, 2026**. It includes around 144 bugfixes since RC1, and no further ABI changes are expected for the rest of the 3.15 series.

If you maintain a library, now is the time to test against 3.15 and publish binary wheels. The final release is close enough that anything you catch now is still fixable before it lands in users' environments.

## How to test your project

On GitHub Actions, you can test against the release candidate by setting `allow-prereleases: true` in your `actions/setup-python` step. Once you've confirmed compatibility, add the Python 3.15 Trove classifier to your package metadata.

## What's new in 3.15

Here's a rundown of the major features shipping in this release:

- **Lazy imports** (PEP 810) - imports are deferred until first use, which can meaningfully cut startup time for large applications
- **`frozendict` and `sentinel` built-in types** - two commonly-requested types finally in the standard library
- **Dedicated profiling package with the Tachyon sampling profiler** - proper profiling support without reaching for third-party tools
- **Frame pointers enabled by default** - better compatibility with system profilers like `perf`
- **Unpacking in comprehensions** - `[*item for item in nested]` now works
- **UTF-8 as the default text encoding** (PEP 686) - covered in detail below
- **TypedDict extra items** - you can now specify what happens with keys not listed in a TypedDict
- **Disjoint bases in the type system** - more precise type narrowing
- **New `PyBytesWriter` C API**
- **Stable ABI for free-threaded builds**
- **JIT compiler upgrade** - 8-13% performance gains depending on platform

## UTF-8 as the default encoding

This is probably the change most likely to affect existing code. Before 3.15, Python used the system locale to determine the default text encoding, which worked fine on Linux but caused frequent `UnicodeDecodeError` or mojibake on Windows when files weren't in the system's ANSI codepage.

Starting in 3.15, UTF-8 is the default everywhere. This affects:

- `open()` without an explicit `encoding` argument
- `pathlib` read/write methods
- `gzip`, `bz2`, and `lzma` in text mode
- `subprocess` with `text=True`
- `tempfile`, `configparser`, and `logging.FileHandler`

**If your code already passes `encoding` explicitly, nothing changes.** The risk is in code that relied on the locale default and happened to work because the locale was UTF-8 anyway - that code will keep working - or code that relied on a non-UTF-8 locale, which may now break.

### Finding affected code

Two options:

1. Run Python with `-X warn_default_encoding` to get `EncodingWarning` wherever an encoding is being assumed
2. Use the `flake8-encodings` plugin to catch these statically

### Restoring the old behavior

If you need the locale-based behavior back, set `PYTHONUTF8=0` in your environment. This is a valid escape hatch for legacy systems, but the better long-term fix is to pass `encoding="locale"` explicitly where you actually want locale behavior, and `encoding="utf-8"` everywhere else.

### For library authors

If your library accepts an `encoding` parameter and defaults to `None`, wrap it with `io.text_encoding()` before passing it downstream. This ensures that any `EncodingWarning` points at the caller's code rather than your library internals.

## Bottom line

RC2 is stable enough to test against seriously. If you haven't run your test suite against 3.15 yet, do it now - October 1 isn't far off.

## Questions this post answers

### What is the default text encoding in Python 3.15 and how is it different from earlier versions?

Python 3.15 makes UTF-8 the default text encoding everywhere, per PEP 686, replacing the previous behavior of using the system locale. This affects open() without an explicit encoding argument, pathlib read/write methods, gzip/bz2/lzma in text mode, subprocess with text=True, tempfile, configparser, and logging.FileHandler. Code that already passes encoding explicitly is unaffected; code relying on a non-UTF-8 locale default may break.

_Teams planning a python 3.15 upgrade can track encoding and compatibility changes like this on daily.dev._

### How can I find code in my Python project that will be affected by the UTF-8 default encoding change in Python 3.15?

Run Python with the -X warn_default_encoding flag to surface an EncodingWarning wherever an encoding is being assumed rather than explicitly specified, or use the flake8-encodings plugin to catch these cases statically before runtime. Library authors should also wrap encoding parameters that default to None with io.text_encoding() so warnings point at the caller's code.

_Developers auditing encoding assumptions before a python upgrade can follow guidance like this via daily.dev._

### When is Python 3.15 final release scheduled and what should library maintainers do before then?

Python 3.15.0 final is scheduled for October 1, 2026, with release candidate 2 being the last planned RC and no further ABI changes expected. Library maintainers should test against the RC now using allow-prereleases: true in the actions/setup-python GitHub Actions step, publish binary wheels, and add the Python 3.15 Trove classifier to package metadata once compatibility is confirmed.

_Maintainers timing wheel builds and compatibility testing around a python release can stay ahead of it via daily.dev._

## Similar posts on daily.dev

- [Python 3.15.0 candidate 1 is here\!](https://daily.dev/posts/python-3-15-0-candidate-1-is-here--fuskzufeb) · Python Insider · 29 upvotes · 4 comments
- [Python 3.15.0 beta 4 is here\!](https://daily.dev/posts/python-3-15-0-beta-4-is-here--tlgvqqsmi) · Python Insider · 9 upvotes · 0 comments
- [Python 3.15 Gets a Surprise RC3 and Other Python News for October 2026 – Real Python](https://daily.dev/posts/python-3-15-gets-a-surprise-rc3-and-other-python-news-for-october-2026-real-python-yfajwaxim) · Real Python · 1 upvotes · 0 comments

---

Tags: [#python](https://daily.dev/tags/python), [#devops](https://daily.dev/tags/devops), [#compiler-optimization](https://daily.dev/tags/compiler-optimization)

[View this post on daily.dev](https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Python 3.15.0 release candidate 2 is out, final release set for October 1","url":"https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi"},"datePublished":"2026-09-01T17:26:02.366Z","dateModified":"2026-09-13T19:54:40.165Z","description":"Python 3.15.0 release candidate 2 is out with roughly 144 bugfixes since RC1, and no further ABI changes are expected before the final release on October 1,...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/af74acaf8f8e063ae76755004f85b7b4?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/af74acaf8f8e063ae76755004f85b7b4?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collections","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collections","logo":"https://media.daily.dev/image/upload/s--fk_6ycEi--/f_auto,q_auto/v1780996001/logos/collections?_a=BAMAMiWQ0","url":"https://daily.dev/sources/collections"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,devops,compiler-optimization","timeRequired":"PT3M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collections","item":"https://daily.dev/sources/collections"},{"@type":"ListItem","position":3,"name":"Python 3.15.0 release candidate 2 is out, final release set for October 1"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/python-3-15-0-release-candidate-2-is-out-final-release-set-for-october-1-e7z4rs7zi#faq","mainEntity":[{"@type":"Question","name":"What is the default text encoding in Python 3.15 and how is it different from earlier versions?","acceptedAnswer":{"@type":"Answer","text":"Python 3.15 makes UTF-8 the default text encoding everywhere, per PEP 686, replacing the previous behavior of using the system locale. This affects open() without an explicit encoding argument, pathlib read/write methods, gzip/bz2/lzma in text mode, subprocess with text=True, tempfile, configparser, and logging.FileHandler. Code that already passes encoding explicitly is unaffected; code relying on a non-UTF-8 locale default may break. Teams planning a python 3.15 upgrade can track encoding and compatibility changes like this on daily.dev."}},{"@type":"Question","name":"How can I find code in my Python project that will be affected by the UTF-8 default encoding change in Python 3.15?","acceptedAnswer":{"@type":"Answer","text":"Run Python with the -X warn_default_encoding flag to surface an EncodingWarning wherever an encoding is being assumed rather than explicitly specified, or use the flake8-encodings plugin to catch these cases statically before runtime. Library authors should also wrap encoding parameters that default to None with io.text_encoding() so warnings point at the caller's code. Developers auditing encoding assumptions before a python upgrade can follow guidance like this via daily.dev."}},{"@type":"Question","name":"When is Python 3.15 final release scheduled and what should library maintainers do before then?","acceptedAnswer":{"@type":"Answer","text":"Python 3.15.0 final is scheduled for October 1, 2026, with release candidate 2 being the last planned RC and no further ABI changes expected. Library maintainers should test against the RC now using allow-prereleases: true in the actions/setup-python GitHub Actions step, publish binary wheels, and add the Python 3.15 Trove classifier to package metadata once compatibility is confirmed. Maintainers timing wheel builds and compatibility testing around a python release can stay ahead of it via daily.dev."}}]}
```

