Ce este nou în Python 3, 3, python 3 pentru începători și manechine

Informații de bază

Noile caracteristici de sintaxă:

  • Randament de expresie nou pentru implementarea generatorului.
  • Sintaxa u "unicode" este din nou permisă pentru obiectele de tip str.

Module noi încorporate:







Noile îmbunătățiri încorporate:

  • Ierarhia I / O a excepțiilor a fost revizuită
  • Rescriind importul mașinii de import
  • Mai multe comprimate unicode compacte
  • Dicționare mai compacte
  • Randomizarea sumei hash activată implicit

PEP 405: Mediul virtual

Mediile virtuale vor ajuta la crearea de instalări separate Python prin partajarea setărilor de bază la nivel de sistem pentru ușurința întreținerii. Mediile virtuale au un set propriu de pachete private (adică biblioteci instalate local) și nu sunt neapărat separate de pachetele de sistem.

Acest PEP adaugă modulul venv pentru accesul la program și scriptul pyvenv pentru accesarea liniei de comandă și a administrării. Interpretul Python devine conștient de fișierul pvenv.cfg, a cărui existență este semnalizată de arborele de directoare al mediului virtual.

PEP 420: Nomenclatorul pachetelor

Suport încorporat pentru pachetele care nu necesită fișiere __init__.py

PEP 393: Vizualizare rânduri flexibile

Șirurile sunt modificate pentru a suporta mai multe reprezentări interne, în funcție de caracterul cu cel mai mare ordinal Unicode (1, 2 sau 4 octeți). Acest lucru vă permite să reprezentați efectiv șiruri de caractere în majoritatea cazurilor, dar vă oferă acces complet la UCS-4 pe toate sistemele. Pentru compatibilitatea cu un API existent, pot exista mai multe vizualizări în paralel, în timp, această compatibilitate ar trebui terminată.

Pe partea C a API, PEP 393 este complet compatibil înapoi. API ar trebui să rămână disponibil timp de cel puțin cinci ani. Aplicațiile care utilizează API-ul nu va fi în utilizarea deplină a memoriei, sau - chiar mai rău - ar putea folosi de memorie un pic mai mult ca Python, va trebui să mențină două versiuni ale fiecărei linii (într-un format moștenire și în noua eficiență de stocare).

funcționalitate

Modificările făcute de PEP 393:

  • Python acceptă întotdeauna setul complet de coduri Unicode, inclusiv caractere non-BMP (de la U + 0000 la U + 10FFFF). Diferența dintre șirul îngust și cel lat nu mai există, iar Python se comportă acum ca un ansamblu mare, chiar și sub Windows.
  • Odată cu moartea unei versiuni înguste, problemele specifice unei versiuni înguste au fost de asemenea fixate, de exemplu:
    • len () întotdeauna întoarce întotdeauna 1 pentru caractere non-BMP, deci len ('\ U0010FFFF') == 1;
    • perechile surogate nu se recombinesc în literali de șir, deci '\ uDBFF \ uDFFF'! = '\ U0010FFFF';
    • indexul sau felia de caractere non-BMP returnează valoarea așteptată, astfel că '\ U0010FFFF' [0] returnează acum '\ U0010FFFF'. nu '\ uDBFF';
    • Toate celelalte funcții ale bibliotecii standard gestionează corect codurile non-BMP.
  • Valoarea sys.maxunicode este acum întotdeauna 1114111 (0x10FFFF în hexazecimal). PyUnicode_GetMax () returnează încă 0xFFFF sau 0x10FFFF pentru compatibilitate înapoi și nu ar trebui să fie utilizat cu noul API Unicode.
  • ./ configure -with-wide-flag-ul unicode a fost eliminat.






Performanța și utilizarea resurselor

Stocarea șirurilor de caractere Unicode depinde acum de codul maxim din șirul de cod:

  • Șirurile ASCII și Latin1 (U + 0000 - U +00 FF) utilizează 1 octet;
  • Șirurile BMP (U + 0000 - U + FFFF) utilizează 2 octeți;
  • comenzile non-BMP (U + 10000 - U +10 FFFF) utilizează 4 octeți.

Rezultatul este că pentru majoritatea aplicațiilor, utilizarea memoriei ar trebui să scadă în mod semnificativ - în special în comparație cu fostul Unicode, deoarece în multe cazuri, linia va fi ASCII pură, chiar și într-un context internațional (pentru că limba multe rânduri magazin de date non-umane, cum ar fi Fragmente XML, anteturi HTTP, date codate în JSON, etc.). De asemenea, sperăm că, din aceleași motive, va îmbunătăți eficiența cache-ului procesorului pentru aplicații non-triviale. Utilizarea memoriei Python 3.3 este de două până la trei ori mai mică decât Python 3.2, și puțin mai mică decât Python 2.7, la testul Django.

PEP 3151: ierarhizarea excepțională a OS și IO

Ierarhia excepțiilor este simplificată și mai detaliată.

Nu trebuie să vă faceți griji cu privire la selectarea tipului adecvat de excepție între OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error sau select.error. Toate aceste tipuri de excepții sunt acum doar una: OSError. Alte nume sunt stocate ca aliasuri pentru a asigura compatibilitatea.

În plus, acum este mai ușor să prindeți o anumită condiție de eroare. În loc să verificați atributul ERRNO pentru o anumită constantă din modulul ERRNO, puteți gestiona o anumită subclasă de OSError. Subclase disponibile:

  • BlockingIOError
  • ChildProcessError
  • ConnectionError
  • fileexistserror
  • FileNotFoundError
  • InterruptedError
  • IsADirectoryError
  • NotADirectoryError
  • PermissionError
  • ProcessLookupError
  • TimeoutError

Și ConnectionError are și subclase:

  • BrokenPipeError
  • ConnectionAbortedError
  • ConnectionRefusedError
  • ConnectionResetError

De exemplu, următorul cod scris pentru Python 3.2:

Acum poate fi scris fără a importa ERRNO și fără a verifica manual atributele de excepție:

PEP 380: Sintaxa pentru delegarea Subgeneratorului

PEP 380 adaugă randamentul din. Aceasta permite generatorului să delege o parte din operațiunile sale unui alt generator. Acest lucru permite ca o bucată de cod care conține "randament" să fie redată și plasată într-un alt generator. În plus, subgeneratorului i sa permis să se întoarcă cu o valoare, iar valoarea devine disponibilă pentru delegarea generatorului.

Deși este destinat în primul rând pentru a fi utilizat în delegarea unui subgenerator, randamentul de fapt permite delegarea subiterilor arbitrare.

Pentru iterații simpli, randamentul de la iterabil este pur și simplu o formă scurtă pentru elementul iterabil: randament

Cu toate acestea, spre deosebire de bucla obișnuită, randamentul vă permite să returnați valoarea finală unui generator extern:

Principiul de bază al schimbării este de a permite generatorului să fie împărțit în mai multe subgeneratoare la fel de ușor ca o funcție mare să poată fi împărțită în mai multe subfuncții.

PEP 409: Suprimarea contextului de excludere

PEP 409 introduce o nouă sintaxă care vă permite să dezactivați contextul de excepție. Acest lucru vă permite să obțineți un mesaj de eroare curat în aplicații, să convertiți la diferite tipuri de excepții:

Fără expresia din "Niciuna", se va ridica o excepție standard:

Cu toate acestea, excepția inițială rămâne disponibilă, pentru a simplifica depanarea:

Nume complete pentru clase și funcții

Funcțiile și obiectele de clasă din Python 3.3 au un nou atribut __qualname__ (reprezentând "calea" de la modulul de nivel superior). Pentru funcțiile și clasele globale, aceasta este aceeași cu __name__. Pentru alte funcții și clase, oferă informații mai bune despre locul în care au fost definite și despre modul în care acestea pot fi accesate din domeniul global.

Exemplu cu metoda (nelegat):

Exemplu cu clase imbricate:

Exemplu cu funcție imbricată:

Reprezentarea în șir a acestor obiecte este de asemenea schimbată pentru a afișa mai multe informații:

PEP 412: Dicționare de partajare a cheilor

Dicționarele din Python 3.3 au acum capacitatea de a partaja o parte din memoria care stochează cheile și hash-urile lor, ceea ce îmbunătățește performanța celor mai multe tipuri non-încorporate.







Articole similare

Trimiteți-le prietenilor: