Python Documentation by Version
Some previous versions of the documentation remain available online. Use the list below to select a version to view.
For unreleased (in development) documentation, see In Development Versions.
- Python 3.12.3, documentation released on 9 April 2024.
- Python 3.12.2, documentation released on 6 February 2024.
- Python 3.12.1, documentation released on 8 December 2023.
- Python 3.12.0, documentation released on 2 October 2023.
- Python 3.11.9, documentation released on 2 April 2024.
- Python 3.11.8, documentation released on 6 February 2024.
- Python 3.11.7, documentation released on 4 December 2023.
- Python 3.11.6, documentation released on 2 October 2023.
- Python 3.11.5, documentation released on 24 August 2023.
- Python 3.11.4, documentation released on 6 June 2023.
- Python 3.11.3, documentation released on 5 April 2023.
- Python 3.11.2, documentation released on 8 February 2023.
- Python 3.11.1, documentation released on 6 December 2022.
- Python 3.11.0, documentation released on 24 October 2022.
- Python 3.10.14, documentation released on 19 March 2024.
- Python 3.10.13, documentation released on 24 August 2023.
- Python 3.10.12, documentation released on 6 June 2023.
- Python 3.10.11, documentation released on 5 April 2023.
- Python 3.10.10, documentation released on 8 February 2023.
- Python 3.10.9, documentation released on 6 December 2022.
- Python 3.10.8, documentation released on 8 October 2022.
- Python 3.10.7, documentation released on 6 September 2022.
- Python 3.10.6, documentation released on 8 August 2022.
- Python 3.10.5, documentation released on 6 June 2022.
- Python 3.10.4, documentation released on 24 March 2022.
- Python 3.10.3, documentation released on 16 March 2022.
- Python 3.10.2, documentation released on 14 January 2022.
- Python 3.10.1, documentation released on 6 December 2021.
- Python 3.10.0, documentation released on 4 October 2021.
- Python 3.9.19, documentation released on 19 March 2024.
- Python 3.9.18, documentation released on 24 August 2023.
- Python 3.9.17, documentation released on 6 June 2023.
- Python 3.9.16, documentation released on 6 December 2022.
- Python 3.9.15, documentation released on 11 October 2022.
- Python 3.9.14, documentation released on 6 September 2022.
- Python 3.9.13, documentation released on 17 May 2022.
- Python 3.9.12, documentation released on 24 March 2022.
- Python 3.9.11, documentation released on 16 March 2022.
- Python 3.9.10, documentation released on 14 January 2022.
- Python 3.9.9, documentation released on 15 November 2021.
- Python 3.9.8, documentation released on 05 November 2021.
- Python 3.9.7, documentation released on 30 August 2021.
- Python 3.9.6, documentation released on 28 June 2021.
- Python 3.9.5, documentation released on 3 May 2021.
- Python 3.9.4, documentation released on 4 April 2021.
- Python 3.9.3, documentation released on 2 April 2021.
- Python 3.9.2, documentation released on 19 February 2021.
- Python 3.9.1, documentation released on 8 December 2020.
- Python 3.9.0, documentation released on 5 October 2020.
- Python 3.8.19, documentation released on 19 March 2024.
- Python 3.8.18, documentation released on 24 August 2023.
- Python 3.8.17, documentation released on 6 June 2023.
- Python 3.8.16, documentation released on 6 December 2022.
- Python 3.8.15, documentation released on 11 October 2022.
- Python 3.8.14, documentation released on 6 September 2022.
- Python 3.8.13, documentation released on 16 March 2022.
- Python 3.8.12, documentation released on 30 August 2021.
- Python 3.8.11, documentation released on 28 June 2021.
- Python 3.8.10, documentation released on 3 May 2021.
- Python 3.8.9, documentation released on 2 April 2021.
- Python 3.8.8, documentation released on 19 February 2021.
- Python 3.8.7, documentation released on 21 December 2020.
- Python 3.8.6, documentation released on 23 September 2020.
- Python 3.8.5, documentation released on 20 July 2020.
- Python 3.8.4, documentation released on 13 July 2020.
- Python 3.8.3, documentation released on 13 May 2020.
- Python 3.8.2, documentation released on 24 February 2020.
- Python 3.8.1, documentation released on 18 December 2019.
- Python 3.8.0, documentation released on 14 October 2019.
- Python 3.7.17, documentation released on 6 June 2023.
- Python 3.7.16, documentation released on 6 December 2022.
- Python 3.7.15, documentation released on 11 October 2022.
- Python 3.7.14, documentation released on 6 September 2022.
- Python 3.7.13, documentation released on 16 March 2022.
- Python 3.7.12, documentation released on 4 September 2021.
- Python 3.7.11, documentation released on 28 June 2021.
- Python 3.7.10, documentation released on 15 February 2021.
- Python 3.7.9, documentation released on 17 August 2020.
- Python 3.7.8, documentation released on 27 June 2020.
- Python 3.7.7, documentation released on 10 March 2020.
- Python 3.7.6, documentation released on 18 December 2019.
- Python 3.7.5, documentation released on 15 October 2019.
- Python 3.7.4, documentation released on 08 July 2019.
- Python 3.7.3, documentation released on 25 March 2019.
- Python 3.7.2, documentation released on 24 December 2018.
- Python 3.7.1, documentation released on 20 October 2018.
- Python 3.7.0, documentation released on 27 June 2018.
- Python 3.6.15, documentation released on 4 September 2021.
- Python 3.6.14, documentation released on 28 June 2021.
- Python 3.6.13, documentation released on 15 February 2021.
- Python 3.6.12, documentation released on 17 August 2020.
- Python 3.6.11, documentation released on 27 June 2020.
- Python 3.6.10, documentation released on 18 December 2019.
- Python 3.6.9, documentation released on 02 July 2019.
- Python 3.6.8, documentation released on 24 December 2018.
- Python 3.6.7, documentation released on 20 October 2018.
- Python 3.6.6, documentation released on 27 June 2018.
- Python 3.6.5, documentation released on 28 March 2018.
- Python 3.6.4, documentation released on 19 December 2017.
- Python 3.6.3, documentation released on 03 October 2017.
- Python 3.6.2, documentation released on 17 July 2017.
- Python 3.6.1, documentation released on 21 March 2017.
- Python 3.6.0, documentation released on 23 December 2016.
- Python 3.5.10, documentation released on 5 September 2020.
- Python 3.5.8, documentation released on 1 November 2019.
- Python 3.5.7, documentation released on 18 March 2019.
- Python 3.5.6, documentation released on 8 August 2018.
- Python 3.5.5, documentation released on 4 February 2018.
- Python 3.5.4, documentation released on 25 July 2017.
- Python 3.5.3, documentation released on 17 January 2017.
- Python 3.5.2, documentation released on 27 June 2016.
- Python 3.5.1, documentation released on 07 December 2015.
- Python 3.5.0, documentation released on 13 September 2015.
- Python 3.4.10, documentation released on 18 March 2019.
- Python 3.4.9, documentation released on 8 August 2018.
- Python 3.4.8, documentation released on 4 February 2018.
- Python 3.4.7, documentation released on 25 July 2017.
- Python 3.4.6, documentation released on 17 January 2017.
- Python 3.4.5, documentation released on 26 June 2016.
- Python 3.4.4, documentation released on 06 December 2015.
- Python 3.4.3, documentation released on 25 February 2015.
- Python 3.4.2, documentation released on 4 October 2014.
- Python 3.4.1, documentation released on 18 May 2014.
- Python 3.4.0, documentation released on 16 March 2014.
- Python 3.3.7, documentation released on 19 September 2017.
- Python 3.3.6, documentation released on 12 October 2014.
- Python 3.3.5, documentation released on 9 March 2014.
- Python 3.3.4, documentation released on 9 February 2014.
- Python 3.3.3, documentation released on 17 November 2013.
- Python 3.3.2, documentation released on 15 May 2013.
- Python 3.3.1, documentation released on 7 April 2013.
- Python 3.3.0, documentation released on 29 September 2012.
- Python 3.2.6, documentation released on 11 October 2014.
- Python 3.2.5, documentation released on 15 May 2013.
- Python 3.2.4, documentation released on 7 April 2013.
- Python 3.2.3, documentation released on 10 April 2012.
- Python 3.2.2, documentation released on 4 September 2011.
- Python 3.2.1, documentation released on 10 July 2011.
- Python 3.2, documentation released on 20 February 2011.
- Python 3.1.5, documentation released on 9 April 2012.
- Python 3.1.4, documentation released on 11 June 2011.
- Python 3.1.3, documentation released on 27 November 2010.
- Python 3.1.2, documentation released on 21 March 2010.
- Python 3.1.1, documentation released on 17 August 2009.
- Python 3.1, documentation released on 27 June 2009.
- Python 3.0.1, documentation released on 13 February 2009.
- Python 3.0, documentation released on 3 December 2008.
- Python 2.7.18, documentation released on 20 April 2020
- Python 2.7.17, documentation released on 19 October 2019
- Python 2.7.16, documentation released on 02 March 2019
- Python 2.7.15, documentation released on 30 April 2018
- Python 2.7.14, documentation released on 16 September 2017
- Python 2.7.13, documentation released on 17 December 2016
- Python 2.7.12, documentation released on 26 June 2016.
- Python 2.7.11, documentation released on 5 December 2015.
- Python 2.7.10, documentation released on 23 May 2015.
- Python 2.7.9, documentation released on 10 December 2014.
- Python 2.7.8, documentation released on 1 July 2014.
- Python 2.7.7, documentation released on 31 May 2014.
- Python 2.7.6, documentation released on 10 November 2013.
- Python 2.7.5, documentation released on 15 May 2013.
- Python 2.7.4, documentation released on 6 April 2013.
- Python 2.7.3, documentation released on 9 April 2012.
- Python 2.7.2, documentation released on 11 June 2011.
- Python 2.7.1, documentation released on 27 November 2010.
- Python 2.7, documentation released on 4 July 2010.
- Python 2.6.9, documentation released on 29 October 2013.
- Python 2.6.8, documentation released on 10 April 2012.
- Python 2.6.7, documentation released on 3 June 2011.
- Python 2.6.6, documentation released on 24 August 2010.
- Python 2.6.5, documentation released on 19 March 2010.
- Python 2.6.4, documentation released on 25 October 2009.
- Python 2.6.3, documentation released on 2 October 2009.
- Python 2.6.2, documentation released on 14 April 2009.
- Python 2.6.1, documentation released on 4 December 2008.
- Python 2.6, documentation released on 1 October 2008.
- Python 2.5.4, documentation released on 23 December 2008.
- Python 2.5.3, documentation released on 19 December 2008.
- Python 2.5.2, documentation released on 21 February 2008.
- Python 2.5.1, documentation released on 18 April 2007.
- Python 2.5, documentation released on 19 September 2006.
- Python 2.4.4, documentation released on 18 October 2006.
- Python 2.4.3, documentation released on 29 March 2006.
- Python 2.4.2, documentation released on 28 September 2005.
- Python 2.4.1, documentation released on 30 March 2005.
- Python 2.4, documentation released on 30 November 2004.
- Python 2.3.5, documentation released on 8 February 2005.
- Python 2.3.4, documentation released on 27 May 2004.
- Python 2.3.3, documentation released on 19 December 2003.
- Python 2.3.2, documentation released on 3 October 2003.
- Python 2.3.1, documentation released on 23 September 2003.
- Python 2.3, documentation released on 29 July 2003.
- Python 2.2.3, documentation released on 30 May 2003.
- Python 2.2.2, documentation released on 14 October 2002.
- Python 2.2.1, documentation released on 10 April 2002.
- Python 2.2p1, documentation released on 29 March 2002.
- Python 2.2, documentation released on 21 December 2001.
- Python 2.1.3, documentation released on 8 April 2002.
- Python 2.1.2, documentation released on 16 January 2002.
- Python 2.1.1, documentation released on 20 July 2001.
- Python 2.1, documentation released on 15 April 2001.
- Python 2.0.1, documentation released on 22 June 2001.
- Python 2.0, documentation released on 16 October 2000.
- Python 1.6, documentation released on 5 September 2000.
- Python 1.5.2p2, documentation released on 22 March 2000.
- Python 1.5.2p1, documentation released on 6 July 1999.
- Python 1.5.2, documentation released on 30 April 1999.
- Python 1.5.1p1, documentation released on 6 August 1998.
- Python 1.5.1, documentation released on 14 April 1998.
- Python 1.5, documentation released on 17 February 1998.
- Python 1.4, documentation released on 25 October 1996.
In Development Versions
The latest, and unreleased, documentation for versions of Python still under development:
- https://docs.python.org/dev/
- https://docs.python.org/3/
The PSF
The Python Software Foundation is the organization behind Python. Become a member of the PSF and help advance the software and our mission.
- About
- Applications
- Quotes
- Getting Started
- Help
- Python Brochure
- All releases
- Source code
- Windows
- macOS
- Other Platforms
- License
- Alternative Implementations
- Docs
- Audio/Visual Talks
- Beginner’s Guide
- Developer’s Guide
- FAQ
- Non-English Docs
- PEP Index
- Python Books
- Python Essays
- Diversity
- Mailing Lists
- IRC
- Forums
- PSF Annual Impact Report
- Python Conferences
- Special Interest Groups
- Python Logo
- Python Wiki
- Code of Conduct
- Community Awards
- Get Involved
- Shared Stories
- Arts
- Business
- Education
- Engineering
- Government
- Scientific
- Software Development
- Python News
- PSF Newsletter
- PSF News
- PyCon US News
- News from the Community
- Python Events
- User Group Events
- Python Events Archive
- User Group Events Archive
- Submit an Event
- Developer’s Guide
- Issue Tracker
- python-dev list
- Core Mentorship
- Report a Security Issue
- Help & General Contact
- Diversity Initiatives
- Submit Website Bug
- Status
Краткая история Python
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 можно посмотреть на рисунке:
What’s new in Python 3.9?
Релиз Python 3.9 произошел 2020-10-05. Рассмотрим что есть нового в этой версии.
Работа со словарями
Допустим, есть два словаря, которые мы зотим объединить.
В версиях до 3.9 можно было бы сделать таким образом:
pycon = europython =
Синтаксис ** разворачивает словарь, и когда они объединяются, более позднее значение затирается более новым. Аналогичные дейтсвия можно совершить, если использовать следующий синтаксис:
merged_dict = pycon.copy() for key, value in europython.items(): merged_dict[key] = value merged_dict
Или таким образом:
pycon.update(europython) pycon
Этот способ пойдойдет в случае если нужно изменить первоначальный словарь.
merged_dict = pycon.copy().update(europython)
Однако если нужно сохранить эти данные в новом словаре, этим способом воспользоваться нельзя, в последнем примере
merged_dict is None
True
В библиотеке collections есть объект ChainMap, который тоже обхединяет словари, но его результатом будет объект ChainMap, а не словарь. Он состоит из нескольких словарей, следующих друг за другом. Если взять значение по ключу, то вернется то значение, которое встречается раньше. То есть, в этом примере для ключа 2019, вернется значение Cleveland
from collections import ChainMap merged_dict = ChainMap(pycon, europython) merged_dict
ChainMap(, )
В Python 3.8 был представлен walrus-оператор. С его помощью можно решить проблему примера с update и скопировать словарь в новую переменную:In [11]:
(merged_dict := pycon.copy()).update(europython) merged_dict
В Python 3.9 в PEP-0614 добавлен синтаксис | (читается как pipe), который объединяет словари аналогично первому примеру:
pycon | europython
При этом первоначальный словарь не меняется:
pycon
Если все-таки нужно обновить первоначальный словарь, можно воспользоваться синтаксисом |= (работает по аналогии с +=): a |= b a = a|bIn [16]:
pycon |= europython pycon
Важно помнить, что поскольку более поздние значения перезаписывают более ранние значения, эта операция может быть не коммуникативна.
print(europython | pycon) print(pycon | europython)
Синтаксис | работает только непосредственно со словарями, тогда как синтаксис ** работает и с 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 стало возможно создавать декораторы из любых объектов, например из элементов списков и словарей. Можно рассмотреть синтаксис, который реализует тот же самый пример:
@buttons[0].clicked.connect def say_hello(): message.setText("Hello, World!") @buttons[1].clicked.connect def say_goodbye(): message.setText("Goodbye, World!")
Похожим образом будет выглядеть синтаксис для значений словаря:
buttons = @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 :
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 выглядел таким образом:
def speed(distance: "feet", time: "seconds") -> "miles per hour": fps2mph = 3600 / 5280 return distance / time * fps2mph
В Python 3.9 появился новый объект типа Annotated, который принимает на вход два аргумента, первый это реальный тип, которым должен обладать аннотриуемый объект, а второй это название для целей документации:
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
Когда происходит проверка аннотаций, проверяется только первый аргумент, в котором находится «реальный» тип объекта, а второй использовуется как и в предыдущих версиях:
speed.__annotations__
Изменения связанные с часовыми поясами
В предыдущих версиях Python, модуль datetime не содержал информации о часовых поясах, и рекомендованным способом работы с ними была библиотека python-dateutil .
Однако начиная с Python 3.9 появился модуль zoneinfo, который содержит информацию о часовых поясах и позволяет создавать объекты им соответствующие:
from datetime import datetime, timezone from zoneinfo import ZoneInfo local_tz = ZoneInfo('Europe/Amsterdam') datetime.now(tz=timezone.utc), datetime.now()
(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)
(datetime.datetime(2021, 5, 4, 17, 58, 37, 765947, tzinfo=zoneinfo.ZoneInfo(key='Europe/Amsterdam')),)
Всего часовых поясов больше чем можно было бы предположить, и многие из них представлены в модуле `zoneinfo`
import zoneinfo tzs = zoneinfo.available_timezones() len(tzs)
Новые методы работы со строкам
Иногда нужно убрать первые или последние несколько символов из строки. Есть метод strip , который обладает казалось бы похожим функционалом, но он может иногда давать неожиданные результаты Например в таком случае:
"ababbbbbbaaccc".lstrip("ab")
В Python 3.9 были добавлены функции removeprefix , removesuffix , которые выполняют то, что от них ожидается: удаляют первые или последние несколько символов строки.In [35]:
"ababbbbbbaaccc".removeprefix("ab")
'abbbbbbaaccc'
"ababbbbbbaaccc".removesuffix("c")
'ababbbbbbaacc'
Если строка не содержит суффикс или префикс, строка не меняется, никаких исключений не появляется.
"ababbbbbbaaccc".removesuffix("something else")
'ababbbbbbaaccc'
Python 3.10
Последняя версия 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()): . with ( CtxManager1() as example1, CtxManager2() as example2 ): .
Более информативные сообщения об ошибках
Наверняка многие из читателей сталкивались с тем, что сообщение об ошибке слишком общее и само по себе не говорит о том, что нужно сделать чтобы ошибку исправить. В новой версиеи Python core-разработчики улучшили самые распространенные из них и теперь сообщения об ошибках будут намного более читабельными:In [ ]:
expected = SyntaxError: '
>>> if rocket.position > event_horizon File "", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
>>> for x,y in range(100)> File "", line 1 for x,y in range(100)> ^ SyntaxError: did you forget parentheses around the comprehension target?
if rocket.position = event_horizon: File "", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead
def foo(): . if lel: . x = 2 File "", line 3 x = 2 ^ 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¶
У серії есе «Що нового в Python» розповідається про найважливіші зміни між основними версіями Python. Вони є обов’язковими до прочитання для всіх, хто бажає бути в курсі подій після нового випуску.
- What’s New In Python 3.12
- Summary – Release highlights
- New Features
- New Features Related to Type Hints
- Other Language Changes
- New Modules
- Improved Modules
- Optimizations
- CPython bytecode changes
- Demos and Tools
- Deprecated
- Removed
- Porting to Python 3.12
- Build Changes
- C API Changes
- Notable changes in 3.12.4
- Підсумок – основні моменти випуску
- Нові можливості
- Нові функції, пов’язані з підказками типу
- Інші зміни мови
- Інші зміни в реалізації CPython
- Нові модулі
- Покращені модулі
- Оптимізації
- Faster CPython
- Зміни байт-коду CPython
- Застаріле
- Pending Removal in Python 3.12
- Видалено
- Porting to Python 3.11
- Зміни збірки
- Зміни C API
- Notable changes in 3.11.4
- Notable changes in 3.11.5
- Підсумок – основні моменти випуску
- Нові можливості
- Нові функції, пов’язані з підказками типу
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Оптимізації
- Застаріле
- Видалено
- Перенесення на Python 3.10
- Зміни байт-коду CPython
- Зміни збірки
- Зміни C API
- Notable security feature in 3.10.7
- Notable security feature in 3.10.8
- Notable changes in 3.10.12
- Підсумок – основні моменти випуску
- Вам слід перевірити DeprecationWarning у вашому коді
- Нові можливості
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Оптимізації
- Застаріле
- Видалено
- Перенесення на Python 3.9
- Зміни збірки
- Зміни C API
- Помітні зміни в Python 3.9.1
- Помітні зміни в Python 3.9.2
- Notable changes in Python 3.9.3
- Notable changes in Python 3.9.5
- Notable security feature in 3.9.14
- Notable changes in 3.9.17
- Підсумок – основні моменти випуску
- Нові можливості
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Оптимізації
- Зміни збірки та C API
- Застаріле
- Видалення API та функцій
- Перенесення на Python 3.8
- Помітні зміни в Python 3.8.1
- Notable changes in Python 3.8.2
- Notable changes in Python 3.8.3
- Помітні зміни в Python 3.8.8
- Notable changes in Python 3.8.9
- Notable changes in Python 3.8.10
- Notable changes in Python 3.8.10
- Помітні зміни в Python 3.8.12
- Notable security feature in 3.8.14
- Notable changes in 3.8.17
- Підсумок – Основні моменти випуску
- Нові можливості
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Зміни C API
- Зміни збірки
- Оптимізації
- Інші зміни в реалізації CPython
- Застаріла поведінка Python
- Застарілі модулі, функції та методи Python
- Застарілі функції та типи C API
- Видалення підтримки платформи
- Видалення API та функцій
- Видалення модулів
- Зміни лише для Windows
- Перенесення на Python 3.7
- Помітні зміни в Python 3.7.1
- Помітні зміни в Python 3.7.2
- Помітні зміни в Python 3.7.6
- Помітні зміни в Python 3.7.10
- Notable changes in Python 3.7.11
- Notable security feature in 3.7.14
- Підсумок – основні моменти випуску
- Нові можливості
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Оптимізації
- Зміни збірки та C API
- Інші вдосконалення
- Застаріле
- Видалено
- Перенесення на Python 3.6
- Помітні зміни в Python 3.6.2
- Помітні зміни в Python 3.6.4
- Помітні зміни в Python 3.6.5
- Помітні зміни в Python 3.6.7
- Помітні зміни в Python 3.6.10
- Помітні зміни в Python 3.6.13
- Notable changes in Python 3.6.14
- Підсумок – основні моменти випуску
- Нові можливості
- Інші зміни мови
- Нові модулі
- Покращені модулі
- Інші зміни на рівні модуля
- Оптимізації
- Зміни збірки та C API
- Застаріле
- Видалено
- Перенесення на Python 3.5
- Помітні зміни в Python 3.5.4
- Підсумок – Основні моменти випуску
- Нові можливості
- Нові модулі
- Покращені модулі
- Зміни реалізації CPython
- Застаріле
- Видалено
- Перенесення на Python 3.4
- Змінено в 3.4.3
- Підсумок – основні моменти випуску
- PEP 405: Віртуальні середовища
- PEP 420: неявні пакети простору імен
- PEP 3118: Нова реалізація memoryview і документація протоколу буфера
- PEP 393: Гнучке представлення рядків
- PEP 397: програма запуску Python для Windows
- PEP 3151: переробка ієрархії винятків ОС та вводу-виводу
- PEP 380: Синтаксис для делегування субгенератору
- PEP 409: Придушення контексту винятку
- PEP 414: Явні літерали Unicode
- PEP 3155: Уточнена назва для класів і функцій
- PEP 412: словник спільного використання ключів
- PEP 362: Об’єкт підпису функції
- PEP 421: додавання sys.implementation
- Використання importlib як реалізації імпорту
- Інші зміни мови
- Точне блокування імпорту
- Вбудовані функції та типи
- Нові модулі
- Покращені модулі
- Оптимізації
- Зміни збірки та C API
- Застаріле
- Перенесення на Python 3.3
- PEP 384: Визначення стабільного ABI
- PEP 389: Модуль аналізу командного рядка Argparse
- PEP 391: Конфігурація на основі словника для журналювання
- PEP 3148: модуль concurrent.futures
- PEP 3147: Каталоги сховищ PYC
- PEP 3149: файли .so з тегами версії ABI
- PEP 3333: Інтерфейс шлюзу веб-сервера Python v1.0.1
- Інші зміни мови
- Нові, покращені та застарілі модулі
- Багатопотоковість
- Оптимізації
- Unicode
- Кодеки
- Документація
- ПРОСТОЮЧИЙ
- Репозиторій коду
- Зміни збірки та C API
- Перенесення на Python 3.2
- PEP 372: Упорядковані словники
- PEP 378: Специфікатор формату для розділювача тисяч
- Інші зміни мови
- Нові, покращені та застарілі модулі
- Оптимізації
- ПРОСТОЮЧИЙ
- Зміни збірки та C API
- Перенесення на Python 3.1
- Поширені камені спотикання
- Огляд змін синтаксису
- Зміни вже присутні в Python 2.6
- Зміни бібліотеки
- PEP 3101: Новий підхід до форматування рядків
- Зміни винятків
- Інші інші зміни
- Зміни збірки та C API
- Продуктивність
- Перенесення на Python 3.0
- Майбутнє для Python 2.x
- Зміни в обробці попереджень про припинення підтримки
- Функції Python 3.1
- PEP 372: Додавання впорядкованого словника до колекцій
- PEP 378: Специфікатор формату для розділювача тисяч
- PEP 389: Модуль argparse для розбору командних рядків
- PEP 391: Конфігурація на основі словника для журналювання
- PEP 3106: Перегляди словника
- PEP 3137: об’єкт memoryview
- Інші зміни мови
- Нові та вдосконалені модулі
- Зміни збірки та C API
- Інші зміни та виправлення
- Перенесення на Python 2.7
- Нові функції, додані до випусків обслуговування Python 2.7
- Подяки
- Python 3.0
- Зміни в процесі розробки
- PEP 343: оператор «з».
- PEP 366: Явний відносний імпорт із основного модуля
- PEP 370: каталог site-packages для кожного користувача
- PEP 371: Пакет multiprocessing
- PEP 3101: Розширене форматування рядків
- PEP 3105: друк як функція
- PEP 3110: Зміни обробки винятків
- PEP 3112: Байтові літерали
- PEP 3116: Нова бібліотека введення-виведення
- PEP 3118: Переглянутий буферний протокол
- PEP 3119: Абстрактні базові класи
- PEP 3127: Підтримка цілочисельного літералу та синтаксис
- PEP 3129: Декоратори класу
- PEP 3141: Ієрархія типів чисел
- Інші зміни мови
- Нові та вдосконалені модулі
- Скасування та видалення
- Зміни збірки та C API
- Перенесення на Python 2.6
- Подяки
- PEP 308: Умовні вирази
- PEP 309: Застосування часткової функції
- PEP 314: Метадані для програмних пакетів Python v1.1
- PEP 328: Абсолютний і відносний імпорт
- PEP 338: Виконання модулів як сценаріїв
- PEP 341: Уніфікована спроба/окрім/нарешті
- PEP 342: Нові функції генератора
- PEP 343: оператор «з».
- PEP 352: Винятки як класи нового стилю
- PEP 353: використання ssize_t як типу індексу
- PEP 357: метод „__index__“
- Інші зміни мови
- Нові, покращені та видалені модулі
- Зміни збірки та C API
- Перенесення на Python 2.5
- Подяки
- PEP 218: Вбудовані об’єкти
- PEP 237: Об’єднання довгих і цілих чисел
- PEP 289: Генератор виразів
- PEP 292: Простіші заміни рядків
- PEP 318: Декоратори для функцій і методів
- PEP 322: Зворотна ітерація
- PEP 324: Новий модуль підпроцесу
- PEP 327: десятковий тип даних
- PEP 328: Багаторядковий імпорт
- PEP 331: Незалежне від мови перетворення Float/String
- Інші зміни мови
- Нові, покращені та застарілі модулі
- Зміни збірки та C API
- Перенесення на Python 2.4
- Подяки
- PEP 218: Тип даних стандартного набору
- PEP 255: Прості генератори
- PEP 263: Кодування вихідного коду
- PEP 273: Імпортування модулів із ZIP-архівів
- PEP 277: Підтримка імен файлів Unicode для Windows NT
- PEP 278: універсальна підтримка нового рядка
- PEP 279: enumerate()
- PEP 282: пакет журналів
- PEP 285: логічний тип
- PEP 293: Зворотні виклики обробки помилок кодека
- PEP 301: Індекс пакетів і метадані для Distutils
- PEP 302: нові імпортні гачки
- PEP 305: Файли, розділені комами
- PEP 307: Поліпшення соління
- Розширені зрізи
- Інші зміни мови
- Нові, покращені та застарілі модулі
- Pymalloc: спеціалізований розподільник об’єктів
- Зміни збірки та C API
- Інші зміни та виправлення
- Перенесення на Python 2.3
- Подяки
- вступ
- PEP 252 і 253: Зміни типу та класу
- PEP 234: Ітератори
- PEP 255: Прості генератори
- PEP 237: Об’єднання довгих і цілих чисел
- PEP 238: Зміна оператора поділу
- Зміни Unicode
- PEP 227: Вкладені області
- Нові та вдосконалені модулі
- Зміни та виправлення перекладача
- Інші зміни та виправлення
- Подяки
- вступ
- PEP 227: Вкладені області
- PEP 236: директиви __future__
- PEP 207: багаті порівняння
- PEP 230: Попередження
- PEP 229: Нова система побудови
- PEP 205: Слабкі посилання
- PEP 232: Атрибути функцій
- PEP 235: Імпорт модулів на платформах без урахування регістру
- PEP 217: інтерактивний дисплей
- PEP 208: Нова модель примусу
- PEP 241: Метадані в пакетах Python
- Нові та вдосконалені модулі
- Інші зміни та виправлення
- Подяки
- вступ
- Що щодо Python 1.6?
- Новий процес розвитку
- Unicode
- Розуміння списку
- Доповнене завдання
- Рядкові методи
- Збирання сміття циклів
- Інші основні зміни
- Перенесення на 2.0
- Розширення/вбудовування змін
- Distutils: полегшення встановлення модулів
- Модулі XML
- Зміни модуля
- Нові модулі
- Покращення IDLE
- Видалені та застарілі модулі
- Подяки
The «Changelog» is an HTML version of the file built from the contents of the Misc/NEWS.d directory tree, which contains all nontrivial changes to Python for the current version.
- Журнал змін
- Python next
- Python 3.12.3 final
- Python 3.12.2 final
- Python 3.12.1 final
- Python 3.12.0 final
- Python 3.12.0 release candidate 3
- Python 3.12.0 release candidate 2
- Python 3.12.0 release candidate 1
- Python 3.12.0 beta 4
- Python 3.12.0 beta 3
- Python 3.12.0 beta 2
- Python 3.12.0 beta 1
- Python 3.12.0 alpha 7
- Python 3.12.0 alpha 6
- Python 3.12.0 alpha 5
- Python 3.12.0 alpha 4
- Python 3.12.0 alpha 3
- Python 3.12.0 alpha 2
- Python 3.12.0 alpha 1
- Python 3.11.0 beta 1
- Python 3.11.0 alpha 7
- Python 3.11.0 alpha 6
- Python 3.11.0 alpha 5
- Python 3.11.0 alpha 4
- Python 3.11.0 alpha 3
- Python 3.11.0 alpha 2
- Python 3.11.0 alpha 1
- Python 3.10.0 beta 1
- Python 3.10.0 alpha 7
- Python 3.10.0 alpha 6
- Python 3.10.0 alpha 5
- Python 3.10.0 alpha 4
- Python 3.10.0 alpha 3
- Python 3.10.0 alpha 2
- Python 3.10.0 alpha 1
- Python 3.9.0 beta 1
- Python 3.9.0 alpha 6
- Python 3.9.0 alpha 5
- Python 3.9.0 alpha 4
- Python 3.9.0 alpha 3
- Python 3.9.0 alpha 2
- Python 3.9.0 alpha 1
- Python 3.8.0 beta 1
- Python 3.8.0 alpha 4
- Python 3.8.0 alpha 3
- Python 3.8.0 alpha 2
- Python 3.8.0 alpha 1
- Python 3.7.0 final
- Python 3.7.0 release candidate 1
- Python 3.7.0 beta 5
- Python 3.7.0 beta 4
- Python 3.7.0 beta 3
- Python 3.7.0 beta 2
- Python 3.7.0 beta 1
- Python 3.7.0 alpha 4
- Python 3.7.0 alpha 3
- Python 3.7.0 alpha 2
- Python 3.7.0 alpha 1
- Python 3.6.6 final
- Python 3.6.6 release candidate 1
- Python 3.6.5 final
- Python 3.6.5 release candidate 1
- Python 3.6.4 final
- Python 3.6.4 release candidate 1
- Python 3.6.3 final
- Python 3.6.3 release candidate 1
- Python 3.6.2 final
- Python 3.6.2 release candidate 2
- Python 3.6.2 release candidate 1
- Python 3.6.1 final
- Python 3.6.1 release candidate 1
- Python 3.6.0 final
- Python 3.6.0 release candidate 2
- Python 3.6.0 release candidate 1
- Python 3.6.0 beta 4
- Python 3.6.0 beta 3
- Python 3.6.0 beta 2
- Python 3.6.0 beta 1
- Python 3.6.0 alpha 4
- Python 3.6.0 alpha 3
- Python 3.6.0 alpha 2
- Python 3.6.0 alpha 1
- Python 3.5.5 final
- Python 3.5.5 release candidate 1
- Python 3.5.4 final
- Python 3.5.4 release candidate 1
- Python 3.5.3 final
- Python 3.5.3 release candidate 1
- Python 3.5.2 final
- Python 3.5.2 release candidate 1
- Python 3.5.1 final
- Python 3.5.1 release candidate 1
- Python 3.5.0 final
- Python 3.5.0 release candidate 4
- Python 3.5.0 release candidate 3
- Python 3.5.0 release candidate 2
- Python 3.5.0 release candidate 1
- Python 3.5.0 beta 4
- Python 3.5.0 beta 3
- Python 3.5.0 beta 2
- Python 3.5.0 beta 1
- Python 3.5.0 alpha 4
- Python 3.5.0 alpha 3
- Python 3.5.0 alpha 2
- Python 3.5.0 alpha 1
Год ожиданий — и мы получили Python 3.12. Изменения, новшества и дополнения
Новую версию Python многие разработчики ожидали с нетерпением. Кто-то и не ждал, поскольку вполне достаточно было возможностей прежней версии. Но Python 3.12 таки выпустили, сейчас стало известно, что эту ветку будут поддерживать полтора года, а потом для нее станут формировать исправления для устранения уязвимостей — в течение еще трех с половиной лет.
Кроме того, запущен процесс альфа-тестирования Python 3.13, где заявлен режим сборки CPython без глобальной блокировки интерпретатора (GIL, Global Interpreter Lock). Тестировать ветку будут в течение семи месяцев, исправляя ошибки и добавляя новые возможности. Затем еще три месяца — тестирование бета-версий и еще через два месяца появится пред-финальная версия. Но будет потом, а сейчас поговорим о том, что уже есть в руках — о Python 3.12.
Так что мы получили?
Понятно, что в течение года никто не сидел сложа руки — в новой версии появилось много нового и интересного. Вот список наиболее заметных изменений:
- Улучшена эффективность использования ресурсов многоядерных систем за счет добавления поддержки изолированных субинтерпретаторов и отдельных глобальных блокировок (GIL, Global Interpreter Lock) для разных интерпретаторов внутри процесса (CPython позволяет в одном процессе выполнять запуск сразу несколько интерпретаторов). Правда, сейчас эта новинка доступна посредством C-API, а поддержка Python API будет добавлена в следующей ветке.
- Также добавлена поддержка подсистемы ядра Linux perf в интерпретаторе. Она дает возможность определять имена Python-функций при профилировании при помощи утилиты perf (ранее в трассировках определялись только имена Си-функций).
- Еще одно важное изменение — повышение информативности сообщений об ошибках. Кроме того, теперь спектр исключений с рекомендациями по устранению опечаток расширен. Вот пример:
sys.version_info NameError: name 'sys' is not defined. Did you forget to import 'sys'? something = blech NameError: name 'blech' is not defined. Did you mean: 'self.blech'? import a.y.z from b.y.z SyntaxError: Did you mean to use 'from . import . ' instead? from collections import chainmap ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
- Также продолжается активная работа по оптимизации производительности. Она понемногу движется и есть первые результаты — согласно анонсу производительность стала на 5% выше. Не бог весть что, но тоже неплохо. Повышения удалось добиться благодаря:
- Добавлении поддержки бинарного оптимизатора BOLT, который и повышает производительность на 1-5%.
- Добавлено inline-развёртывание списковых включений (comprehensions). Это нововведение дало возможность ускорить работу со списковыми включениями.
- Размер Unicode-объектов снизили на 8-16 байт.
- Увеличена скорсть операций с регулярными выражениями re.sub(), re.subn() и re.Pattern.
- Ускорено выполнение проверок isinstance() для некоторых протоколов — от 2 до 20 раз.
- Также ускорены функции tokenize.tokenize() и tokenize.generate_tokens().
- Предложен более компактный синтаксис аннотирования типов для обобщенных классов и функций. Вот пример:
def max[T](args: Iterable[T]) -> T: . class list[T]: def __getitem__(self, index: int, /) -> T: . def append(self, element: T) -> None:
- Появился новый способ определения псевдонимов типов при помощи выражения type. Еще пример:
type Point = tuple[float, float] type Point[T] = tuple[T, T]
- Также в модуле typing добавлен новый декоратор override. Он информирует системы проверки типов о том, что метод в подклассе предназначен для переопределения метода или атрибута в суперклассе. И еще один пример:
class Base: def log_status(self) -> None: . class Sub(Base): @override def log_status(self) -> None: # Ok, переопределяет Base.log_status . @override def done(self) -> None: # Система проверки типов выявит ошибку …
- В новой версии увеличена гибкость разбора f-строк (форматируемые литералы с префиксом 'f'), что открыло новые возможности, включая возможность указаний любых допустимых для Python выражений, включая многострочные выражения, комментарии, обратные слэши и escape-последовательности для Unicode. Во внутренней строке можно повторно использовать двойные кавычки, не применяя одинарные. А еще увеличена информативность сообщений в f-строках, в которых теперь указывается точное место в строке, вызвавшее ошибку. Вот пример:
print(f"This is the playlist: ") print(f"This is the playlist: <"\N
".join(songs)>") print(f"This is the playlist: ") - Улучшена и безопасность. Так, встроенные реализации алгоритмов SHA1, SHA3, SHA2-384, SHA2-512 и MD5 в hashlib заменены на формально верифицированные варианты от проекта HACL* (встроенные реализации применяются только если отсутствует OpenSSL).
- Добавлена защита от переполнения стека в Cpython.
- В модуле pathlib.Path реализована поддержка подклассов, а в модуле os теперь расширена поддержка Windows. В частности, для этой ОС добавлена поддержка методов os.listdrives(), os.listvolumes() и os.listmounts(), а также повышена точность os.stat() и os.lstat().
- Кроме того, в модули sqlite3 и uuid добавлены интерфейсы командной строки («python -m sqlite3» и «python -m uuid»).
- Кроме новых возможностей разработчики решили почистить некоторые старые, которые уже не нужны. В частности, убраны модули asynchat, asyncore, smtpd, imp и distutils (модуль distutils можно использовать из пакета setuptools). Убраны устаревшие методы в unittest. Избавились и от устаревших и некорректно работающих функций, классов и методов. В первую очередь, это locale.format(), io.OpenWrapper, ssl.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile.
- Удалена поддержка таких браузеров, как Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird, и Firefox до версии 36.
Другие полезные материалы
- Что такое MLOps? Теоретический аспект
- MLOps как информационная система
- Платформы обработки данных: какие бывают и всем ли нужны
- python
- питон
- языки программирования