Версии python: Версии Python и срок поддержки

Что нового появилось в 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.connect
def
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.

Параметризованные дженерики это типы, для которых указан внутренний тип, например dict[str, int]

Начиная с 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 / 5280  
    
return
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 были добавлены функции removeprefixremovesuffix, которые выполняют то, что от них ожидается: удаляют первые или последние несколько символов строки.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» оптимально по нескольким причинам:

  1. Мы хотим оставить нетронутойси стемную версию Python

  2. По возможности не возиться с Python PATH

  3. Мы можем удобно переключать активную версию 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 лет после первого выпуска. но может быть скорректирован менеджером релизов каждой ветки.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *