Издаване на езика за програмиране 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 от x", "key2": "value2 от x"}
    >>> y = {"key2": "value2 от y", "key3": "value3 от y"}

    >>> x | y
    {'key1': 'value1 от x', 'key2': 'value2 от y', 'key3': 'value3 от y'}

    >>> y | x
    {'key2': 'value2 от x', 'key3': 'value3 от y', 'key1': 'value1 от 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 = Annotated[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

    Достъп за запис на променливи и атрибути:
    запишете_local 8.7 9.3 5.5 5.3 4.3 4.2
    запишете_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    запишете_global 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

    Достъп за четене на данни:
    прочетете_list 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
    прочетете_dict 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

    Достъп за запис на структури от данни:
    запишете_list 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
    запишете_dict 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