Menu Zamknij

KemSoft · Python · Automatyzacja raportów

Python 3.15 nadchodzi — najważniejsze zmiany i opóźnienie premiery

Python 3.15 jest blisko premiery, ale wydanie stabilne zostało przesunięte. Sprawdź, co naprawdę się zmienia, jak przetestować firmowe skrypty i dlaczego import CSV zasługuje na szczególną uwagę.

1. Kiedy premiera i dlaczego została przesunięta?

Stan na 4 października 2026 r.: Python 3.15 nie jest jeszcze wydaniem stabilnym. Dostępny jest Python 3.15.0rc3, opublikowany 2 października. Oficjalna strona wydania wskazuje 9 października 2026 r. jako planowany termin wersji 3.15.0 final. To zapowiedź, którą warto ponownie sprawdzić przed instalacją.

Twórcy wskazali błędy blokujące wydanie, związane z lazy imports, czyli odroczonym ładowaniem modułów. Dodatkowy kandydat do wydania daje czas na sprawdzenie poprawek. Komunikat dotyczy domknięcia konkretnych problemów przed premierą.

Najważniejsze daty
ZdarzenieDataZnaczenie
Python 3.15.0rc32.10.2026Kandydat do wydania, przeznaczony do sprawdzania zgodności.
Planowane wydanie 3.15.0 final9.10.2026Termin wskazany w harmonogramie PEP 790.
Stan informacji w artykule4.10.2026Przed premierą wersji stabilnej.

W firmie możesz już przygotować testy. Oficjalny komunikat odradza jednak używanie tego wydania przedpremierowego w środowisku produkcyjnym. Dla skryptu, który codziennie tworzy raport sprzedaży, rozsądnym miejscem próby jest osobny folder i kopia danych.

Dokumentacja: Komunikat Python 3.15.0rc3.

Dokumentacja: PEP 790 — harmonogram.

2. Co zmienia się z perspektywy firmy?

Nowa wersja języka ma znaczenie wtedy, gdy wpływa na Twoje zadanie: import danych, uruchamianie narzędzia, kontrolę konfiguracji albo diagnozowanie wolnego raportu. Poniższa mapa łączy najważniejsze nowości z takimi sytuacjami. To przykłady zastosowań, a nie obietnica automatycznej poprawy każdego programu.

Nowość i możliwe zastosowanie
ZmianaPrzykład zastosowaniaCo sprawdzić
UTF-8 jako domyślny trybImport CSV z polskimi znakami.Rzeczywiste kodowanie eksportu z systemu.
lazy importNarzędzie oferuje wiele opcji, ale używasz jednej.Czy moduł musi wykonać inicjalizację już przy starcie.
frozendictStała konfiguracja raportu.Czy wartości wewnątrz mapowania są też niezmienne.
sentinelRozróżnienie braku parametru od jawnego None.Czy logika odróżnia brak, zero i pustą wartość.
Rozpakowywanie w comprehensionsSpłaszczenie list wierszy z kilku sklepów.Czy zespół uruchamia kod na Pythonie 3.15.
Pakiet profilingPomiar, dlaczego przeliczenie raportu trwa długo.Który etap rzeczywiście zajmuje czas.

Dokumentacja: What’s new in Python 3.15.

3. UTF-8: mała zmiana, ważny test dla importów CSV

Python 3.15 domyślnie włącza tryb UTF-8. Starszy skrypt, który otwierał plik bez parametru encoding, mógł wcześniej polegać na ustawieniach systemu. To szczególnie istotne dla eksportów z Windows. Aktualizacja interpretera nie przekształca istniejących plików do nowego kodowania.

Zanim poprawisz kod, ustal format eksportu. Plik może być zapisany jako UTF-8, UTF-8 z BOM albo np. Windows-1250. Sam separator średnikowy niczego tu nie rozstrzyga. Jeśli system eksportuje Windows-1250, wpisz świadomie encoding="cp1250"; nie stosuj tej nazwy do każdego polskiego pliku.

Python: jawne kodowanie pliku

from pathlib import Path

# Wariant dla pliku UTF-8, także z opcjonalnym BOM.
tekst = Path("sprzedaz.csv").read_text(encoding="utf-8-sig")
print(tekst.splitlines()[0])

# Jeśli dokumentacja eksportu wskazuje Windows-1250:
# tekst = Path("sprzedaz.csv").read_text(encoding="cp1250")

Nie rozwiązuj błędów odczytu przez bezrefleksyjne errors="ignore". Znikające znaki mogą zmienić nazwy produktów, placówek lub identyfikatory. Poprawnie zakończony program nie oznacza wtedy poprawnego raportu. Zachowaj plik źródłowy i porównaj kilka rekordów zawierających „ą”, „ł” i „ś”.

Dokumentacja: PEP 686 — UTF-8 mode.

4. Ćwiczenie: import sprzedaży z kontrolą wyniku

Przygotuj dwa pliki w jednym folderze: sprzedaz.csv i kontrola_csv.py. Dane poniżej są fikcyjne. Zapisz CSV jako UTF-8; średnik oddziela kolumny, a przecinek jest separatorem części dziesiętnej. Ćwiczenie korzysta ze standardowej biblioteki i działa również na wcześniejszych współczesnych wersjach Pythona.

Dane do pliku sprzedaz.csv

Sklep;Produkt;SprzedazNetto
Katowice;Chleb żytni;1250,50
Katowice;Rogal maślany;749,50
Gliwice;Bułka grahamka;900,00
Gliwice;Drożdżówka z serem;1100,00

Python: kontrola_csv.py

import csv
from collections import defaultdict
from decimal import Decimal, InvalidOperation
from pathlib import Path

plik = Path(__file__).resolve().parent / "sprzedaz.csv"
sumy = defaultdict(lambda: Decimal("0"))
liczba = 0

with plik.open(encoding="utf-8-sig", newline="") as uchwyt:
    czytnik = csv.DictReader(uchwyt, delimiter=";")
    if czytnik.fieldnames != ["Sklep", "Produkt", "SprzedazNetto"]:
        raise ValueError("Nieprawidłowe nagłówki lub separator CSV.")

    for rekord, wiersz in enumerate(czytnik, start=1):
        if None in wiersz or any(v is None for v in wiersz.values()):
            raise ValueError(f"Rekord {rekord}: błędna liczba pól.")
        sklep = wiersz["Sklep"].strip()
        produkt = wiersz["Produkt"].strip()
        kwota = wiersz["SprzedazNetto"].strip().replace(",", ".")
        if not sklep or not produkt or not kwota:
            raise ValueError(f"Rekord {rekord}: brak wymaganej wartości.")
        try:
            wartosc = Decimal(kwota)
        except InvalidOperation as blad:
            raise ValueError(f"Rekord {rekord}: błędna kwota.") from blad
        if not wartosc.is_finite():
            raise ValueError(f"Rekord {rekord}: kwota musi być skończona.")
        sumy[sklep] += wartosc
        liczba += 1

if liczba == 0:
    raise ValueError("Plik nie zawiera rekordów sprzedaży.")

for sklep, wartosc in sorted(sumy.items()):
    print(f"{sklep}: {wartosc:.2f} zł")
print(f"Rekordy: {liczba}")
print(f"Suma: {sum(sumy.values(), Decimal('0')):.2f} zł")

Oczekiwany wynik: Gliwice 2000,00 zł; Katowice 2000,00 zł; 4 rekordy; łącznie 4000,00 zł. Program wyświetli kropki dziesiętne. Kwoty powstają z tekstu przez Decimal, więc nie wprowadzamy najpierw przybliżeń typu float.

Kod zatrzyma import przy pustej kwocie, zamiast przypisać jej zero. Nie wykrywa natomiast duplikatów transakcji, bo przykładowe dane nie zawierają ID dokumentu. W rzeczywistym raporcie kontrolę duplikatów zbuduj na kluczu ustalonym z właścicielem danych. Ujemna kwota może oznaczać zwrot — jej odrzucanie wymaga reguły biznesowej.

Dokumentacja: csv — DictReader i newline.

Dokumentacja: decimal — arytmetyka dziesiętna.

5. Lazy imports: moduł ładuje się przy pierwszym użyciu

W Pythonie 3.15 możesz oznaczyć import słowem lazy. Ładowanie zostaje odłożone do pierwszego użycia importowanej nazwy. W narzędziu, które czasem tylko sprawdza parametry, a czasem tworzy duży raport, może to ograniczyć pracę wykonywaną przy starcie.

Python 3.15: odroczony import

# Python 3.15 — samodzielny plik .py
lazy import json

print("Narzędzie uruchomione")

def przygotuj_json():
    return json.dumps({"sklep": "Katowice"}, ensure_ascii=False)

# Pierwsze użycie json uruchamia jego ładowanie.
print(przygotuj_json())

To demonstracja mechanizmu, a nie benchmark. Mały moduł json nie musi dać zauważalnej korzyści. Import oznaczony jako odroczony zapisuj na poziomie modułu; nowej składni nie umieszczaj wewnątrz funkcji ani bloku try. Starsze wersje Pythona nie rozpoznają tej składni.

Błąd ładowania może ujawnić się dopiero przy pierwszym użyciu. Sprawdź również skutki uboczne: rejestrowanie wtyczek, ustawianie logowania czy przygotowanie zasobów podczas importu. Jeśli program potrzebuje takiej inicjalizacji od razu, zmiana momentu ładowania może zmienić zachowanie. Zacznij od jednego modułu i porównaj start oraz pełne wykonanie.

Dokumentacja: PEP 810 — explicit lazy imports.

6. Frozendict: konfiguracja bez przypadkowej podmiany

Nowy wbudowany frozendict tworzy mapowanie, którego wpisów nie można później zmieniać. Może służyć do zapisania parametrów raportu, które mają pozostać stałe przez cały przebieg obliczeń. Nie jest podklasą dict, co ma znaczenie w kodzie sprawdzającym dokładny typ obiektu.

Python 3.15: stałe parametry raportu

# Python 3.15
konfiguracja = frozendict({
    "waluta": "PLN",
    "separator": ";",
    "kodowanie": "utf-8-sig",
})
print(konfiguracja["waluta"])  # PLN

try:
    konfiguracja["waluta"] = "EUR"
except TypeError:
    print("Konfiguracja pozostaje niezmieniona.")

Niezmienność dotyczy mapowania, a nie automatycznie wszystkich obiektów w środku. Jeśli wartością jest lista, jej zawartość nadal może się zmienić. Gdy potrzebujesz stałej kolekcji sklepów, rozważ krotkę. Hashowanie frozendict jest możliwe tylko wtedy, gdy wszystkie klucze i wartości dają się hashować.

Dokumentacja: Built-in Types — frozendict.

7. Sentinel: brak danych to nie zero

W raporcie „nie przekazano wartości”, „przekazano pustą wartość” i „sprzedaż wyniosła zero” to różne sytuacje. Python 3.15 dodaje wbudowany sentinel, który pomaga nadać brakowi argumentu odrębny znacznik. Porównujemy go przez is.

Python 3.15: rozróżnienie braku, None i zera

# Python 3.15
BRAK = sentinel("BRAK")

def opisz_sprzedaz(wartosc=BRAK):
    if wartosc is BRAK:
        return "Nie przekazano danych"
    if wartosc is None:
        return "Przekazano pustą wartość"
    return f"Sprzedaż: {wartosc} zł"

print(opisz_sprzedaz())      # Nie przekazano danych
print(opisz_sprzedaz(None))  # Przekazano pustą wartość
print(opisz_sprzedaz(0))     # Sprzedaż: 0 zł

Sam znacznik nie naprawia jakości danych. Trzeba jeszcze zdecydować, czy brak wstrzymuje raport, trafia na listę błędów czy jest pokazany w tabeli jako brak. Warunek if not wartosc połączyłby m.in. zero i None; w tym przykładzie potrzebujemy osobnych reguł.

Dokumentacja: Built-in functions — sentinel.

8. Łączenie list krótszym zapisem

Python 3.15 pozwala rozpakowywać elementy w comprehensions, czyli składanych zapisach tworzących kolekcje. Gdy masz listę list z wierszami kilku raportów, nowy zapis może zastąpić zagnieżdżoną pętlę. Wybierz go dopiero wtedy, gdy środowiska uruchomieniowe obsługują nową wersję.

Python 3.15: spłaszczenie list raportów

# Python 3.15
raporty = [["KAT-001", "KAT-002"], ["GLI-001"], []]
wiersze = [*raport for raport in raporty]
print(wiersze)  # ['KAT-001', 'KAT-002', 'GLI-001']

# Wariant działający również we wcześniejszych wersjach:
wiersze_starszy_zapis = [
    wiersz for raport in raporty for wiersz in raport
]
assert wiersze == wiersze_starszy_zapis

To spłaszczenie jednego poziomu. Nie jest łączeniem tabel po identyfikatorze i nie wykonuje agregacji sprzedaży. Jeśli wejściem są słowniki, ustal dodatkowo regułę dla powtarzających się kluczy — krótszy zapis nie usuwa konfliktów danych.

Dokumentacja: PEP 798 — unpacking in comprehensions.

9. Wydajność: najpierw zmierz własny raport

Python 3.15 porządkuje narzędzia analizy wydajności w pakiecie profiling. Obejmuje m.in. narzędzia śledzące wywołania i profiler próbkujący Tachyon. Dotychczasowy cProfile pozostaje dostępny jako alias zapewniający zgodność.

W praktyce podziel czas raportu na: pobranie plików, odczyt, przekształcenia, obliczenia i zapis. Gdy większość czasu zajmuje pobieranie z sieci, zmiana interpretera może niewiele zmienić. Gdy problemem jest start programu, warto zbadać importy. Gdy koszt jest w obliczeniach, najpierw znajdź funkcję, która go powoduje.

Porównuj ten sam zestaw danych, ten sam komputer i kilka przebiegów. Zapisz czas uruchomienia oraz czas całego zadania. Skrócenie startu przy dłuższym pierwszym użyciu modułu nie musi skrócić procesu, który wykorzystuje wszystkie moduły. Tak samo wyniki benchmarku twórców języka nie określają tempa Twojego eksportu do Excela.

Dokumentacja: profiling — Python profilers.

10. Jak przygotować test aktualizacji krok po kroku?

Najpierw wybierz jeden reprezentatywny skrypt. Zachowaj jego działającą wersję, próbkę wejścia i wzorcowy wynik. Osobne środowisko pozwala zainstalować zależności testowe bez podmieniania pakietów działającego raportu. Poniższe polecenia zakładają, że Python 3.15 jest już zainstalowany i dostępny pod wskazaną nazwą.

PowerShell: osobne środowisko Python 3.15

# Windows PowerShell — w folderze projektu
py -3.15 -m venv .venv315
.\.venv315\Scripts\python.exe --version
.\.venv315\Scripts\python.exe -m pip install -r requirements.txt
.\.venv315\Scripts\python.exe -m pip check
.\.venv315\Scripts\python.exe -X warn_default_encoding kontrola_csv.py

Terminal: osobne środowisko Python 3.15

# macOS / Linux — w folderze projektu
python3.15 -m venv .venv315
./.venv315/bin/python --version
./.venv315/bin/python -m pip install -r requirements.txt
./.venv315/bin/python -m pip check
./.venv315/bin/python -X warn_default_encoding kontrola_csv.py

Użycie pełnej ścieżki do interpretera środowiska usuwa potrzebę aktywowania go w terminalu. Jeśli testujesz wyłącznie nasze ćwiczenie CSV, pomiń instalację z requirements.txt: nie korzysta ono z zewnętrznych pakietów. Dla własnego projektu użyj jego istniejącej listy zależności.

Jeżeli projekt nie ma takiej listy, możesz zapisać stan dedykowanego dotychczasowego środowiska poleceniem python -m pip freeze > requirements-zastane.txt. To spis zainstalowanych pakietów, nie gwarancja przenośności ani gotowy mechanizm blokowania wszystkich zależności. Nie nadpisuj przy tym istniejących plików projektu.

Przy błędzie instalacji sprawdź komunikat i wsparcie Pythona 3.15 w dokumentacji konkretnej biblioteki. Nie usuwaj losowo numerów wersji. Pakiety z komponentami kompilowanymi mogą wymagać odpowiedniego pliku wheel lub narzędzi budowania. Obsługę nowego interpretera sprawdza się osobno dla każdej zależności.

pip check sprawdza zgodność deklarowanych zależności zainstalowanych pakietów. Nie weryfikuje wzorów, kodowania CSV ani poprawności Twojego raportu. Opcja -X warn_default_encoding pomaga wykryć użycia domyślnego kodowania; nie jest automatyczną naprawą plików.

Dokumentacja: venv — tworzenie środowisk.

Dokumentacja: pip check.

Dokumentacja: pip freeze.

11. Co musi zgadzać się przed wdrożeniem?

Przy aktualizacji skryptu sprzedażowego ocena powinna obejmować wynik biznesowy. Ustal kryteria przed testem, żeby nie zaakceptować różnicy tylko dlatego, że nowy program uruchomił się bez wyjątku.

Przykładowa lista kontroli migracji
ObszarSprawdzenieWarunek akceptacji
KompletnośćLiczba plików i rekordów.Wszystkie oczekiwane wejścia zostały przetworzone.
KwotySumy globalne i sumy na sklep.Zgodność z wynikiem wzorcowym i przyjętym zaokrąglaniem.
TekstPolskie znaki i identyfikatory.Brak utraty znaków lub zmiany kluczy.
BrakiPuste pole, zero, zwrot, błędny format.Każdy przypadek obsłużony zgodnie z regułą raportu.
ZależnościImport bibliotek i pip check.Brak błędów instalacji i zadeklarowanych konfliktów.
HarmonogramInterpreter wskazany w zadaniu systemowym.Test działa z konta i folderu używanego przez zadanie.
PowrótStary interpreter, kod i zależności.Możliwość uruchomienia dotychczasowego procesu.

Jeśli raport uruchamia Harmonogram zadań Windows, przejrzyj ścieżkę programu oraz katalog roboczy. Poprawny test w terminalu użytkownika nie sprawdza jeszcze konta zadania, jego uprawnień do folderu i dostępu do plików. Zrób kontrolny przebieg w warunkach zbliżonych do rzeczywistego uruchomienia.

Nasza rekomendacja dla firmowych automatyzacji: teraz przygotuj próbę zgodności, a wdrożenie zaplanuj po stabilnym wydaniu i pozytywnym przejściu własnych testów. Nie istnieje jedna liczba dni oczekiwania dobra dla wszystkich skryptów. Decydują krytyczność procesu i potwierdzone wsparcie jego zależności.

Podsumowanie

Python 3.15 przynosi nowe narzędzia do pracy z importami, konfiguracją, brakującymi wartościami i kolekcjami. Dla osoby tworzącej raporty szczególnie praktyczny jest przegląd kodowania plików: jawne parametry odczytu ograniczają zależność od ustawień komputera.

Na 4.10.2026 wersja stabilna jest planowana na 9.10.2026. Zacznij od kopii raportu, znanych danych i porównania wyników. Wprowadzaj nowe konstrukcje wtedy, gdy rozwiązują konkretny problem i działają w środowiskach całego zespołu.

Źródła i dokumentacja

Dokumentacja przedpremierowa może się zmieniać. Daty wydania sprawdź ponownie przed aktualizacją.

Przeczytaj również

Ładowanie artykułów…

10h | C++ Kurs Podstawowy Programowania | Postaw Na Rozwój

X