Что нового появилось в Python в 2021 году? OTUS
Python был разработан около тридцати лет назад, первая его официальная версия вышла в 1991 году и имела номер 0.9. После этого довольно долгое время язык развивался, и популярность он получил в 2000-х годах, во время мажорной второй версии. Однако уже тогда было понятно, что в языке необходимы изменения, которые будут обратно несовместимы с текущими версиями, такие как например, изменения в поведении юникодных строк. Однако вторая версия Python была уже очень популярна к этому моменту, поэтому третья работа над третьей версией велась одновременно с работой над 2.7. Довольно долго у core-разработчиков Python не было определенной стратегии, поэтому до версии 3.4 изменения были довольно хаотичны.
С 2019 года Python адаптирует годичные релизные циклы. Это изменение было представлено в PEP-602 Что это значит для пользоватеоей Python?
- новая минорная (3.X.0) версия выходит каждый год
- фаза активной разработки версии 3. X+1.0 начинается в тот момент, когда в релих отправляется 3.X.beta и продолжается 12 месяцев
- каждая минорная версия активно поддерживается в течении полутора лет
- каждая минорная версия получает обновления безопасности в течении трех с половиной лет Пример расписания релизов для версии 3.9 можно посмотреть на рисунке:
Релиз Python 3.9 произошел 2020-10-05. Рассмотрим что есть нового в этой версии.
Работа со словарями
Допустим, есть два словаря, которые мы зотим объединить.
В версиях до 3.9 можно было бы сделать таким образом:
In [9]:
pycon = {2017: "Portland", 2018: "Cleveland", 2019: "Cleveland", 2020: "online"} europython = {2017: "Rimini", 2018: "Edinburgh", 2019: "Basel"} {**pycon, **europython}
Out[9]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
Синтаксис **
разворачивает словарь, и когда они объединяются, более позднее значение затирается более новым. Аналогичные дейтсвия можно совершить, если использовать следующий синтаксис:
In [7]:
merged_dict = pycon. copy() for key, value in europython.items(): merged_dict[key] = value merged_dict
Out[7]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
Или таким образом:
In [8]:
pycon.update(europython) pycon
Out[8]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
Этот способ пойдойдет в случае если нужно изменить первоначальный словарь.
In [14]:
merged_dict = pycon.copy().update(europython)
Out[14]:
{2017: 'Portland', 2018: 'Cleveland', 2019: 'Cleveland', 2020: 'online'}
In [ ]:
Однако если нужно сохранить эти данные в новом словаре, этим способом воспользоваться нельзя, в последнем примере
In [17]:
merged_dict is None
Out[17]:
True
В библиотеке collections есть объект ChainMap, который тоже обхединяет словари, но его результатом будет объект ChainMap, а не словарь. Он состоит из нескольких словарей, следующих друг за другом. Если взять значение по ключу, то вернется то значение, которое встречается раньше. То есть, в этом примере для ключа 2019, вернется значение Cleveland
In [28]:
from collections import ChainMap merged_dict = ChainMap(pycon, europython) merged_dict
Out[28]:
ChainMap({2017: 'Amsterdam', 2018: 'Cleveland', 2019: 'Cleveland', 2020: 'online'}, {2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel'})
В Python 3.8 был представлен walrus-оператор. С его помощью можно решить проблему примера с update и скопировать словарь в новую переменную:In [11]:
(merged_dict := pycon.copy()).update(europython) merged_dict
Out[11]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
В Python 3.9 в PEP-0614 добавлен синтаксис | (читается как pipe), который объединяет словари аналогично первому примеру:
In [13]:
pycon | europython
Out[13]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
При этом первоначальный словарь не меняется:
In [14]:
pycon
Out[14]:
{2017: 'Portland', 2018: 'Cleveland', 2019: 'Cleveland', 2020: 'online'}
Если все-таки нужно обновить первоначальный словарь, можно воспользоваться синтаксисом |= (работает по аналогии с +=): a |= b a = a|bIn [16]:
pycon |= europython pycon
Out[16]:
{2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
Важно помнить, что поскольку более поздние значения перезаписывают более ранние значения, эта операция может быть не коммуникативна.
In [23]:
print(europython | pycon) print(pycon | europython)
{2017: 'Portland', 2018: 'Cleveland', 2019: 'Cleveland', 2020: 'online'} {2017: 'Rimini', 2018: 'Edinburgh', 2019: 'Basel', 2020: 'online'}
Синтаксис | работает только непосредственно со словарями, тогда как синтаксис ** работает и с orderedict и с другими подобными словарям объектами.
Изменения в работе с декораторами
До версии 3.9 в качестве декораторов могли выступать функции или классы, но не такие объекты как списки или словари. Рассмотрим пример, в котором это будет удобно использовать. Допустим есть UI-приложение с кнопками, и нужно добавить какое-то сообщение по нажатию на каждую кнопку. Было бы удобно это сделать с помощью декоратора, но что делать, если для каждой кнопки нужно печатать различные сообщения. Это можно сделать следующим образом:In [ ]:
buttons = [QPushButton(f'Button {i}') for i in range(10)] button_0 = buttons[0] button_1 = buttons[1] @button_0. clicked.connect def say_hello(): message.setText("Hello, World!") @button_1.clicked.connectdef say_goodbye(): message.setText("Goodbye, World!")
Создаем list comprehension из функций, явно присваем объектам значения элементов списка, и их можно использовать в качестве декораторов. Это будет работать, однако не будет эффективно, если объектов из которых будут созданы декораторы, будет достаточно много.
Это не единственный способ, но другие будут довольно неоднозначными. Рассмотрим два из них. В первом случае создадим функцию, которая будет возвращать необходимую для декоратора функцию:In [ ]:
def _(x): return x @_(buttons[0].clicked.connect) def say_hello(): ...
Использование eval
:In [ ]:
@eval("buttons[1].clicked.connect") def say_bye(): ...
В Python 3.9 стало возможно создавать декораторы из любых объектов, например из элементов списков и словарей.
Можно рассмотреть синтаксис, который реализует тот же самый пример:In [ ]:
@buttons[0].clicked.connect def say_hello(): message.setText("Hello, World!") @buttons[1].clicked.connect def say_goodbye(): message.setText("Goodbye, World!")
Похожим образом будет выглядеть синтаксис для значений словаря:
In [ ]:
buttons = {'hello': QPushButton('Hello!'), 'goodbye': QPushButton('Goodbye!')} @buttons['hello'].clicked.connect def say_hello(): message.setText("Hello, World!") @buttons['goodbye'].clicked.connect def say_goodbye(): message.setText("Goodbye, World!")
Этот функционал, несмотря на то, что не приносит новых возможностей, позволяет писать более чистый код и избегать рискованных решений вроде использования eval
.
Изменения в синтаксисе типирования
Дженерики
Дженерики это типы, которые могут быть параметризованы, обычно являются контейнерами, например dict.
Начиная с Python 3.7 стало можно указывать тип объекта, конкретизируя тип внутренних элементов контейнеры. Но для этого нужно было импортировать таки типы как List
из модуля typing
:
In [ ]:
from typing import List, Dict def find(haystack: Dict[str, List[int]]) -> int: #def find(haystack: dict) -> int: ...
Можно было не конкретизировать тип внутренних значений, для этого не нужно было импортировать дополинтельные типы и можно было использовать стандартные типы dict и list. Благодаря этому нововведению, внешние библиотеки такие как Mypy стали распознавать дженерики.
Также, в версии 3.9 стало можно пользоваться аннотациями без явного их импорта из модуля __future__
Расширение возможностей аннотаций
Аннотации были доступны для использования и в более ранних версиях Python, однако их функция была скорее информационной, использовались они в первую очередь для документации. Синтаксис использования аннотаций до Python 3.9 выглядел таким образом:
In [24]:
def speed(distance: "feet", time: "seconds") -> "miles per hour": fps2mph = 3600 / 5280 return distance / time * fps2mph
В Python 3.9 появился новый объект типа Annotated, который принимает на вход два аргумента, первый это реальный тип, которым должен обладать аннотриуемый объект, а второй это название для целей документации:
In [ ]:
from typing import Annotated def speed( distance: Annotated[float, "feet"], time: Annotated[float, "seconds"]) -> Annotated[float, "miles per hour"]: fps2mph = 3600 / 5280return distance / time * fps2mph
Когда происходит проверка аннотаций, проверяется только первый аргумент, в котором находится «реальный» тип объекта, а второй использовуется как и в предыдущих версиях:
In [25]:
speed. __annotations__
Out[25]:
{'distance': 'feet', 'time': 'seconds', 'return': 'miles per hour'}
Изменения связанные с часовыми поясами
В предыдущих версиях Python, модуль datetime
не содержал информации о часовых поясах, и рекомендованным способом работы с ними была библиотека python-dateutil
.
Однако начиная с Python 3.9 появился модуль zoneinfo, который содержит информацию о часовых поясах и позволяет создавать объекты им соответствующие:
In [31]:
from datetime import datetime, timezone from zoneinfo import ZoneInfo local_tz = ZoneInfo('Europe/Amsterdam') datetime.now(tz=timezone.utc), datetime.now()
Out[31]:
(datetime.datetime(2021, 5, 4, 15, 58, 36, 295472, tzinfo=datetime.timezone.utc), datetime.datetime(2021, 5, 4, 17, 58, 36, 295477))
В стандартной библиотеке не было информации ни о каких часовых поясах, кроме utc, и необходимо было использовать pytz
чтобы создать объект, содержащий информацию о часовом поясе. Теперь это можно сделать без установки дополнительных библиотек:In [32]:
from zoneinfo import ZoneInfo local_tz = ZoneInfo('Europe/Amsterdam') datetime.now(tz=local_tz)
Out[32]:
(datetime.datetime(2021, 5, 4, 17, 58, 37, 765947, tzinfo=zoneinfo.ZoneInfo(key='Europe/Amsterdam')),)
In [ ]:
Всего часовых поясов больше чем можно было бы предположить, и многие из них представлены в модуле `zoneinfo`
In [33]:
import zoneinfo tzs = zoneinfo.available_timezones() len(tzs)
Out[33]:
594
Новые методы работы со строкам
Иногда нужно убрать первые или последние несколько символов из строки. Есть метод strip
, который обладает казалось бы похожим функционалом, но он может иногда давать неожиданные результаты Например в таком случае:
In [34]:
"ababbbbbbaaccc".lstrip("ab")
Out[34]:
'ccc'
В Python 3. 9 были добавлены функции removeprefix
, removesuffix
, которые выполняют то, что от них ожидается: удаляют первые или последние несколько символов строки.In [35]:
"ababbbbbbaaccc".removeprefix("ab")
Out[35]:
'abbbbbbaaccc'
In [36]:
"ababbbbbbaaccc".removesuffix("c")
Out[36]:
'ababbbbbbaacc'
In [36]:
Если строка не содержит суффикс или префикс, строка не меняется, никаких исключений не появляется.
In [37]:
"ababbbbbbaaccc".removesuffix("something else")
Out[37]:
'ababbbbbbaaccc'
Ссылки:
- https://docs.python.org/3/whatsnew/3.9.html#summary-release-highlights
Последняя версия Python 3.10 это 0b3, которая вышла 17 июня 2021 года. Согласно расписанию релизов, полноценный релиз появится примерно в октябре 2021. Пока официального релиза нет, версия не доступна в пакетных менеджерах (таких как brew). Соответственно, чтобы ее установить, билд нужно скачать вручную с www. python.org и уствноваить на своей машине. Рассмотрим изменения, доступные в этой Python 3.9.
Pattern Matching
В более ранних версиях Python если нужно описать различное поведение, в зависимости от того, какой объект используется, скорее всего будет использоваться условный оператор:In [ ]:
if isinstance(x, tuple) and len(x) == 2: host, port = x mode = "http" elif isinstance(x, tuple) and len(x) == 3: host, port, mode = x
Однако в Python 3.10 вместе с PEP-0635 будет добавлен новый оператор match, который может использоваться с case:In [ ]:
match x: case host, port: mode = "http" case host, port, mode: pass cass Class1: ... case host == 'localhost' ...
Также с его помощью будет удобно реализовывать, например, обработку ошибок:In [ ]:
def http_error(status): match status: case 400: return "Bad request" case 404: return "Not found" case 418: return "I'm a teapot" case _: return "Something's wrong with the Internet"
Это одно из самых «громких» нововведений в последних версиях Python и возможно самое ожидаемое коммьюнити.
Более удобное использование Union для типирования:
Если раньше чтобы указать, что аргумент функции может быть одним из нескольких типов, необходимо было использовать Union, импортируемый из пакета typing:In [ ]:
from typing import Union def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
То начиная с Python 3.10 можно будет заменить его оператором pipe | и, соответственно, избавиться от импорта:In [ ]:
def square(number: int | float) -> int | float: return number ** 2
Контекстные менеджеры
Синтаксис работы с контекстными менеджерами упростится, теперь несколько контекстных менеджеров можно объединять в одном with
, а так же не обязательно присваивать им локальные имена:In [ ]:
with ( CtxManager1(), CtxManager2() ): ... with (CtxManager1() as example, CtxManager2()): . IndentationError: expected an indented block after 'if' statement in line 2
Остальное
- Модуль distutils постепенно выыводится из употребления, чтобы быть полностью удаленным в Python 3.12. Это связано с тем, что его функции были полностью заменены такими модулями как setuptools и packaging.
- Улучшение читабельности сообщений в модуле debugging
Это не все изменения которые попадут в Python 3.10, с полным списком можно ознакомиться посмотрев список изменений.
Прокачать Python можно на курсах:
- Python Developer. Basic
- Python Developer. Professional
- Web-разработчик на Python
Управление несколькими версиями Python под управлением Ubuntu 20.04 / Хабр
Одно из моих первых разочарований при разработке на Python не имело ничего общего с самим Python, а скорее с излишне изотерическими действиями по развертыванию приложений на Python. Учебные курсы и руководства отлично справляются с задачей обучения студентов запуску Python кода локально, но действительно стоящие приложения не запускают на локальных машинах: они работают на интернет серверах потому что именно в этом и есть их назначение, не так ли? Хотя может быть я высказал сумасшедшую идею.
Ubuntu 20.04 это первая LTS версия Ubuntu в которой отсутствует Python2 и которая поставляется из коробки с установленной версией Python 3.8.5. Но что если написанное вами приложение использующее более новую версию Python? Если вы, как и я, пытались заменить установленную по умолчанию в системе версию, то в процессе сломали вашу ОС. Если до этого вам никто не говорил не делать этого, тогда я возьму на себя эту честь: не делайте этого.
Итак, что же нам делать? Существует нескольок путей как обновить версию Python на Ubuntu, но использование вастроенного в Ubuntu’s механизма «alternative install» оптимально по нескольким причинам:
Мы хотим оставить нетронутойси стемную версию Python
По возможности не возиться с Python PATH
Мы можем удобно переключать активную версию Python с использованием CLI
Мы пройдемся по способу легкой и безопасной установки последней версии Python не затрагивая системную версию Python.
Скачивание последней версии Python
Первый шаг должен быть вам знаком: нам необходимо обновить зеркала Ubuntu и установленные пакеты, что бы быть уверенными что мы загружаем последние версии пакетов при установке чего-либо:
Обязательные обновления: $ sudo apt update && sudo apt upgrade -y
Установка другой версии Python на Ubuntu трубует установки целого ряда зависимых библиотек для Python. Я честно гвооря не уверен что делает половина из этого, и скорее всего это никому из нас никогда не понадобится. Но поверьте, это необходимый шаг:
Установка зависимостей Python: $ sudo apt-get install build-essential checkinstall $ sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev \ libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev
Именно здесь многие могут начать установку Python с помощью Ubuntu package manager командой apt-get install python3.X. Мы скачаем и соберем последнюю версию Python из исходные кодов по нескольким причинам. Если версия Python достаточно свежая, некоторые машины под управлением Ubuntu могут не иметь обновленных зеркал что бы получить последнюю версию, но важнее всего то, что этот способ позволяет упростить управление несколькими версиями Python на Ubuntu.
Последнюю версию Python всегда можно найти на официальной странице с релизами на Python.org:
Релизы исходных кодов Python
Первая ссылка на указанной странице должна называться Latest Python 3 Release — Python 3.X. Перейдя по ней необходимо прокрутить вниз страницы до секции «Files» и скопировать URL ссылки Gzipped source tarball.
На вашей Ubuntu машине необходимо теперь скачать эти исходные коды с помощью утилиты «wget». Ниже пример команд для скачивания заархивированной версии Python 3.9.2 в папку /opt и распаковка ее:
Скачивание Python: $ cd /opt $ sudo wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz $ sudo tar xzf Python-3.9.2.tgz
Теперь последняя версия Python скачана. После этого нам остается ее установить… правильно.
Установка альтернативной версии Python из исходных кодов
Главное разочарование установки Python с использованием команды apt-get install python3.X
это что Python будет установлен нормально, но Ubuntu будет по прежнему использовать установленную в системе по умолчанию версию Python. К счастью для нас Ubuntu позволяет устанавливать нам дополнительные (альтернативные) версии Python с использованием команды make altinstall
:
Установка из исходных кодов: $ cd Python-3.9.2 $ sudo ./configure —enable-optimizations $ sudo make altinstall
Исполнение этих команд может занять некоторое время. После того, как команды будут выполнены вы можете увидеть python3.9 в вашей директории /usr/local/bin/
:
Проверка версии Python $ cd /usr/local/bin/ $ ls
Итак, теперь у нас есть две установленные версии Python: установленная в системе по-умолчанию Python 3.8.5 и добавленная нами новая версия Python 3.9.2. Мы хотим оставить нетронутой установленную в системе версию по-умолчанию, но мы так же хотим запускать написанные нами приложения в версии Python 3. 9… итак как мы можем этим управлять?
Linux предусматривает такой сценарий с помощью команды update-alternatives
. Мы можем сказать Ubuntu что у нас есть ветка с альтернативной версией на нашей машине, это предоставит нам возможность легко переключаться между ними. Вот как это работает:
Включение альтернативной версии Python $ update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 $ update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.9 2
Мы запускаем update-alternatives
дважды: один раз для Python 3.8, и один раз для Python 3.9. Теперь мы можем использовать команду update-alternatives —list
что бы посмотреть все альтернативные версии какого-либо установленного ПО:
Список установленных версий Python $ update-alternatives --list python3 /usr/bin/python3.6 /usr/local/bin/python3.8
Теперь мы можем переключаться между установленными версиями Python! Запустите следующую команду:
Переключение между версиями $ update-alternatives --config python3
После выполнения команды вы должны получить подсказку как в приведенном ниже примере. Это будет список всех доступных версий Python в вашей системе. Выберите версию которую хотите использовать введя соответствующий номер версии указанный в колонке Selection
:
CLI для переключения активной версии Python Selection Path Priority Status ------------------------------------------------------------ 0 /usr/bin/python3.8 3 auto mode * 1 /usr/bin/python3.8 3 manual mode 2 /usr/local/bin/python3.10 2 manual mode Press <enter> to keep the current choice[*], or type selection number:
И вы это сделали! Для переключения версии Python все что нужно — это ввести запрошенный номер версии Python указанный в колонке selection
.
Это прозвучит абсурдно, но изменить версию Python в Ubuntu ничего не сломав — это впечатляет. Я бы сказал что это в основном вина тех, кто преподаает Python. Если «учат те, кто не может сделать», то было бы логично предположить что Python преподают те, кто не запустил ни одного значимого проекта. Это было жестко, но не бейте меня нисмотря ни на что.
Мы закончили самую трудную часть, но осталось еще немного рутинной работы. Нам все еще нужно установить pip для нашей свежеустановленной версии Python, а так же обновить pip до последней версии.
Установка pip3 $ apt install python3-pip $ python3.9 -m pip install --upgrade pip
Последний штрих
Вы наверняка заметили что Ubuntu 20.04 (и новее) заставляют нас явно указывать python3 при использовании Python несмотря на отсутствие Python 2 на машине. Это немного раздражает, но так же потенциально может сломать библиотеки которые пытаются использовать Python (NPM, sqlite и node-qyp например)
Возможно вы чувствуетет в себе достаточно сил что бы создать alias, который будет при обращении к python ссылаться на python3, но к сожалению это не будет работать так, как вам бы хотелось. Хорошая новость в том, что есть простое решение:
Скажите Ubuntu что python это python3 $ apt-get install python-is-python3
Да, есть целый пакет для Ubuntu созданный специально для решения этой задачи. Но это работает ¯_(ツ)_/¯.
ДокументацияPython по версиям | Python.org
Некоторые предыдущие версии документации остаются доступными онлайн. Используйте список ниже, чтобы выбрать версию для просмотра.
Информацию о невыпущенной (в разработке) документации см. В версиях для разработчиков.
- Python 3.11.0, документация выпущена 24 октября 2022 г.
- Python 3.10.7, документация выпущена 6 сентября 2022 г.
- Python 3.10.6, документация выпущена 8 августа 2022 г.
- Python 3.10.5, документация выпущена 6 июня 2022 г.
- Python 3.10.4, документация выпущена 24 марта 2022 г.
- Python 3.10.3, документация выпущена 16 марта 2022 г.
- Python 3.10.2, документация выпущена 14 января 2022 г.
- Python 3.10.1, документация выпущена 6 декабря 2021 г.
- Python 3.10.0, документация выпущена 4 октября 2021 г.
- Python 3.9.14, документация выпущена 6 сентября 2022 г.
- Python 3. 9.13, документация выпущена 17 мая 2022 г.
- Python 3.9.12, документация выпущена 24 марта 2022 г.
- Python 3.9.11, документация выпущена 16 марта 2022 г.
- Python 3.9.10, документация выпущена 14 января 2022 г.
- Python 3.9.9, документация выпущена 15 ноября 2021 г.
- Python 3.9.8, документация выпущена 5 ноября 2021 г.
- Python 3.9.7, документация выпущена 30 августа 2021 г.
- Питон 3.9.6, документация выпущена 28 июня 2021 г.
- Python 3.9.5, документация выпущена 3 мая 2021 г.
- Python 3.9.4, документация выпущена 4 апреля 2021 г.
- Python 3.9.3, документация выпущена 2 апреля 2021 г.
- Python 3.9.2, документация выпущена 19 февраля 2021 г.
- Python 3.9.1, документация выпущена 8 декабря 2020 г.
- Python 3.9.0, документация выпущена 5 октября 2020 г.
- Python 3.8.14, документация выпущена 6 сентября 2022 г.
- Python 3.8.13, документация выпущена 16 марта 2022 г.
- Python 3.8.12, документация выпущена 30 августа 2021 г.
- Python 3.8.11, документация выпущена 28 июня 2021 г.
- Python 3.8.10, документация выпущена 3 мая 2021 г.
- Python 3.8.9, документация выпущена 2 апреля 2021 г.
- Python 3.8.8, документация выпущена 19 февраля 2021 г.
- Python 3.8.7, документация выпущена 21 декабря 2020 г.
- Python 3.8.6, документация выпущена 23 сентября 2020 г.
- Python 3.8.5, документация выпущена 20 июля 2020 г.
- Python 3.8.4, документация выпущена 13 июля 2020 г.
- Python 3.8.3, документация выпущена 13 мая 2020 г.
- Python 3.8.2, документация выпущена 24 февраля 2020 г.
- Python 3.8.1, документация выпущена 18 декабря 2019 г.
- Python 3.8.0, документация выпущена 14 октября 2019 г.
- Python 3.7.15, документация выпущена 11 октября 2022 г.
- Python 3.7.14, документация выпущена 6 сентября 2022 г.
- Python 3. 7.13, документация выпущена 16 марта 2022 г.
- Python 3.7.12, документация выпущена 4 сентября 2021 г.
- Python 3.7.11, документация выпущена 28 июня 2021 г.
- Python 3.7.10, документация выпущена 15 февраля 2021 г.
- Python 3.7.9, документация выпущена 17 августа 2020 г.
- Python 3.7.8, документация выпущена 27 июня 2020 г.
- Python 3.7.7, документация выпущена 10 марта 2020 г.
- Python 3.7.6, документация выпущена 18 декабря 2019 г..
- Python 3.7.5, документация выпущена 15 октября 2019 г.
- Python 3.7.4, документация выпущена 8 июля 2019 г.
- Python 3.7.3, документация выпущена 25 марта 2019 г.
- Python 3.7.2, документация выпущена 24 декабря 2018 г.
- Python 3.7.1, документация выпущена 20 октября 2018 г.
- Python 3.7.0, документация выпущена 27 июня 2018 г.
- Python 3.6.15, документация выпущена 4 сентября 2021 г.
- Python 3.6.14, документация выпущена 28 июня 2021 г.
- Python 3.6.13, документация выпущена 15 февраля 2021 г.
- Python 3.6.12, документация выпущена 17 августа 2020 г.
- Python 3.6.11, документация выпущена 27 июня 2020 г.
- Python 3.6.10, документация выпущена 18 декабря 2019 г.
- Python 3.6.9, документация выпущена 2 июля 2019 г.
- Python 3.6.8, документация выпущена 24 декабря 2018 г.
- Python 3.6.7, документация выпущена 20 октября 2018 г.
- Python 3.6.6, документация выпущена 27 июня 2018 г.
- Python 3.6.5, документация выпущена 28 марта 2018 г.
- Python 3.6.4, документация выпущена 19 декабря 2017 г.
- Python 3.6.3, документация выпущена 3 октября 2017 г.
- Python 3.6.2, документация выпущена 17 июля 2017 г.
- Python 3.6.1, документация выпущена 21 марта 2017 г.
- Python 3.6.0, документация выпущена 23 декабря 2016 г.
- Python 3.5.10, документация выпущена 5 сентября 2020 г.
- Python 3. 5.8, документация выпущена 1 ноября 2019 г.
- Python 3.5.7, документация выпущена 18 марта 2019 г.
- Python 3.5.6, документация выпущена 8 августа 2018 г.
- Python 3.5.5, документация выпущена 4 февраля 2018 г.
- Python 3.5.4, документация выпущена 25 июля 2017 г.
- Python 3.5.3, документация выпущена 17 января 2017 г.
- Python 3.5.2, документация выпущена 27 июня 2016 г.
- Python 3.5.1, документация выпущена 7 декабря 2015 г.
- Python 3.5.0, документация выпущена 13 сентября 2015 г.
- Python 3.4.10, документация выпущена 18 марта 2019 г.
- Python 3.4.9, документация выпущена 8 августа 2018 г.
- Python 3.4.8, документация выпущена 4 февраля 2018 г.
- Python 3.4.7, документация выпущена 25 июля 2017 г.
- Python 3.4.6, документация выпущена 17 января 2017 г.
- Python 3.4.5, документация выпущена 26 июня 2016 г.
- Python 3.4.4, документация выпущена 6 декабря 2015 г.
- Python 3.4.3, документация выпущена 25 февраля 2015 г.
- Python 3.4.2, документация выпущена 4 октября 2014 г.
- Python 3.4.1, документация выпущена 18 мая 2014 г.
- Python 3.4.0, документация выпущена 16 марта 2014 г.
- Python 3.3.7, документация выпущена 19 сентября 2017 г.
- Python 3.3.6, документация выпущена 12 октября 2014 г.
- Python 3.3.5, документация выпущена 9 марта 2014 г.
- Python 3.3.4, документация выпущена 9Февраль 2014.
- Python 3.3.3, документация выпущена 17 ноября 2013 г.
- Python 3.3.2, документация выпущена 15 мая 2013 г.
- Python 3.3.1, документация выпущена 7 апреля 2013 г.
- Python 3.3.0, документация выпущена 29 сентября 2012 г.
- Python 3.2.6, документация выпущена 11 октября 2014 г.
- Python 3.2.5, документация выпущена 15 мая 2013 г.
- Python 3.2.4, документация выпущена 7 апреля 2013 г.
- Python 3. 2.3, документация выпущена 10 апреля 2012 г.
- Python 3.2.2, документация выпущена 4 сентября 2011 г.
- Python 3.2.1, документация выпущена 10 июля 2011 г.
- Python 3.2, документация выпущена 20 февраля 2011 г.
- Python 3.1.5, документация выпущена 9 апреля 2012 г.
- Python 3.1.4, документация выпущена 11 июня 2011 г.
- Python 3.1.3, документация выпущена 27 ноября 2010 г.
- Python 3.1.2, документация выпущена 21 марта 2010 г.
- Python 3.1.1, документация выпущена 17 августа 2009 г.
- Python 3.1, документация выпущена 27 июня 2009 г.
- Python 3.0.1, документация выпущена 13 февраля 2009 г.
- Python 3.0, документация выпущена 3 декабря 2008 г.
- Python 2.7.18, документация выпущена 20 апреля 2020 г.
- Python 2.7.17, документация выпущена 19 октября 2019 г.
- Python 2.7.16, документация выпущена 2 марта 2019 г.
- Python 2.7.15, документация выпущена 30 апреля 2018 г.
- Python 2.7.14, документация выпущена 16 сентября 2017 г.
- Python 2.7.13, документация выпущена 17 декабря 2016 г.
- Python 2.7.12, документация выпущена 26 июня 2016 г.
- Python 2.7.11, документация выпущена 5 декабря 2015 г.
- Python 2.7.10, документация выпущена 23 мая 2015 г.
- Python 2.7.9, документация выпущена 10 декабря 2014 г.
- Python 2.7.8, документация выпущена 1 июля 2014 г.
- Python 2.7.7, документация выпущена 31 мая 2014 г.
- Python 2.7.6, документация выпущена 10 ноября 2013 г.
- Python 2.7.5, документация выпущена 15 мая 2013 г.
- Python 2.7.4, документация выпущена 6 апреля 2013 г.
- Python 2.7.3, документация выпущена 9 апреля 2012 г.
- Python 2.7.2, документация выпущена 11 июня 2011 г.
- Python 2.7.1, документация выпущена 27 ноября 2010 г.
- Python 2.7, документация выпущена 4 июля 2010 г.
- Python 2.6.9, документация выпущена 29 октября 2013 г.
- Python 2.6.8, документация выпущена 10 апреля 2012 г.
- Python 2.6.7, документация выпущена 3 июня 2011 г.
- Python 2.6.6, документация выпущена 24 августа 2010 г.
- Python 2.6.5, документация выпущена 19 марта 2010 г.
- Python 2.6.4, документация выпущена 25 октября 2009 г.
- Python 2.6.3, документация выпущена 2 октября 2009 г.
- Python 2.6.2, документация выпущена 14 апреля 2009 г..
- Python 2.6.1, документация выпущена 4 декабря 2008 г.
- Python 2.6, документация выпущена 1 октября 2008 г.
- Python 2.5.4, документация выпущена 23 декабря 2008 г.
- Python 2.5.3, документация выпущена 19 декабря 2008 г.
- Python 2.5.2, документация выпущена 21 февраля 2008 г.
- Python 2.5.1, документация выпущена 18 апреля 2007 г.
- Python 2.5, документация выпущена 19 сентября 2006 г.
- Python 2.4.4, документация выпущена 18 октября 2006 г.
- Python 2. 4.3, документация выпущена 29 марта 2006 г.
- Python 2.4.2, документация выпущена 28 сентября 2005 г.
- Python 2.4.1, документация выпущена 30 марта 2005 г.
- Python 2.4, документация выпущена 30 ноября 2004 г.
- Python 2.3.5, документация выпущена 8 февраля 2005 г.
- Python 2.3.4, документация выпущена 27 мая 2004 г.
- Python 2.3.3, документация выпущена 19Декабрь 2003 г.
- Python 2.3.2, документация выпущена 3 октября 2003 г.
- Python 2.3.1, документация выпущена 23 сентября 2003 г.
- Python 2.3, документация выпущена 29 июля 2003 г.
- Python 2.2.3, документация выпущена 30 мая 2003 г.
- Python 2.2.2, документация выпущена 14 октября 2002 г.
- Python 2.2.1, документация выпущена 10 апреля 2002 г.
- Python 2.2p1, документация выпущена 29 марта 2002 г.
- Python 2.2, документация выпущена 21 декабря 2001 г.
- Python 2.1.3, документация выпущена 8 апреля 2002 г.
- Python 2.1.2, документация выпущена 16 января 2002 г.
- Python 2.1.1, документация выпущена 20 июля 2001 г.
- Python 2.1, документация выпущена 15 апреля 2001 г.
- Python 2.0.1, документация выпущена 22 июня 2001 г.
- Python 2.0, документация выпущена 16 октября 2000 г.
- Python 1.6, документация выпущена 5 сентября 2000 г.
- Python 1.5.2p2, документация выпущена 22 марта 2000 г.
- Python 1.5.2p1, документация выпущена 6 июля 1999 г.
- Python 1.5.2, документация выпущена 30 апреля 1999 г.
- Python 1.5.1p1, документация выпущена 6 августа 1998 г.
- Python 1.5.1, документация выпущена 14 апреля 1998 г.
- Python 1.5, документация выпущена 17 февраля 1998 г.
- Python 1.4, документация выпущена 25 октября 1996 г.
Статус версий Python
НаверхПереключить боковую панель оглавления
Основной веткой в настоящее время является будущий Python 3. 12, и это единственная ветвь, которая принимает новые функции. Последний выпуск для каждого Python версию можно найти на странице загрузки.
Поддерживаемые версии
Даты, выделенные курсивом , запланированы и могут быть скорректированы.
Филиал | Расписание | Статус | Первый выпуск | Конец срока службы | Менеджер релизов |
---|---|---|---|---|---|
основной | ПКП 693 | Особенности | 03.10.2023 | 2028-10 | Томас Воутерс |
3.11 | ПКП 664 | Исправление | 24.10.2022 | 2027-10 | Пабло Галиндо Сальгадо |
3. 10 | ПКП 619 | Исправление | 04.10.2021 | 2026-10 | Пабло Галиндо Сальгадо |
3,9 | ПКП 596 | безопасность | 05.10.2020 | 2025-10 | Лукаш Ланга |
3,8 | ПКП 569 | безопасность | 14.10.2019 | 2024-10 | Лукаш Ланга |
3,7 | ПКП 537 | безопасность | 27.06.2018 | 27.06.2023 | Нед Дейли |
Неподдерживаемые версии
Филиал | Расписание | Статус | Первый выпуск | Конец срока службы | Менеджер релизов |
---|---|---|---|---|---|
3,6 | ПКП 494 | окончание срока службы | 23. 12.2016 | 23.12.2021 | Нед Дейли |
3,5 | ПКП 478 | окончание срока службы | 13.09.2015 | 30.09.2020 | Ларри Гастингс |
3,4 | ПКП 429 | окончание срока службы | 16.03.2014 | 18.03.2019 | Ларри Гастингс |
3,3 | ПКП 398 | окончание срока службы | 29.09.2012 | 29.09.2017 | Георг Брандл, Нед Дейли (3.3.7+) |
3.2 | ПКП 392 | окончание срока службы | 20.02.2011 | 20.02.2016 | Георг Брандл |
3. 1 | ПКП 375 | окончание срока службы | 27.06.2009 | 09.04.2012 | Бенджамин Петерсон |
3,0 | ПКП 361 | окончание срока службы | 03.12.2008 | 27.06.2009 | Барри Варшава |
2,7 | ПКП 373 | окончание срока службы | 03.07.2010 | 01.01.2020 | Бенджамин Петерсон |
2,6 | ПКП 361 | окончание срока службы | 01.10.2008 | 29.10.2013 | Барри Варшава |
Клавиша состояния
- Характеристики:
Приняты новые функции, исправления ошибок и исправления безопасности.
Предварительная версия- :
исправления функций, исправления ошибок и исправления безопасности принимаются для предстоящий выпуск функции.
- Исправление:
исправления ошибок и исправления безопасности приняты, новые двоичные файлы все еще вышел. (Также называется режим обслуживания или стабильная версия )
- безопасность:
принимаются только исправления безопасности и больше не выпускаются бинарные файлы, но могут быть выпущены новые версии только с исходным кодом
- окончание срока службы:
цикл выпуска заморожен; никакие дальнейшие изменения не могут быть внесены в него.
См. также страницу Цикл разработки для получения дополнительной информации о ветвях.
По умолчанию окончание срока службы запланировано через 5 лет после первого выпуска. но может быть скорректирован менеджером релизов каждой ветки.