programmatūra · 6 min · 14.10.2026

Python 3.15 ievieš lazy atslēgvārdu: moduļu imports atliek līdz pirmajai lietošanai

Python 3.15 iznāca 9. oktobrī ar jaunu atslēgvārdu lazy, kas atliek moduļa ielādi līdz brīdim, kad to tiešām izmanto. Līdz šim, rakstot import pandas as pd, Python izpildīja visu pandas koda ielādi uzreiz, pat ja konkrētā palaišana pandas nekad neizsauca. Tagad pietiek uzrakstīt lazy import pandas as pd, lai ielāde notiktu tikai pie pirmās pieejas mainīgajam pd.

Lielām programmām ar dziļu atkarību koku starpība ir jūtama. PyCharm izstrādātāju ieraksts par 3.15 rāda vienkāršu piemēru, kur pandas imports aizņem pusi no visa moduļu ielādes laika. Ja skripts pandas neizmanto, šī puse tagad vispār neizpildās. Visvairāk no tā iegūst komandrindas rīki, kuriem ielādes laiks skaitās pie katras palaišanas. Iegūst arī tīmekļa darbinieki un testu kopas, kur daudzas atkarības tiek ievilktas tikai dažos ceļos.

Kā darbojas lazy atslēgvārds

Pēc PEP 810 lazy imports izveido starpnieka objektu moduļa vietā. Modulis, kas vēl nav ielādēts, parādās sarakstā sys.lazy_modules, nevis parastajā sys.modules. Pie pirmās pieejas Python mēģina importu izpildīt un starpnieku aizstāt ar īsto moduli. Ja izpilde neizdodas, starpnieks paliek vietā un imports tiek mēģināts vēlreiz nākamajā reizē. Kļūdas paziņojums rāda gan vietu, kur imports deklarēts, gan vietu, kur tam piekļuva, tāpēc avota meklēšana nekļūst grūtāka.

Ierobežojumi ir skaidri. lazy drīkst lietot tikai moduļa līmenī. Ja to raksta funkcijā, klases ķermenī vai try blokā, Python izmet SyntaxError. Nav atļauts arī lazy from modulis import * vai lazy from __future__ import .... Globālu uzvedību var ieslēgt ar karogu -X lazy_imports vai mainīgo PYTHON_LAZY_IMPORTS, kas pieņem vērtības all vai normal.

Kodam, kam jāstrādā arī uz vecākām Python versijām, ir pārejas risinājums. Modulis var definēt __lazy_modules__ ar pilno moduļu nosaukumu sarakstu. Vecākās versijas šo atribūtu vienkārši ignorē. Tā viena un tā pati koda bāze paliek lietojama gan uz 3.15, gan uz iepriekšējiem laidieniem.

PEP 810 pamatojums ir tiešs: lietotnēm ar dziļu atkarību koku imports var aizņemt vairākas sekundes, kaut lielākā daļa ielādētā koda konkrētajā palaišanā netiek izmantota.

frozendict un sentinel ir jauni iebūvētie tipi

Modulim builtins pievienoti divi tipi. Pēc PEP 814 frozendict ir nemaināma vārdnīca. Tā nav dict apakšklase, bet manto tieši no object. frozendict ir hešojams, ja hešojamas ir tā atslēgas un vērtības, tāpēc to var lietot kā vārdnīcas atslēgu vai kopas elementu. Salīdzināšana neņem vērā secību.

Praksē tas der konfigurācijai, kuru nevajag mainīt pēc ielādes, vai kešatmiņas atslēgām, kur vajadzīga nemaināma struktūra. Agrāk izstrādātāji šādiem gadījumiem rakstīja savas ietinamklases vai paļāvās uz types.MappingProxyType, kas tikai noslēpj maināmo vārdnīcu, bet pati par sevi nav hešojama.

PEP 661 pievieno tipu sentinel unikālu sentinel vērtību veidošanai ar kompaktu attēlojumu. Līdz šim šādas vērtības veidoja ar object() vai īpašām klasēm, kuru repr atkļūdošanā bieži bija nesaprotams. Jaunais tips dod saprotamu nosaukumu uzreiz, piemēram, lai atšķirtu neesošu vērtību no None funkcijas argumentā.

UTF-8 kļūst par noklusējuma kodējumu

Pēc PEP 686 Python tagad lieto UTF-8 kā noklusējuma kodējumu neatkarīgi no sistēmas vides. Tas attiecas uz ievadi un izvadi bez skaidra encoding argumenta, piemēram, open('fails.txt'). Agrāk Windows vidē tāds izsaukums varēja lasīt failu ar sistēmas lokālo kodu lapu, kas radīja grūti atkārtojamas kļūdas starp operētājsistēmām. Veco uzvedību var atgriezt ar PYTHONUTF8=0 vai -X utf8=0. Arguments encoding='locale' joprojām strādā.

Ātrāks JIT un pārējās izmaiņas

Eksperimentālais JIT kompilators 3.15 ir būtiski uzlabots. Tas joprojām ir jāieslēdz būvēšanas laikā un nav ieslēgts gatavajos oficiālajos būvējumos, tāpēc lielākajai daļai lietotāju ikdienas uzvedība nemainās. Klāt nācis arī atsevišķs profilēšanas iepakojums ar Tachyon izlases profilētāju pēc PEP 799. Vecais profile modulis tagad ir novecojis un tiks izņemts 3.17 versijā, bet cProfile paliek kā tā aizstājējnosaukums.

Versija nes vairākas mazākas izmaiņas valodā. PEP 798 ļauj izmantot izpakošanu ar zvaigznīti sarakstu, kopu un vārdnīcu komprehensijās. PEP 831 pēc noklusējuma ieslēdz kadru rādītājus, kas atvieglo darbu profilētājiem un atkļūdotājiem. PEP 803 dod stabilu ABI brīvpavedienu būvējumiem ar nosaukumu abi3t, tāpēc paplašinājumu autori var piegādāt vienu bināro failu vairākām versijām. PEP 829 pievieno pakotņu startēšanas konfigurācijas failus, bet PEP 788 aizsargā C API no tulka pabeigšanas problēmām.

Versija izņem novecojušu kodu daudzos moduļos, to vidū ast, ctypes, datetime, glob, http.server, pathlib un typing. Pilns izmaiņu saraksts ir oficiālajā What’s New lapā. Kas plāno atjaunināties, tam vērts pārbaudīt, vai izmantotās bibliotēkas jau piedāvā gatavas 3.15 pakotnes, jo daļu no tām 3.15 vajadzībām vēl būvē no pirmavota.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie