Paglabas ng Python 3.11 programming language

Pagkatapos ng isang taon ng pag-unlad, ang makabuluhang paglabas ng Python 3.11 programming language ay nai-publish. Ang bagong sangay ay susuportahan sa loob ng isa at kalahating taon, pagkatapos nito para sa isa pang tatlo at kalahating taon, ang mga pag-aayos ay bubuo para dito upang maalis ang mga kahinaan.

Kasabay nito, nagsimula ang pagsubok sa alpha ng sangay ng Python 3.12 (alinsunod sa bagong iskedyul ng pag-unlad, ang trabaho sa isang bagong sangay ay magsisimula limang buwan bago ang paglabas ng nakaraang sangay at umabot sa yugto ng pagsubok ng alpha sa oras ng susunod na paglabas ). Ang sangay ng Python 3.12 ay nasa alpha release sa loob ng pitong buwan, kung saan ang mga bagong feature ay idaragdag at ang mga bug ay maaayos. Pagkatapos nito, susuriin ang mga bersyon ng beta sa loob ng tatlong buwan, kung saan ang pagdaragdag ng mga bagong feature ay ipagbabawal at lahat ng atensyon ay ibibigay sa pag-aayos ng mga bug. Para sa huling dalawang buwan bago ang paglabas, ang sangay ay nasa yugto ng kandidato sa pagpapalabas, kung saan isasagawa ang panghuling pagpapapanatag.

Ang mga bagong karagdagan sa Python 3.11 ay kinabibilangan ng:

  • Malaking gawain ang nagawa upang ma-optimize ang pagganap. Kasama sa bagong sangay ang mga pagbabagong nauugnay sa acceleration at inline na pag-deploy ng mga function call, ang paggamit ng mga mabilis na interpreter ng mga karaniwang operasyon (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), pati na rin ang mga optimization na inihanda ng mga proyektong Cinder at HotPy. Depende sa uri ng pag-load, mayroong pagtaas sa bilis ng pagpapatupad ng code na 10-60%. Sa karaniwan, ang performance sa pyperformance test suite ay tumaas ng 25%.

    Ang mekanismo ng pag-cache ng bytecode ay muling idinisenyo, na nagpabawas sa oras ng pagsisimula ng interpreter ng 10-15%. Ang mga bagay na may code at bytecode ay statically allocated na ngayon ng interpreter, na naging posible na alisin ang mga yugto ng unmarshalling bytecode na kinuha mula sa cache at pag-convert ng mga object na may code na ilalagay sa dynamic na memorya.

  • Kapag nagpapakita ng mga bakas ng tawag sa mga diagnostic na mensahe, posible na ngayong magpakita ng impormasyon tungkol sa expression na naging sanhi ng error (dati, ang linya lang ang na-highlight nang hindi nagdedetalye kung aling bahagi ng linya ang naging sanhi ng error). Ang pinalawak na impormasyon ng bakas ay maaari ding makuha sa pamamagitan ng API at ginagamit upang i-map ang mga indibidwal na tagubilin ng bytecode sa isang partikular na posisyon sa source code gamit ang codeobject.co_positions() na pamamaraan o ang C API function na PyCode_Addr2Location(). Pinapadali ng pagbabago ang pag-debug ng mga problema sa mga nested na object ng diksyunaryo, maraming function na tawag, at kumplikadong mga expression ng aritmetika. Traceback (huling huling tawag): File "calculation.py", linya 54, sa resulta = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
  • Nagdagdag ng suporta para sa mga exception group, na nagbibigay sa programa ng kakayahang bumuo at magproseso ng ilang magkakaibang mga exception nang sabay-sabay. Upang pagpangkatin ang maramihang mga pagbubukod at pagsama-samahin ang mga ito, ang mga bagong uri ng pagbubukod na ExceptionGroup at BaseExceptionGroup ay iminungkahi, at ang ekspresyong "maliban*" ay idinagdag upang i-highlight ang mga indibidwal na pagbubukod mula sa isang grupo.
  • Ang add_note() na paraan ay idinagdag sa klase ng BaseException, na nagbibigay-daan sa iyong mag-attach ng text note sa exception, halimbawa, pagdaragdag ng contextual na impormasyon na hindi available kapag itinapon ang exception.
  • Nagdagdag ng espesyal na uri ng Sarili upang kumatawan sa kasalukuyang pribadong klase. Maaaring gamitin ang sarili upang i-annotate ang mga pamamaraan na nagbabalik ng isang instance ng klase nito sa mas simpleng paraan kaysa sa paggamit ng TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Nagdagdag ng espesyal na uri ng LiteralString na maaari lamang magsama ng mga literal na string na tugma sa uri ng LiteralString (ibig sabihin, mga bare at LiteralString string, ngunit hindi arbitrary o pinagsamang mga str string). Maaaring gamitin ang uri ng LiteralString upang limitahan ang pagpasa ng mga argumento ng string sa mga function, arbitraryong pagpapalit ng mga bahagi ng mga string kung saan maaaring humantong sa mga kahinaan, halimbawa, kapag bumubuo ng mga string para sa mga query sa SQL o shell command. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Wala: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • Ang uri ng TypeVarTuple ay naidagdag, na nagpapahintulot sa paggamit ng mga variable na generic, hindi tulad ng TypeVar, na sumasaklaw sa hindi isang uri, ngunit isang arbitrary na bilang ng mga uri.
  • Kasama sa karaniwang library ang tomllib module na may mga function para sa pag-parse ng TOML format.
  • Posibleng markahan ang mga indibidwal na elemento ng mga nai-type na diksyunaryo (TypedDict) na may mga Required at NotRequired na mga label upang matukoy ang kinakailangan at opsyonal na mga field (bilang default, lahat ng ipinahayag na field ay kinakailangan kung ang kabuuang parameter ay hindi nakatakda sa False). class Movie(TypedDict): pamagat: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (opsyonal ang field ng taon) m3: Pelikula = {β€œtaon”: 2022} # Error, hindi napunan ang kinakailangang field ng pamagat)
  • Ang klase ng TaskGroup ay naidagdag sa asyncio module na may pagpapatupad ng isang asynchronous na tagapamahala ng konteksto na naghihintay para sa isang pangkat ng mga gawain upang makumpleto. Ang pagdaragdag ng mga gawain sa isang pangkat ay ginagawa gamit ang paraan ng create_task(). async def main(): async sa asyncio.TaskGroup() bilang tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Nakumpleto na ang parehong gawain ngayon .")
  • Idinagdag ang @dataclass_transform decorator para sa mga klase, pamamaraan at function, kapag tinukoy, tinatrato ng static type checking system ang object na parang gumagamit ng @dataclasses.dataclass decorator. Sa halimbawa sa ibaba, ang klase ng CustomerModel, kapag nagsusuri ng mga uri, ay ipoproseso nang katulad ng isang klase na may @dataclasses.dataclass decorator, i.e. bilang pagkakaroon ng __init__ na pamamaraan na tumatanggap ng mga variable ng id at pangalan. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • Sa mga regular na expression, ang kakayahang gumamit ng atomic grouping ((?>...)) at possessive quantifiers (*+, ++, ?+, {m,n}+) ay naidagdag.
  • Idinagdag ang "-P" na opsyon sa command line at PYTHONSAFEPATH environment variable upang hindi paganahin ang awtomatikong pag-attach ng mga potensyal na hindi ligtas na mga path ng file sa sys.path.
  • Ang py.exe utility para sa Windows platform ay makabuluhang napabuti, nagdaragdag ng suporta para sa "-V:" syntax. / " karagdagan sa "- . "
  • Maraming macro sa C API ang na-convert sa mga regular o static na inline na function.
  • Ang uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev, at sunau modules ay hindi na ginagamit at aalisin sa Python 3.13 release. Inalis ang mga function ng PyUnicode_Encode*.

Pinagmulan: opennet.ru

Magdagdag ng komento