- PVSM.RU - https://www.pvsm.ru -
Делимся переводом документации альфы 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, который можно задействовать для сопоставления инструкций байт-кода и исходного кода. Эту информацию можно получить с помощью:
метода Python codeobject.co_positions() [7];
функции PyCode_Addr2Location() [8] из C API.
Опция -X [5] no_debug_ranges и переменная среды PYTHONNODEBUGRANGES могут использоваться для отключения этой функции. Подробности — в PEP 657 [3], это вклад Пабло Галиндо, Батухана Таскайи и Аммара Аскара в bpo-43950 [4].
Асинхронные охваты (comprehension) теперь разрешены внутри охватов в асинхронных функциях. Внешний охват неявно становится асинхронным (автор: Сергей Сторчака в bpo-33346 [9]).
TypeError [10] поднимается вместо AttributeError [11] в contextlib.ExitStack.enter_context() [12] и contextlib.AsyncExitStack.enter_async_context() [13] для объектов без поддержки протоколов контекстного менеджера [14] или асинхронного контекстного менеджера [15] соответственно (вклад Сергея Сторчака в bpo-44471 [16]).
TypeError [10] поднимается вместо AttributeError [11] в with [17] и async with [18] для объектов без поддержки протоколов контекстного менеджера [14] или асинхронного контекстного менеджера [15] соответственно (вклад Сергея Сторчака в bpo-44471 [19]).
Специальные методы complex.__complex__() и bytes.__bytes__() реализованы для поддержки протоколов typing.SupportsComplex [20] и typing.SupportsBytes [21] (вклад Марка Дикинсона и Дон-Хи На в bpo-24234 [22]).
Их ещё нет.
Поддержка инициализации дроби из строки в стиле PEP 515 (вклад Сергея Б. Кирпичёва в bpo-44258 [23]).
Добавлена функция 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.call, такая, что operator.call(obj, *args, **kwargs) == obj(*args, **kwargs) (вклад Энтони Ли в bpo-44019 [29]).
На Windows os.urandom() [30] в Python 3.11 использует BcryptGenRandom().
Теперь вы можете отключить авторизер (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]).
В Unix, если функция sem_clockwait() доступна в библиотеке C (glibc 2.30 и выше), то threading.Lock.acquire() [40] использует монотонные часы (time.CLOCK_MONOTONIС [41]) для тайм-аута, а не системные часы (time.CLOCK_REALTIME [42]), чтобы не зависеть от изменений последних. (Вклад Виктора Стиннера и Ливиуса в bpo-41710 [43]).
В 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]).
База данных 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]).
Добавлен новый опкод 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]).
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать изменить ваш код.
Запрещена передача не-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]).
Добавлена функция PyType_GetName() [99] для получения короткого имени типа. (Внесено Хай-Ши в bpo-42035 [100]).
Добавлена новая функция PyType_GetQualName() [101] для получения квалифицированного имени типа (внесено Хай-Ши в bpo-42035 [100]).
Старые макросы "мусорной корзины" (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]).
PyFrame_BlockSetup() и PyFrame_BlockPop() удалены (вклад Марка Шеннона в bpo-40222 [48]).
Удалены следующие функции настройки инициализации Python:
PySys_AddWarnOptionUnicode() [115];
PySys_AddWarnOption() [116];
PySys_AddXOption() [117];
PySys_HasWarnOptions();
Py_SetPath() [118];
Py_SetProgramName() [119];
Py_SetPythonHome() [120];
_Py_SetProgramFullPath().
Используйте новый API PyConfig [122] из Python Initialization Configuration [123], PEP 587 [124], (внесено Виктором Стиннером в bpo-44113 [125]).
Прокачать навыки или начать изучать Python вы можете на наших курсах:
Также вы можете перейти на страницы из каталога [128], чтобы узнать, как мы готовим специалистов в других направлениях.
Data Science и Machine Learning
Профессия Data Scientist [129]
Профессия Data Analyst [130]
Курс по Data Engineering [133]
Курс по Machine Learning [135]
Python, веб-разработка
Мобильная разработка
Java и C#
Профессия C#-разработчик [144]
От основ — в глубину
Профессия Этичный хакер [148]
А также:
Курс по DevOps [149]
Автор:
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
Нажмите здесь для печати.