LINUX.ORG.RU

Python 3.13

 , ,


1

5

После года разработки вышла новая стабильная версия интерпретируемого языка программирования Python 3.13. Релиз включает изменения в собственно языке и его стандартной библиотеке. К важнейшим изменениям относятся использование нового интерактивного интерпретатора по умолчанию, экспериментальная поддержка работы в режиме free-threaded (т. е. с отключением global interpreter lock) (PEP 703), и JIT-компилятор (PEP 744).

С этого релиза осуществлён переход на новый цикл релизов Python (Annual Release Cycle for Python, PEP 602), в связи со стремлением расширить период «полной поддержки» новых выпусков:

  • Python 3.9–3.12 имеют полтора года полной поддержки, за ними следует три с половиной года исправления брешей в безопасности.
  • Python 3.13 и более поздние релизы будут иметь два года полной поддержки и три года исправлений уязвимостей.

Продолжается работа по усовершенствованию сообщений об ошибках. Теперь traceback’и по умолчанию подсвечиваются цветом. Встроенная функция locals() теперь имеет определённую семантику для изменения возвращаемого меппинга (PEP 667), а параметры типов (typing.TypeVar, typing.ParamSpec, typing.TypeVarTuple) поддерживают значения по умолчанию (PEP 696).

Изменения стандартной библиотеки включают удаление устаревших API и модулей (aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu и xdrlib), а также привычные улучшения в области дружелюбия к пользователю и корректности. Несколько модулей исключены из поставки в связи с объявлением их устаревшими в Python 3.11 (PEP 594), в том числе инструмент и библиотека 2to3.

Из улучшений безопасности стоит отметить, что ssl.create_default_context() устанавливает флагами по умолчанию ssl.VERIFY_X509_PARTIAL_CHAIN и ssl.VERIFY_X509_STRICT.

Добавлена поддержка платформ: Apple iOS и Android теперь официально поддерживаемые платформы (tier 3) (PEP 730, 738). wasm32-wasi поддерживается на уровне tier 2, прекращена официальная поддержка wasm32-emscripten.

Для более основательного ознакомления с нововведениями релиза, обращайтесь к официальной документации (по библиотеке, по языку). Руководствуйтесь статьей «Переход на Python 3.13» для обновления своих проектов на новую версию языка. Также см. changelog.

>>> Подробности



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 7)
Ответ на: комментарий от rtxtxtrx

Не знаю, что эта ахинея означает, но я уже дал ответ, и этот комментарий с моим ответом не связан. Проблема ровно одна, разработчики зачем то сломали логику. С py2 в моём блокноье проблем не было

alt-tab-let ★★
()

экспериментальная поддержка работы в режиме free-threaded (т. е. с отключением global interpreter lock) (PEP 703), и JIT-компилятор (PEP 744).

О, это мы романсим. Есть надежда что это ускорит то что не может ускорить numba (половину всего). Из интересного там еще статические аттрибуты будут доступны через self, но это уже для гурманов.

Obezyan
()
Ответ на: комментарий от alt-tab-let

Python 3000, он же Python 3 появился 20 лет назад, ныть о чем-то, что кто-то что-то сломал через 20 лет после того как объявили, что Python 3 будет единстивенным правильным питоном архиглупо

rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

Я не ною. Я назвал решение неадекватным. Но я с ним смирился, надо будет ещё с этим связываться, свои обёртки напишу.

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

Он никогда не был элегантным он достаточно уродлив…


Примеры от DeepSeek

Python — это язык программирования, который известен своей простотой и читаемостью. Однако, как и любой другой язык, у него есть свои особенности и «подводные камни», которые могут показаться нелогичными или неочевидными для разработчиков. Вот несколько примеров таких моментов:

1. Деление целых чисел

В Python 2 деление целых чисел возвращает целое число, даже если результат не является целым. Это может быть неожиданным:

print(5 / 2)  # Вывод: 2 в Python 2

В Python 3 это поведение было изменено, и деление целых чисел возвращает число с плавающей точкой:

print(5 / 2)  # Вывод: 2.5 в Python 3

2. Область видимости переменных

В Python переменные, определенные внутри блока if, for, while и других конструкций, доступны вне этих блоков:

if True:
    x = 10
print(x)  # Вывод: 10

Это может быть неожиданным, если вы привыкли к более строгой области видимости, например, в языках C или Java.

3. Сравнение разных типов

В Python можно сравнивать объекты разных типов, что может привести к неожиданным результатам:

print(1 < 'a')  # Вывод: True

Это происходит из-за того, что строки в Python всегда «больше» чисел.

4. Изменяемость и неизменяемость

Некоторые типы данных в Python являются неизменяемыми (например, int, str, tuple), а другие — изменяемыми (например, list, dict, set). Это может привести к неожиданным результатам при работе с этими типами:

a = (1, 2)
b = a
b += (3,)
print(a)  # Вывод: (1, 2)
print(b)  # Вывод: (1, 2, 3)

В этом примере кортеж a остается неизменным, даже если мы изменили b.

5. Поведение is и ==

Оператор is проверяет идентичность объектов (то есть, указывают ли они на один и тот же объект в памяти), а оператор == проверяет равенство значений:

a = [1, 2, 3]
b = a
print(a is b)  # Вывод: True
print(a == b)  # Вывод: True

c = [1, 2, 3]
print(a is c)  # Вывод: False
print(a == c)  # Вывод: True

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

6. Поведение None

В Python None — это специальный объект, который часто используется для обозначения отсутствия значения. Однако, сравнение None с другими значениями может быть неочевидным:

print(None == None)  # Вывод: True
print(None is None)  # Вывод: True
print(None == False)  # Вывод: False
print(None == 0)  # Вывод: False

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

7. Поведение and и or

В Python операторы and и or возвращают не булевы значения, а один из операндов:

print(1 and 2)  # Вывод: 2
print(1 or 2)  # Вывод: 1

Это может быть неожиданным, если вы ожидаете, что and и or всегда будут возвращать True или False.

8. Поведение += и -=

Операторы += и -= могут вести себя по-разному в зависимости от типа данных:

a = [1, 2]
b = a
a += [3]
print(a)  # Вывод: [1, 2, 3]
print(b)  # Вывод: [1, 2, 3]

a = (1, 2)
b = a
a += (3,)
print(a)  # Вывод: (1, 2, 3)
print(b)  # Вывод: (1, 2)

В этом примере += изменяет список a, но создает новый кортеж для a.

rtxtxtrx ★★
()
Ответ на: комментарий от alt-tab-let
>>> a = 'abcde'
>>> str(a)
'abcde'
>>> print (str(a))
abcde
>>> str(str(str(a)))
'abcde'

шарман

однозначность так и сквозит. при том, что в py2 всё было однозначно

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

я когда первый раз это увидел, чуть с кровати не упал

не должно изменение типа менять содержимое. просто не должно. закон такой. я не знаю, где ещё в мировой истории изменение типа меняет содержимое

alt-tab-let ★★
()
Ответ на: комментарий от AntonI

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

А что такое обратная совместимость ? Это когда мне для сборки нужен gcc-11 и выше а на gcc-7 я собрать не могу ?

mx__ ★★★★★
()
Ответ на: комментарий от alt-tab-let

в python 2 ascii лез из всех щелей, именно поэтому были отдельные юникод строки. python 3 решил проблему кодировок.

MHz
()
Ответ на: комментарий от mx__

В том то и дело, что при рендеринге текста не должно быть b'. Когда ты просто нажал a, то должно быть b, это нормально, во втором были u

Но когда ты делаешь print (str(a)), оно должно быть без всяких Б

alt-tab-let ★★
()
Ответ на: комментарий от MHz

у python 2.7 не было проблем с юникодом, были байтовые строки и юникод строки и не надо было постоянно что-то куда-то приводить. проблем не было вообще, ни разу, а сейчас ты хрен что нормально захешируешь.

alt-tab-let ★★
()
Ответ на: комментарий от rtxtxtrx

2. Область видимости переменных

я не понял, как именно, но у меня код на python 2.7, который работал ещё полчаса назад, перестал видеть переменную вне блока. я обратно возвратил исходный файл, но он всё равно тупо не видит. 10 лет видел, полчаса назад видел, а сейчас не видит! это бред полный, и как это и почему я вообще не понимаю.

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let
    codecs.open(outcount(),'w','utf-8').write( '\n'.join(buf) )
NameError: name 'buf' is not defined

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

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

не, ну это несусветный бред. за полчаса изменились законы природы. python тот же самый, код тот же самый, 10 лет работал, и вдруг тупо не видит переменную в блоке.

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

всё оказалось проще, это я тупой.

что логично.

просто если бы я этого абзаца сёдня не прочёл, я бы об этом даже не задумался и понял бы, в чём проблема. а я его прочёл, весь день думаю, чтобы не забыть, что я хотел на него ответить, щас просто некогда, поэтому он мне в мозг впал.

alt-tab-let ★★
()
Ответ на: комментарий от mx__

Ещё раз, на пальцах

Python 3.11.2 (main, Aug 26 2024, 07:20:54) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a, b = 'abcde', 'abcde'.encode()
>>> a
'abcde'
>>> print (str(a))
abcde
>>> b
b'abcde'
>>> print (str(b))
b'abcde'

Ничего не смущает?

А было вот так:

Python 2.7.18 (default, Sep 19 2023, 07:10:59) 
[GCC 10.2.1 20210110] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a,b = u'abcde', b'abcde'
>>> a
u'abcde'
>>> print str(a)
abcde
>>> b
'abcde'
>>> print str(b)
abcde
alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

x(y.encode(‘utf-8’).decode(‘utf-8’)

А зачем тебе кодировать и сразу декодитовать обратно? Преюположу, что твои проблемы того же рода — навставлял лишних преобразований и заблуд лся в них.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от alt-tab-let

работал ещё полчаса назад, перестал видеть переменную

Либо ты переутомился, либо что-то удалил и не заиетил. Ребут иногда помогает.

question4 ★★★★★
()
Ответ на: комментарий от alt-tab-let

Где str от стринга даёт b?

a.decode() стрингом не является.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)

Я сейчас Bash изучаю. Как думаете, Python стоит изучать или после Bash надо взять что-то посерьёзнее?

Desmond_Hume ★★★★★
()
Ответ на: комментарий от question4

Не важно. Рендеринг данных не должен их изменять. А он их изменяет. В одном известном мне случае в истории человечества, когда в py3 рендеришь bytes. Больше таких примеров я не знаю

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

Ладно, хоть ты либо тролль, либо не способен понимать что тебе пишут, напишу.

Ты же понимаешь что то, что эти байты чудесным образом рендерятся в буквы это частный случай?

sovety_ot_sonika
()
Ответ на: комментарий от mx__

Str b должен выводить abcde

Нет ни одной причины во вселенной, кроме нездоровых фантазий разработчиков, почему он должен выводить b'abcde', тупо изменяя содержимое байт. Во всех остальных случаях никто ничего не корёжит, в py2 еикто ниче не корёжил, и тут хлобысь, у нас свой путь

alt-tab-let ★★
()
Ответ на: комментарий от sovety_ot_sonika

Байтовая коллекция abcde и utf строка abcde идентичны физически. В python 2 это работало в 100% случаев. Нет ни одной причины чтобы оно рендерило в b". Ни одной. Те кто считают иначе - я не вижу смысла дискутировать с такими людьми. У меня всё, не надо дальше поднимать эту тему.

Из за этого работа с base64 и тп превращаетмя в мрак. Просто потому, что разрабы всё сломали. Если кто то считает, что сломать лучше, чем не ломать, не решив при этом ни одной проблемы, тогда я понимаю откуда все проблемы с современном it.

alt-tab-let ★★
()
Последнее исправление: alt-tab-let (всего исправлений: 1)
Ответ на: комментарий от sovety_ot_sonika

Я примерно такого уровня аргументации от местных регистрантов и ожидаю, не стоило ввязываться в дискуссию, всё равно никто ничё не понял. Да и хрен с ним.

alt-tab-let ★★
()
Ответ на: комментарий от alt-tab-let

Нет ни одной причины чтобы оно рендерило в b"

Ты не поверишь…

Те кто считают иначе - я не вижу смысла дискутировать с такими людьми

Ну да, обидно конечно видеть как ржут над тобой, понимаю

sovety_ot_sonika
()
Ответ на: комментарий от drfaust

А для продакшена тогда что?

Mojo🔥, когда будет можно. :)

dataman ★★★★★
()
Ответ на: комментарий от alt-tab-let

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

gruy ★★★★★
()
Ответ на: комментарий от sovety_ot_sonika

Оно в repr уже в b. На рендеринге оно не нужно никак и просто вредно. Причин обратного я не увидел.

Ну да, обидно конечно видеть как ржут над тобой, понимаю

Обидно что it это синоним тупости. Компетентности на лоре вообще минимум, не только в этом топике. Я не понмю, чтобы кроме чисто кодовых вещей, тут решили хоть какую то проблему. Поэтому тупости комментирующих я вообще не удивлён, пусть хоть ржут, хоть плачут, умнее тх это не сделают. Некоторые даже сути проблемы не поняли, но мнение имеют. Да пожалуйста. По крайней мере, не увидел ни одного оправдывающего факта неадекватности разработчиков, ломающих адекватное поведение. Это тупое решение. О чём был исходный пост, осьальные посты были лишние. Включая этот.

alt-tab-let ★★
()
Ответ на: комментарий от gruy

Я хочу чтобы рендеринг не И З М Е Н Я Л данные. И он это не делает в 99.999% случаев во вселенной. Есть только одно исключение - вот это. Обратное преобразование данные не клрёжит.

Короче мы по кругу ходим. Это скучно. Преобразование байтов в строку не должно добавлять отсебятину. Или давай тогда str(13) будет выдавать 'eto chislo 13' а не ОЧЕВИДНОЕ '13'. Причём python же владел этой тайной магией в версии 2

alt-tab-let ★★
()
Ответ на: комментарий от gruy

Причем в интерактивной оболочке питона который был в 2ке не юникодный …

mx__ ★★★★★
()
Ответ на: комментарий от alt-tab-let

Рендеринг данных не должен их изменять.

Почему ты считаешь это рендерингом? Это разные переменные в разных областях памяти. У них разные id. a is b даст False.

olegd ★★★
()
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: комментарий от alt-tab-let

Байтовая коллекция abcde и utf строка abcde идентичны физически.

>>> a = 'qwerty'
>>> b = a.encode()
>>> a.__sizeof__()
55
>>> b.__sizeof__()
39
olegd ★★★
()
Ответ на: комментарий от alt-tab-let

Функция str возвращает графическое представление объектов. Графическое представление байт начинается с суффикса «b» и использует шестнадцатеричные эскейпы.

Если вы уверены, что байты являются текстом, то используйте вариант str() с указанием кодировки.

pasquale
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.