- PVSM.RU - https://www.pvsm.ru -

Выходит первый Python 3.11. Что нового?

Выходит первый Python 3.11. Что нового? - 1

Делимся переводом документации альфы Python 3.11, которая выходит 4 октября, о разнице в сравнении с версией 3.10. Изменения касаются трассировки исключений, модулей math, sqlite, threading, unittest и других. Удалена ощутимая часть устаревшей функциональности.

Подробности читайте под катом, пока у нас начинается курс по Fullstack-разработке на Python [1].


Полный список [2] изменений.

Пользователи предварительной версии должны знать, что этот документ в настоящее время находится в черновом варианте. Он будет существенно обновляться по мере продвижения Python 3.11 к релизу, поэтому стоит вернуться к нему даже после ознакомления с предыдущими версиями.

Краткое изложение – основные моменты выпуска

Новые возможности

Ошибки в трассировке теперь указываются точнее

При печати трассировки интерпретатор теперь точно указывает на выражение, которое привело к ошибке, а не на строку:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

Предыдущие версии интерпретатора указывали только на строку, не разъясняя, какой объект оказался None. Эти расширенные ошибки также могут быть полезны при работе с глубоко вложенными объектами словаря и множественными вызовами функций,

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

а также сложными арифметическими выражениями:

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

Подробности в PEP 657 [3], это вклад Пабло Галиндо, Батухана Таскайи и Аммара Аскара в bpo-43950 [4].

Эта возможность требует хранения позиций столбцов в объектах кода, что может привести к небольшому увеличению использования дискового пространства скомпилированными файлами Python или использования памяти интерпретатора.

Чтобы избежать хранения дополнительной информации и/или отключить печать дополнительной информации об отладке, можно использовать флаг запуска из командной строки -X [5] no_debug_ranges или переменную окружения PYTHONNODEBUGRANGES [6].

Информация о столбцах для объектов кода.

Информация, используемая расширенной функцией трассировки, доступна в виде общего API, который можно задействовать для сопоставления инструкций байт-кода и исходного кода. Эту информацию можно получить с помощью:

Опция -X [5] no_debug_ranges и переменная среды PYTHONNODEBUGRANGES могут использоваться для отключения этой функции. Подробности — в PEP 657 [3], это вклад Пабло Галиндо, Батухана Таскайи и Аммара Аскара в bpo-43950 [4].

Другие изменения в языке

Другие изменения реализации CPython

  • Специальные методы complex.__complex__() и bytes.__bytes__() реализованы для поддержки протоколов typing.SupportsComplex [20] и typing.SupportsBytes [21] (вклад Марка Дикинсона и Дон-Хи На в bpo-24234 [22]).

Новые модули

  • Их ещё нет.

Улучшенные модули

fractions

Поддержка инициализации дроби из строки в стиле PEP 515 (вклад Сергея Б. Кирпичёва в bpo-44258 [23]).

math

  • Добавлена функция math.cbrt() [24], она возвращает кубический корень из x. (Вклад Аджита Рамачандрана в bpo-44357 [25].

  • Поведение двух крайних случаев math.pow() [26] было изменено для обеспечения согласованности со спецификацией IEEE 754. Операции math.pow(0.0, -math.inf) и math.pow(-0.0, -math.inf) теперь возвращают inf. Ранее они поднимали ValueError [27] (вклад Марка Дикинсона в bpo-44339 [28]).

operator

  • Добавлена функция operator.call, такая, что operator.call(obj, *args, **kwargs) == obj(*args, **kwargs) (вклад Энтони Ли в bpo-44019 [29]).

os

  • На Windows os.urandom() [30] в Python 3.11 использует BcryptGenRandom().

sqlite3

  • Теперь вы можете отключить авторизер (authorizer), передав параметр None в set_authorizer() (предоставлено Эрлендом Аасландом в bpo-44491 [31]).

  • Имя параметра сортировки create_collation() [32] теперь может содержать любой символ Юникода. Имена параметров сортировки с недопустимыми символами теперь вызывают UnicodeEncodeError [33] вместо sqlite3.ProgrammingError [34] (вклад Эрленда Аасланда в bpo-44688 [35]).

  • Исключения sqlite3 [36] сейчас содержат код ошибки SQLite как sqlite_errorcode [37] и название ошибки как sqlite_errorcode [38] (вклад Авива Паливоды, Даниэля Шахафа и Эрленда Аасланда в bpo-16379 [39]).

threading

  • В Unix, если функция sem_clockwait() доступна в библиотеке C (glibc 2.30 и выше), то threading.Lock.acquire() [40] использует монотонные часы (time.CLOCK_MONOTONIС [41]) для тайм-аута, а не системные часы (time.CLOCK_REALTIME [42]), чтобы не зависеть от изменений последних. (Вклад Виктора Стиннера и Ливиуса в bpo-41710 [43]).

time

  • В Unix, time.sleep() [44] теперь использует clock_nanosleep() или nanosleep(), если таковая имеется, она имеет разрешение в 1 наносекунду (10 секунды), а не с помощью select() с разрешением 1 мкс (106 секунды). (Вклад Виктора Стиннера и Ливиуса в  bpo-21302 [45]).

  • В Windows time.sleep() [44] теперь использует ожидающий таймер, который имеет разрешение 100 наносекунд (10-7 секунды). Ранее его разрешение составляло 1 миллисекунду (10-3 секунды) (вклад Ливиуса и Виктора Стиннера в bpo-21302 [45]).

unicodedata

  • База данных Unicode обновлена до версии 14.0.0 (bpo-45190 [46]).

Оптимизации

  • Компилятор теперь оптимизирует простое форматирование в стиле C с литеральным форматом, содержащим только коды формата %s, %r и %a, и делает его таким же быстрым, как соответствующее выражение f-строки. (Предоставлено Сергеем Сторчака в bpo-28307 [47]).

  • Реализованы исключения «с нулевыми накладными расходами». Затраты на операторы try практически исключены, когда исключение не возникает (вклад Марка Шеннона в bpo-40222 [48]).

  • Вызовы методов с ключевыми словами теперь выполняются быстрее благодаря изменениям в байт-коде, которые позволяют избежать создания связанных экземпляров методов. Ранее эта оптимизация применялась только к вызовам методов с чисто позиционными аргументами (вклад Кена Джина и Марка Шеннона в bpo-26110 [49], основанный на идеях, реализованных в PyPy).

  • Чистые ASCII-строки теперь нормализуются за константное время с помощью unicodedata.normalize() [50] (внесено Дон-Хи На в bpo-44987 [51]).

Изменения в байт-коде CPython

  • Добавлен новый опкод CALL_METHOD_KW [52]. Вызывает метод в той же манере, что и CALL_METHOD [53], но также поддерживает аргументы в виде ключевых слов. Работает в тандеме с LOAD_METHOD [54].

Устаревшее

  • lib2to3 [55] устарел и может не работать с Python 3.10 или новее. См. PEP 617 [56] (новый PEG-парсер CPython) (внесено Виктором Стиннером в bpo-40360 [57]).

  • webbrowser.MacOSX устарел и будет удалён в Python 3.13. Он не протестирован и не документирован, а также не используется самим веб-браузером. (Вклад Дон-Хи На в bpo-42255 [58]).

  • Поведение возврата значения из методов тестирования TestCase [59] и IsolatedAsyncioTestCase [60] (отличного от значения None по умолчанию) устарело.

  • Устарели следующие функции unittest [61], они будут удалены в Python 3.13:

  • unittest.findTestCases();

  • unittest.makeSuite();

  • unittest.getTestCaseNames().

    Вместо них используйте методы TestLoader [62]:

(Внесено Эрландом Аасландом в bpo-5846 [66]).

Удалённое

  • SMTPD.MailmanProxy удалён: он не используется без внешнего модуля mailman. (Вклад Дон-Хи На в bpo-35800 [67]).

  • Устаревший в Python 3.9 модуль Binhex удалён. Функции BinAscii [68], устаревшие в этой же версии, также удалены:

  • a2b_hqx(), b2a_hqx();

  • rlecode_hqx(), rledecode_hqx().

  • Функция binAscii.crc_hqx() [69] доступна.

    (Внесено Виктором Стиннером в bpo-45085 [70]).

  • Команда distutils bdist_msi, устаревшая в Python 3.9, удалена, вместо неё используйте bdist_wheel — пакеты wheel (вклад Хьюго ван Кеменаде в bpo-45124 [71]).

  • В связи с серьёзными проблемами безопасности параметр reuse_address asyncio.loop.create_datagram_endpoint() [72], отключённый в Python 3.9, теперь полностью удалён. Это связано с поведением опции сокета SO_REUSEADDR в UDP (вклад Хьюго ван Кеменаде в bpo-45129 [73]).

  • Удалены методы __getitem__() в xml.dom.pulldom.DOMEventStream [74], wsgiref.util.FileWrapper [75] и fileinput.FileInput [76], устаревшие в Python 3.9. (вклад Хьюго ван Кеменаде в bpo-45132 [77]).

  • Удалено много устаревших функций unittest [61]:

  • Псевдонимы методов TestCase [59] failUnlessEqual, failIfEqual, failUnless, failIf, failUnlessRaises, failUnlessAlmostEqual, failIfAlmostEqual (устаревшие в Python 3.1), assertEquals, assertNotEquals, assert_, assertAlmostEquals, assertNotAlmostEquals, assertRegexpMatches, assertRaisesRegexp (устаревшие в Python 3.2) и assertNotRegexpMatches (устаревший в Python 3.5).

  • Недокументированный и сломанный метод Testcase [59] assertdictcontainssset (устарел в Python 3.2).

  • Недокументированный параметр <unittest.TestLoader.loadTestsFromModule> TestLoader.loadTestsFromModule() use_load_tests (устарел и игнорируется с версии 3.2).

  • Псевдоним класса TextTestResult [78]: _TextTestResult (устарел в Python 3.2).

    (вклад Сергея Сторчака в bpo-45162 [79]).

  • Следующие устаревшие функции и методы удалены в модуле gettext: lgettext(), ldgettext(), lngettext() и ldngettext().

Функция bind_textdomain_codeset(), методы outduct_charset() и set_output_charset(), а также параметр сodeset функций translate() [80] и install() [81] также удаляются, поскольку они используются только для l*getText() (вклад Сергея Сторчака в bpo-44235 [82]).

  • Из модуля configparser [83] удалены: класс SafeConfigParser, свойство filename класса ParsingError, метод readfp() класса ConfigParser, устарел с Python 3.2. (внесено Хьюго ван Кеменаде в bpo-45173 [84]).

  • Декоратор [85] @asyncio.coroutine, позволяющий совместить унаследованные генераторы сопрограмм с кодом async/await. Функция была устаревшей с Python 3.8, и её удаление первоначально планировалось в Python 3.10. Вместо неё используйте async def [86] (внесено Ильёй Волочием в bpo-43216 [87]).

  • asyncio.coroutines.CoroWrapper используется для обёртывания унаследованных объектов сопрограммы на основе генератора в режиме отладки (внесено Ильёй Волочием в bpo-43216 [87]).

  • Из _tkinter.TkappType удалён устаревший метод split() (вклад Эрленда Аасланда в bpo-38371 [88]).

Портирование кода на Python 3.11

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

Изменения в API Python

  • Запрещена передача не-concurrent.futures.ThreadPoolExecutor [89] исполнителей в loop.set_default_executor() после исправления в Python 3.8. (Внесено Ильёй Волочием в bpo-43234 [90]).

  • open() [91], io.open() [92], codecs.open() [93] и fileinput.FileInput [76] больше не принимают 'U' (“универсальную новую строку”) в режиме файла. Этот флаг был устаревшим с версии Python 3.3. В Python 3 "универсальная новая строка" используется по умолчанию, когда файл открыт в текстовом режиме. Параметр newline [94] в open() [91] управляет тем, как работает универсальная новая строка (внесено Виктором Стиннером в bpo-37330 [95]).

  • Модуль pdb [96] теперь читает конфигурационный файл .pdbrc с кодировкой 'utf-8' (внесено Шринивасом Редди Тхатипарти (శ్రీనివాస్ రెడ్డి తాటిపర్తి) в bpo-41137 [97]).

Изменения в сборке

  • CPython теперь может быть собран с опцией ThinLTO через --with-lto=thin. (вклад Дон-Хи На и Бретта Холмана в bpo-44340 [98]).

Изменения в C API

Новые возможности

  • Добавлена функция PyType_GetName() [99] для получения короткого имени типа. (Внесено Хай-Ши в bpo-42035 [100]).

  • Добавлена новая функция PyType_GetQualName() [101] для получения квалифицированного имени типа (внесено Хай-Ши в bpo-42035 [100]).

Портирование на Python 3.11

  • Старые макросы "мусорной корзины" (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) следует заменить новыми макросами Py_TRASHCAN_BEGIN и Py_TRASHCAN_END.

Функция tp_dealloc, имеющая старые макросы, такие как:

static void
mytype_dealloc(mytype *p)
{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_SAFE_BEGIN(p);
    ...
    Py_TRASHCAN_SAFE_END
}

должна перейти на новые макросы таким образом:

static void
mytype_dealloc(mytype *p)
{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
    ...
    Py_TRASHCAN_END
}

 Py_TRASHCAN_BEGIN имеет второй аргумент, который должен быть функцией освобождения памяти, где он находится.

Для поддержки старых версий Python в одной и той же кодовой базе можно определить следующие макросы и использовать их во всём коде (они были скопированы из кодовой базы mypy):

#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 8
#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
#else
#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
#endif
  • Функция PyType_Ready() [102] теперь выдаёт ошибку, если тип определён с установленным флагом Py_TPFLAGS_HAVE_GC [103], но не имеет функции обхода (PyTypeObject.tp_traverse [104]) (внесено Виктором Стиннером в bpo-44263 [105]).

  • Типы кучи с флагом Py_TPFLAGS_IMMUTABLETYPE [106] теперь могут наследовать протокол векторных вызовов PEP 590 [107]. Ранее это было возможно только для статических типов [108] (вклад Эрленда Аасланда в bpo-43908 [109]).

  • Поскольку Py_TYPE() [110] изменён на встроенную статическую функцию, Py_TYPE(obj) = new_type должно быть заменено на Py_SET_TYPE(obj, new_type): см. функцию Py_SET_TYPE() [111], которая доступна начиная с Python 3.9. Для обратной совместимости можно использовать этот макрос:

#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
{ ob->ob_type = type; }
#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
#endif

 (Вклад Виктора Стиннера в bpo-39573 [112]).

  • Поскольку Py_SIZE() [113] изменена на встроенную статическую функцию, Py_SIZE(obj) = new_size нужно заменить на Py_SET_SIZE(obj, new_size): см. функцию Py_SET_SIZE() [114] (доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:

#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
{ ob->ob_size = size; }
#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
#endif

 (Внесено Виктором Стиннером в bpo-39573 [112]).

Устаревшее

Удалённое

Используйте новый API PyConfig [122] из Python Initialization Configuration [123], PEP 587 [124], (внесено Виктором Стиннером в bpo-44113 [125]).

Прокачать навыки или начать изучать Python вы можете на наших курсах:

Также вы можете перейти на страницы из каталога [128], чтобы узнать, как мы готовим специалистов в других направлениях.

Выходит первый Python 3.11. Что нового? - 2
Профессии и курсы

Автор:
Mojsha

Источник [150]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/news/368413

Ссылки в тексте:

[1] Fullstack-разработке на Python: https://skillfactory.ru/python-fullstack-web-developer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_fpw_031021&utm_term=lead

[2] список: https://docs.python.org/3.11/whatsnew/changelog.html#changelog

[3] PEP 657: https://www.python.org/dev/peps/pep-0657

[4] bpo-43950: https://bugs.python.org/issue43950

[5] -X: https://docs.python.org/3.11/using/cmdline.html#cmdoption-X

[6] PYTHONNODEBUGRANGES: https://docs.python.org/3.11/using/cmdline.html#envvar-PYTHONNODEBUGRANGES

[7] codeobject.co_positions(): https://docs.python.org/3.11/reference/datamodel.html#codeobject.co_positions

[8] PyCode_Addr2Location(): https://docs.python.org/3.11/c-api/code.html#c.PyCode_Addr2Location

[9] bpo-33346: https://bugs.python.org/issue33346

[10] TypeError: https://docs.python.org/3.11/library/exceptions.html#TypeError

[11] AttributeError: https://docs.python.org/3.11/library/exceptions.html#AttributeError

[12] contextlib.ExitStack.enter_context(): https://docs.python.org/3.11/library/contextlib.html#contextlib.ExitStack.enter_context

[13] contextlib.AsyncExitStack.enter_async_context(): https://docs.python.org/3.11/library/contextlib.html#contextlib.AsyncExitStack.enter_async_context

[14] контекстного менеджера: https://docs.python.org/3.11/glossary.html#term-context-manager

[15] асинхронного контекстного менеджера: https://docs.python.org/3.11/glossary.html#term-asynchronous-context-manager

[16] bpo-44471: https://bugs.python.org/issue44471

[17] with: https://docs.python.org/3.11/reference/compound_stmts.html#with

[18] async with: https://docs.python.org/3.11/reference/compound_stmts.html#async-with

[19] bpo-44471: https://bugs.python.org/issue12022

[20] typing.SupportsComplex: https://docs.python.org/3.11/library/typing.html#typing.SupportsComplex

[21] typing.SupportsBytes: https://docs.python.org/3.11/library/typing.html#typing.SupportsBytes

[22] bpo-24234: https://bugs.python.org/issue24234

[23] bpo-44258: https://bugs.python.org/issue44258

[24] math.cbrt(): https://docs.python.org/3.11/library/math.html#math.cbrt

[25] bpo-44357: https://bugs.python.org/issue44357

[26] math.pow(): https://docs.python.org/3.11/library/math.html#math.pow

[27] ValueError: https://docs.python.org/3.11/library/exceptions.html#ValueError

[28] bpo-44339: https://bugs.python.org/issue44339

[29] bpo-44019: https://bugs.python.org/issue44019

[30] os.urandom(): https://docs.python.org/3.11/library/os.html#os.urandom

[31] bpo-44491: https://bugs.python.org/issue44491

[32] create_collation(): https://docs.python.org/3.11/library/sqlite3.html#sqlite3.Connection.create_collation

[33] UnicodeEncodeError: https://docs.python.org/3.11/library/exceptions.html#UnicodeEncodeError

[34] sqlite3.ProgrammingError: https://docs.python.org/3.11/library/sqlite3.html#sqlite3.ProgrammingError

[35] bpo-44688: https://bugs.python.org/issue44688

[36] sqlite3: https://docs.python.org/3.11/library/sqlite3.html#module-sqlite3

[37] sqlite_errorcode: https://docs.python.org/3.11/library/sqlite3.html#sqlite3.Error.sqlite_errorcode

[38] sqlite_errorcode: https://docs.python.org/3.11/library/sqlite3.html#sqlite3.Error.sqlite_errorname

[39] bpo-16379: https://bugs.python.org/issue16379

[40] threading.Lock.acquire(): https://docs.python.org/3.11/library/threading.html#threading.Lock.acquire

[41] time.CLOCK_MONOTONIС: https://docs.python.org/3.11/library/time.html#time.CLOCK_MONOTONIC

[42] time.CLOCK_REALTIME: https://docs.python.org/3.11/library/time.html#time.CLOCK_REALTIME

[43] bpo-41710: https://bugs.python.org/issue41710

[44] time.sleep(): https://docs.python.org/3.11/library/time.html#time.sleep

[45]  bpo-21302: https://bugs.python.org/issue21302

[46] bpo-45190: https://bugs.python.org/issue45190

[47] bpo-28307: https://bugs.python.org/issue28307

[48] bpo-40222: https://bugs.python.org/issue40222

[49] bpo-26110: https://bugs.python.org/issue26110

[50] unicodedata.normalize(): https://docs.python.org/3.11/library/unicodedata.html#unicodedata.normalize

[51] bpo-44987: https://bugs.python.org/issue44987

[52] CALL_METHOD_KW: https://docs.python.org/3.11/library/dis.html#opcode-CALL_METHOD_KW

[53] CALL_METHOD: https://docs.python.org/3.11/library/dis.html#opcode-CALL_METHOD

[54] LOAD_METHOD: https://docs.python.org/3.11/library/dis.html#opcode-LOAD_METHOD

[55] lib2to3: https://docs.python.org/3.11/library/2to3.html#module-lib2to3

[56] PEP 617: https://www.python.org/dev/peps/pep-0617

[57] bpo-40360: https://bugs.python.org/issue40360

[58] bpo-42255: https://bugs.python.org/issue42255

[59] TestCase: https://docs.python.org/3.11/library/unittest.html#unittest.TestCase

[60] IsolatedAsyncioTestCase: https://docs.python.org/3.11/library/unittest.html#unittest.IsolatedAsyncioTestCase

[61] unittest: https://docs.python.org/3.11/library/unittest.html#module-unittest

[62] TestLoader: https://docs.python.org/3.11/library/unittest.html#unittest.TestLoader

[63] unittest.TestLoader.loadTestsFromModule(): https://docs.python.org/3.11/library/unittest.html#unittest.TestLoader.loadTestsFromModule

[64] unittest.TestLoader.loadTestsFromTestCase(): https://docs.python.org/3.11/library/unittest.html#unittest.TestLoader.loadTestsFromTestCase

[65] unittest.TestLoader.getTestCaseNames(): https://docs.python.org/3.11/library/unittest.html#unittest.TestLoader.getTestCaseNames

[66] bpo-5846: https://bugs.python.org/issue5846

[67] bpo-35800: https://bugs.python.org/issue35800

[68] BinAscii: https://docs.python.org/3.11/library/binascii.html#module-binascii

[69] binAscii.crc_hqx(): https://docs.python.org/3.11/library/binascii.html#binascii.crc_hqx

[70] bpo-45085: https://bugs.python.org/issue45085

[71] bpo-45124: https://bugs.python.org/issue45124

[72] asyncio.loop.create_datagram_endpoint(): https://docs.python.org/3.11/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint

[73] bpo-45129: https://bugs.python.org/issue45129

[74] xml.dom.pulldom.DOMEventStream: https://docs.python.org/3.11/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream

[75] wsgiref.util.FileWrapper: https://docs.python.org/3.11/library/wsgiref.html#wsgiref.util.FileWrapper

[76] fileinput.FileInput: https://docs.python.org/3.11/library/fileinput.html#fileinput.FileInput

[77] bpo-45132: https://bugs.python.org/issue45132

[78] TextTestResult: https://docs.python.org/3.11/library/unittest.html#unittest.TextTestResult

[79] bpo-45162: https://bugs.python.org/issue45162

[80] translate(): https://docs.python.org/3.11/library/gettext.html#gettext.translation

[81] install(): https://docs.python.org/3.11/library/gettext.html#gettext.install

[82] bpo-44235: https://bugs.python.org/issue44235

[83] configparser: https://docs.python.org/3.11/library/configparser.html#module-configparser

[84] bpo-45173: https://bugs.python.org/issue45173

[85] Декоратор: https://docs.python.org/3.11/glossary.html#term-decorator

[86] async def: https://docs.python.org/3.11/reference/compound_stmts.html#async-def

[87] bpo-43216: https://bugs.python.org/issue43216

[88] bpo-38371: https://bugs.python.org/issue38371

[89] concurrent.futures.ThreadPoolExecutor: https://docs.python.org/3.11/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor

[90] bpo-43234: https://bugs.python.org/issue43234

[91] open(): https://docs.python.org/3.11/library/functions.html#open

[92] io.open(): https://docs.python.org/3.11/library/io.html#io.open

[93] codecs.open(): https://docs.python.org/3.11/library/codecs.html#codecs.open

[94] newline: https://docs.python.org/3.11/library/functions.html#open-newline-parameter

[95] bpo-37330: https://bugs.python.org/issue37330

[96] pdb: https://docs.python.org/3.11/library/pdb.html#module-pdb

[97] bpo-41137: https://bugs.python.org/issue41137

[98] bpo-44340: https://bugs.python.org/issue44340

[99] PyType_GetName(): https://docs.python.org/3.11/c-api/type.html#c.PyType_GetName

[100] bpo-42035: https://bugs.python.org/issue42035

[101] PyType_GetQualName(): https://docs.python.org/3.11/c-api/type.html#c.PyType_GetQualName

[102] PyType_Ready(): https://docs.python.org/3.11/c-api/type.html#c.PyType_Ready

[103] Py_TPFLAGS_HAVE_GC: https://docs.python.org/3.11/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC

[104] PyTypeObject.tp_traverse: https://docs.python.org/3.11/c-api/typeobj.html#c.PyTypeObject.tp_traverse

[105] bpo-44263: https://bugs.python.org/issue44263

[106] Py_TPFLAGS_IMMUTABLETYPE: https://docs.python.org/3.11/c-api/typeobj.html#Py_TPFLAGS_IMMUTABLETYPE

[107] PEP 590: https://www.python.org/dev/peps/pep-0590

[108] статических типов: https://docs.python.org/3.11/c-api/typeobj.html#static-types

[109] bpo-43908: https://bugs.python.org/issue43908

[110] Py_TYPE(): https://docs.python.org/3.11/c-api/structures.html#c.Py_TYPE

[111] Py_SET_TYPE(): https://docs.python.org/3.11/c-api/structures.html#c.Py_SET_TYPE

[112] bpo-39573: https://bugs.python.org/issue39573

[113] Py_SIZE(): https://docs.python.org/3.11/c-api/structures.html#c.Py_SIZE

[114] Py_SET_SIZE(): https://docs.python.org/3.11/c-api/structures.html#c.Py_SET_SIZE

[115] PySys_AddWarnOptionUnicode(): https://docs.python.org/3.11/c-api/sys.html#c.PySys_AddWarnOptionUnicode

[116] PySys_AddWarnOption(): https://docs.python.org/3.11/c-api/sys.html#c.PySys_AddWarnOption

[117] PySys_AddXOption(): https://docs.python.org/3.11/c-api/sys.html#c.PySys_AddXOption

[118] Py_SetPath(): https://docs.python.org/3.11/c-api/init.html#c.Py_SetPath

[119] Py_SetProgramName(): https://docs.python.org/3.11/c-api/init.html#c.Py_SetProgramName

[120] Py_SetPythonHome(): https://docs.python.org/3.11/c-api/init.html#c.Py_SetPythonHome

[121] Py_SetStandardStreamEncoding(): https://docs.python.org/3.11/c-api/init.html#c.Py_SetStandardStreamEncoding

[122] PyConfig: https://docs.python.org/3.11/c-api/init_config.html#c.PyConfig

[123] Python Initialization Configuration: https://docs.python.org/3.11/c-api/init_config.html#init-config

[124] PEP 587: https://www.python.org/dev/peps/pep-0587

[125] bpo-44113: https://bugs.python.org/issue44113

[126] Профессия Fullstack-разработчик на Python (15 месяцев): https://skillfactory.ru/python-fullstack-web-developer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_fpw_031021&utm_term=conc

[127] Курс «Python-разработчик» (10 месяцев): https://skillfactory.ru/python-developer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_py_031021&utm_term=conc

[128] из каталога: https://skillfactory.ru/catalogue?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=sf_allcourses_031021&utm_term=conc

[129] Профессия Data Scientist: https://skillfactory.ru/data-scientist-pro?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_dspr_031021&utm_term=cat

[130] Профессия Data Analyst: https://skillfactory.ru/data-analyst-pro?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=analytics_dapr_031021&utm_term=cat

[131] Курс «Математика для Data Science»: https://skillfactory.ru/matematika-dlya-data-science#syllabus?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_mat_031021&utm_term=cat

[132] Курс «Математика и Machine Learning для Data Science»: https://skillfactory.ru/matematika-i-machine-learning-dlya-data-science?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_matml_031021&utm_term=cat

[133] Курс по Data Engineering: https://skillfactory.ru/data-engineer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_dea_031021&utm_term=cat

[134] Курс «Machine Learning и Deep Learning»: https://skillfactory.ru/machine-learning-i-deep-learning?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_mldl_031021&utm_term=cat

[135] Курс по Machine Learning: https://skillfactory.ru/machine-learning?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=data-science_ml_031021&utm_term=cat

[136] Профессия Fullstack-разработчик на Python: https://skillfactory.ru/python-fullstack-web-developer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_fpw_031021&utm_term=cat

[137] Курс «Python для веб-разработки»: https://skillfactory.ru/python-for-web-developers?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_pws_031021&utm_term=cat

[138] Профессия Frontend-разработчик: https://skillfactory.ru/frontend-razrabotchik?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_fr_031021&utm_term=cat

[139] Профессия Веб-разработчик: https://skillfactory.ru/webdev?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_webdev_031021&utm_term=cat

[140] Профессия iOS-разработчик: https://skillfactory.ru/ios-razrabotchik-s-nulya?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_ios_031021&utm_term=cat

[141] Профессия Android-разработчик: https://skillfactory.ru/android-razrabotchik?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_andr_031021&utm_term=cat

[142] Профессия Java-разработчик: https://skillfactory.ru/java-razrabotchik?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_java_031021&utm_term=cat

[143] Профессия QA-инженер на JAVA: https://skillfactory.ru/java-qa-engineer-testirovshik-po?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_qaja_031021&utm_term=cat

[144] Профессия C#-разработчик: https://skillfactory.ru/c-sharp-razrabotchik?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_cdev_031021&utm_term=cat

[145] Профессия Разработчик игр на Unity: https://skillfactory.ru/game-razrabotchik-na-unity-i-c-sharp?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_gamedev_031021&utm_term=cat

[146] Курс «Алгоритмы и структуры данных»: https://skillfactory.ru/algoritmy-i-struktury-dannyh?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_algo_031021&utm_term=cat

[147] Профессия C++ разработчик: https://skillfactory.ru/c-plus-plus-razrabotchik?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_cplus_031021&utm_term=cat

[148] Профессия Этичный хакер: https://skillfactory.ru/cyber-security-etichnij-haker?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_hacker_031021&utm_term=cat

[149] Курс по DevOps: https://skillfactory.ru/devops-ingineer?utm_source=habr&utm_medium=habr&utm_campaign=article&utm_content=coding_devops_031021&utm_term=cat

[150] Источник: https://habr.com/ru/post/581270/?utm_source=habrahabr&utm_medium=rss&utm_campaign=581270