Издание на езика за програмиране Python 3.9

След година разработка представен значителен издаден език за програмиране Python 3.9. Python 3.9 стана първото издание след прехода проекта на нов цикъл подготовка и поддръжка на издания. Новите значителни издания вече ще бъдат формулирани веднъж годишно, а коригиращите актуализации ще бъдат издавани на два месеца. Всяка значителна версия ще се поддържа в течение на година и половина, след което ще бъдат формулирани корекции за уязвимости в следващите три години и половина.

Работата по новата версия сега започва пет месеца преди издаването на поредната версия, т.е. едновременно с издаването на Python 3.9 започна алфа-тестовете на версия Python 3.10. Версия Python 3.10 ще бъде в етап алфа-издания в течение на седем месеца, през които ще бъдат добавяни нови възможности и поправки на грешки. След това в продължение на три месеца ще се извършва тестване на бета-версии, през което добавянето на нови възможности ще бъде забранено и всичкото внимание ще бъде насочено към поправки на грешки. Последните два месеца преди издаването версията ще бъде в етап кандидат за издания, на който ще бъде извършена финална стабилизация.

Среда добавени нововъведения в Python 3.9:

  • В речниците, създадени с вградения клас dict, се появи подкрепа на операторите за сливане «|» и обновление «|=», които допълват методите {**d1, **d2} и dict.update, преди предлагани за обединение на речници.

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}

    >>> x | y
    {"key1": "value1 from x", "key2": "value2 from y", "key3": "value3 from y"}

    >>> y | x
    {"key2": "value2 from x", "key3": "value3 from y", "key1": "value1 from x"}

  • Вградена колекция от типове включва list, dict и tuple, които могат да се използват като основни типове без импортиране от модула typing. Т.е. вместо typing.List, typing.Dict и typing.Tuple сега може да се измерва
    просто list, dict и tuple:

    def greet_all(names: list[str]) -> None:
    for name in names:
    print("Hello", name)

  • Предоставени са гъвкави средства за анотиране на функции и променливи. За прикрепяне на анотации в модула typing е добавен нов тип Annotated, който разширява съществуващите типове с допълнителни метаданни, които могат да се използват при статичен анализ или за оптимизация по време на изпълнение. За достъп до метаданните от кода в метода typing.get_type_hints() е добавен параметър include_extras.

    charType = Annotated[int, ctype("char")]
    UnsignedShort = Анотировани[int, struct2.ctype(‘H’)]

  • Улучшени граматични изисквания към декораторите — всяко изразяване, подходящо за използване в блокове if и while, сега може да се използва като декоратор. Промените значително подобриха четивността на кода PyQt5 и опростиха поддръжката на този модул:

    Беше:
    button_0 = buttons[0]
    @button_0.clicked.connect

    Сега можете да напишете:
    @buttons[0].clicked.connect

  • В стандартната библиотека е добавен модул zoneinfo, включваща информация от базата за времеви зони на IANA.

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Летно време
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(«America\/Los_Angeles»))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    ‘PDT’

    >>> # Стандартно време
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Добавен е модул graphlib, в който е реализирана се поддържа топологично сортиране на графи.
  • Предложени са нови методи за премахване на префикси и окончания на низове — str.removeprefix(prefix) и str.removesuffix(suffix). Методите са добавени към обектите str, bytes, bytearray и collections.UserString.

    >>> s = «FooBar»
    >>> s.removeprefix(«Foo»)
    ‘Bar’

  • Участва нов парсер PEG (Parsing Expression Grammar), който замести парсера LL(1). Прилагането на новия парсер позволи да се избегнат някои "хакове", използвани за заобикаляне на ограниченията в LL(1), и значително намали разходите за поддръжка на парсера. По производителност новият парсер е на приблизително същото ниво като предишния, но значително го превъзхожда на гъвкавост, което позволява по-свободно проектиране на нови възможности на езика. Кодът на стария парсер все още е запазен и може да бъде възстановен с флага "-X oldparser" или променливата на средата "PYTHONOLDPARSER=1", но ще бъде премахнат в версия 3.10.
  • Предоставена възможността методите на C-разширения да получават достъп до състоянието на модулите, в които са дефинирани, с използването на директно разименуване на указатели вместо намиране на състоянието на модула с функцията PyState_FindModule. Промените позволяват увеличаване на производителността на C-модулите чрез намаляване или пълно елиминиране на разходите за проверка на състоянието на модула. За асоцииране на модула с клас е предложена C-функцията PyType_FromModuleAndSpec(), за получаване на модула и неговото състояние C-функциите PyType_GetModule() и PyType_GetModuleState(), а за предоставяне на метода достъп до класа, в който е дефиниран, C-функцията PyCMethod и флаг METH_METHOD.
  • Сборщик на боклук освободен от блокировка на колекции, включващи реанимирани обекти, които остават достъпни отвън след стартиране на финализатора.
  • Добавен е метод os.pidfd_open, позволяващ използването на подсистемата на ядрото Linux «pidfd» за обработка на ситуацията с повторно използване на PID (pidfd е свързан с конкретен процес и не се променя, докато PID може да бъде свързан с друг процес след приключването на текущия процес, асоцииран с този PID).
  • Поддръжката на спецификацията Unicode е обновена до версия 13.0.0.
  • Отстранена изтичане на памет при повторна инициализация на интерпретатора Python в един процес.
  • Извършена е оптимизация на производителността на вградени типове range, tuple, set, frozenset, list и dict, реализирана чрез прилагане на протокола за бързо извикване Vectorcall за по-бърз достъп до обекти, написани на C.
  • Модулите _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time и _weakref са преведени за зареждане с инициализация в няколко стадия.
  • Модулите на стандартната библиотека audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios и zlib са преведени за използване на ограничен стабилен ABI, който решава проблема с работоспособността на сборките на разширителни модули за различни версии на Python (при обновление на версията не се изисква повторно свиване на разширителни модули, и модулите, събрани за 3.9, ще могат да работят в клон 3.10).
  • В модула asyncio поради потенциални проблеми със сигурността е прекратена поддръжката на параметъра reuse_address (използването на SO_REUSEADDR за UDP в Linux позволява на различни процеси да свързват слушателски сокети с UDP порта).
  • Добавени са нови оптимизации, например, повишена производителност на обработчиците на сигнали в многопоточни приложения, подобрена скорост на работа на модула subprocess в среда FreeBSD и ускорено присвояване на временни променливи (присвояването на променлива в израза «for y in [expr]» вече не отстъпва по производителност на израза «y = expr»). По принцип повечето тестове показват показват намаляване на производителността в сравнение с клона 3.8 (ускорение се наблюдава само в тестовете write_local и write_deque):

    Версия Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Достъп за четене на променливи и атрибути:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    прочитване на classvar от клас 25.6 26.5 20.7 19.5 18.4 18.6
    прочитване на classvar от инстанция 22.8 23.5 18.8 17.1 16.4 20.1
    прочитване на instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    прочитване на instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    прочитване на namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    прочитване на boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Достъп за запис на променливи и атрибути:
    записване на локално 8.7 9.3 5.5 5.3 4.3 4.2
    записване на нелокално 10.5 11.1 5.6 5.5 4.7 4.9
    записване на глобално 19.7 21.2 18.0 18.0 15.8 17.2
    записване на classvar 92.9 96.0 104.6 102.1 39.2 43.2
    записване на instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    записване на instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Достъп за четене на структури от данни:
    прочитане на списък 24.2 24.5 20.8 20.8 19.0 21.1
    прочитане на deque 24.7 25.5 20.2 20.6 19.8 21.6
    прочитане на речник 24.3 25.7 22.3 23.0 21.0 22.5
    прочитане на strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Достъп за запис на структури от данни:
    записване на списък 27.1 28.5 22.5 21.6 20.0 21.6
    записване на deque 28.7 30.1 22.7 21.8 23.5 23.2
    записване на речник 31.4 33.3 29.3 29.2 24.7 27.8
    записване на strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Операции със стек (или опашка):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Времето за цикъл:
    разходи за цикъл 0.5 0.6 0.4 0.3 0.3 0.3

  • Премахнати са много функции и методи на Python 2.7, които преди бяха отбелязани като остарели и в миналото доведоха до предупреждение DeprecationWarning, включително метод unescape() в html.parser.HTMLParser,
    tostring() и fromstring() в array.array, isAlive() в threading.Thread, getchildren() и getiterator() в ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() и base64.decodestring().

Източник: opennet.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster