LINUX.ORG.RU

Python 3.13

 , ,


1

6

После года разработки вышла новая стабильная версия интерпретируемого языка программирования 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)

Ответ на: комментарий от lbvf50txt

Если от такого положения вещей коробит, выход переходить в другие пространства. Например Go

Ну капец блин. Товарищ. Го из беты вышел во времена питона 3.3.

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

А анонсированный выход Go 2 сломает все что было.

Про Go 2 анонсировано, что его не будет.

akho
()
Ответ на: комментарий от lbvf50txt

Я как-то собеседовался, сказали можно тестовое задание на любом языке решать. Решил на Erlang. Удивились.

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

Напиши на своем C ютуб! Не можешь? — А на питоне можно!

И сколько вы ютубов написали?

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

Файл открывается или в бинарном или в текстовом режиме. Во втором случае ещё обычно можно указать кодировку, но хз как в Pytohn.

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

то есть, str без аргументов выдаёт b", а open без аргументов открывает, как строку? логично, чего же тут нелогичного то.

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

Python ломает обратную совместимость в этом релизе. Когда ее последний раз ломал Go?

akho
()
Ответ на: комментарий от FishHook

Ну капец блин. Товарищ. Го из беты вышел во времена питона 3.3.

Вы, прежде чем спорить, изучите историю Go. Кто его писал, зачем в 2009 году, когда уже сущестовал Python, Ruby, C, C++, Perl, Java, JS и так далее, создавали новый язык без классов и дженериков с минималистичным синтаксисом?

У языка программирования есть идея согласно которой развивается проект. В случае Golang это сохранение обратной совмистимости и простого, минималистичного синтаксиса. В этом был смысл создания нового языка: читабильный и понятный язык. Python нацелен на другие идеи, это другое пространство.

ХОТЯ! Zen of Python больше подходит к Go чем к текущему состоянию Python.

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

lbvf50txt
()
Последнее исправление: lbvf50txt (всего исправлений: 2)

@Rodegast, @AntonI, @TechnoMag, только что я перечитывал Zen of Python и обратил внимание на дату 19-Aug-2004. Тогда Python 3 еще не было. Возможно, тот чистый, синтаксически стабильный Python из Zen - это Python 2.

Потом, я обнаружил что в 2020 от поддержки Python 2 отказались. С одной стороны все эти обновления похожи на какую-то мышинную возню и калйдоскоп, с другой стороны так по чуть чуть идет прогресс. Однозначно сказать нельзя.

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

И почему модераторы до сих пор не снесли всю ветку на три страницы где ты никак не поймёшь очевидных любому программисту вещей?

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

Мне то всё понятно стало сразу. Я сразу понял «пропал python».

На 3 страницы никто так и не сказал, что b" необходимы. Если бы разрабы не сломали, никто бы вообще этого не заметил, и не ходил бы и не просил. Не было бы общества «добавьте b" в str, все бы просто пользовались и всё.

Каких вещей я не понимаю? Что строки и байты разные? Это очевидно, и это вообще ничего не меняет. Или я не на одной волне с разработчиками? Тоже очевидно, я никогда не буду принимать изменения ради изменения, которое ломает что-то в одном случае и вообще ничего не даёт взамен. Это очевидно каждому здравомыслящему, что может взглянуть хоть немного дальше.

Короче не понял, каких конкретно вещей я не понял. Я выдвинул ровно один тезис, ровно 1. А мне какую-то ахинею, что строки и байты разные, про javы какие-то и прочее. Как это относится к тому, что сломали очевидное поведение ради ничего? И причём здесь очевидные программисты, это вопрос проектирования. Ради абстрактной правильности люди, которые это делали, просто не поняли ценностей python-а. Вон в пыхе до сих пор никто не ломает решения „тяп ляп две портянки нафига б“, и на 7 php можно исполнять код из php4 в духе „всё пишем в одну волну“. Вопрос „давать по рукам или нет за такое-то поведение“ это вообще вопрос философии. У python2 была одна философия, у python3 уже другая. Поэтому у нас есть ещё один „правильный“, „спроектированный“ и подобная ересь язык, но нет такого языка как python2.

Поэтому что я думаю о разрабах py2, то и думаю, это моё мнение, и я вообще не понимаю, какое отношение это имеет к программистам, программированию? Я написал то, что думаю о сломе такого языка, как py2 и изменению вектора философии, а в ответ слышу только какую-то ахинею, про строки, байты и прочее. Изначальный пост вообще не об этом, и я не знаю, как можно это не замечать и постоянно кидать мне что-то про строки, байты и какие-то тех. детали.

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

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

строкобайт

строкобайты второго питона - это такой же мусор как строкобайты php.

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

и усложнили конверсию строкобайт до ужаса

ну, ты сам половину ответа уже нашел.

конверсию «строкобайт» во что? если у тебя нет ни строк ни байт то вот что конвертируешь-то?

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

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

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

Каких вещей я не понимаю?

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

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

строкобайты второго питона - это такой же мусор как строкобайты php.

Этим и замечательны. Для остального есть unicode()

python3 хотел стать слишком «правильным». тогда как php пошёл своей дорогой, кстати, и ничего не поломал. а в py3 уже накопилось много кода, библиотек и прочего, и пришлось всё переписывать. даже тем, кто этого не хотел, и его строки py2 устраивали полностью.

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

одной из философий python и было следование очевидному. если тебя просят сделать str на байты, очевидно хотят получить строку, скорее всего ascii. и python2 это очевидное различал. python3 тоже при этом выдаёт ту же самую строку, но ставит туда b". но саму-то строку он распознал, даже без указания кодировки. естественно, если мы туда японские кракозяблы хочем закинуть, так падай - str в py2 так и делал. в общем, str был очевидным и предсказуемым, и не требующим от тебя кодировки на каждый чих.

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

это тоже понятно, непонятно какую проблему решает то, что когда ты уже исправно раскодировал внутри своей str-шной сущности строку, ты туда b" добавляешь? ну падай с «не понял кодировку», а если понял - выдавай строку, как строку. py2 именно так и делал, и это было хорошее решение. насколько правильное - не знаю, мне всё равнго, правильных языков пруд пруди, там и hello world может по 8 кб кода занимать, зато правильного кода.

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

раскодировал внутри своей str-шной сущности строку, ты туда b" добавляешь?

python3 тоже при этом выдаёт ту же самую строку, но ставит туда b".

не совсем понял, ты про python3 поведение str(b)?

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

не совсем понял, ты про python3 поведение str(b)?

я про свой первый пост. эта шарманка уже по 8-му кругу, надоело, забей

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

Дык если его 4.2 сносить по полкопейки за вист, то он в минус уйдёт.
Цели свои он озвучил: флудить тупняком, чтоб тема попала в топ.
Ну и пускай позорится дальше, жалко чтоль.

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

тогда в str(13) тоже надо указывать опционально, покупаем мы или продаём, а то нипанятна

int 1101 - имеет только один возможный смысл для процессора и он заранее известен. для байты->строка так не сделаешь

asdpm
()
Ответ на: комментарий от lbvf50txt

я перечитывал Zen of Python и обратил внимание на дату 19-Aug-2004. Тогда Python 3 еще не было. Возможно, тот чистый, синтаксически стабильный Python из Zen - это Python 2.

«Explicit is better than implicit.» «In the face of ambiguity, refuse the temptation to guess.» По этой логике bytes и str должны заметно отличаться внешне.

Да, было удобно, когда 8-битные строки позволяли хранить бинарные данные без лишних движений. Но за это приходилось платить неоднозначностью для всех языков помимо английского. Или обвешивать стринги метаданными, после чего они всё равно оказывались неидентичны массиву байтов, и опять получалось неявное с догадками.

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

Цели свои он озвучил: флудить тупняком, чтоб тема попала в топ.

Мне полетела куча претензий вообще не по теме. Программисты байты хорошо считают, в политике не каждый из них гений. Ахинею про байты и строки я выслушал раз 50. Я вообще про другое говорил, но каждый в этом чате решил мне высказать «да ты не понимаешь». Я умею превращать байты в строки. Без проблем. И как работает str я знаю. Вопрос был в том, зачем это.

Мне надо было просто не отвечать, никому, но мне почему-то казалось, что тут вменяемые люди, и когда я объясню очевидное, ко мне перестанут с этим лезть - так нет, этих людей стало ещё больше, и все уводили разговор в какую-то вообще другую степь, услышав какой-то технический термин. И, походу, вообще никто ничё не понял из того что я говорю (потому что это вообще не про программирование), большая ошибка что я вообще стал кому-то отвечать. Я просто забыл, что такое ЛОР. Я бы давно закрыл эту тему, но её всё переоткрывают и переоткрывают.

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

раскодировал внутри своей str-шной сущности строку

нет, он не раскодировал. он тебе байты предъявляет каким-нибудь видом, что бы мог смотреть.

это своего рода toString() джавы, он будет содержать «какую-нибудь реализацию», это тот же, которым print() прользуется

>>> b = bytes([255, 255, 255, 255])

>>> print(b)
b'\xff\xff\xff\xff'

>>> print(str(b))
b'\xff\xff\xff\xff'
asdpm
()
Ответ на: комментарий от alt-tab-let

str без аргументов выдаёт b"

>>> str()
''
>>> str
<class 'str'>
question4 ★★★★★
()
Ответ на: комментарий от Gentooshnik

Файл открывается или в бинарном или в текстовом режиме. Во втором случае ещё обычно можно указать кодировку, но хз как в Pytohn.

Если в текстовом, по умолчанию считается, что кодировка utf-8 (зависит от платформы). Если окажется иначе — падает с ошибкой чтения. Можно указать кодировку явно.

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

либо он внатуре не понимает

Я уже три гигатонны текста написал, не думаю, что это ещё как изменит.

Речь вообще не об этом. Причём здесь байты, данные, кодировки, шмодировки? Я знаю, как это работает, и знаю, почему. Речь о политическом решении. И тут я уже тоже увидел кучу пуристов «НИЛЬЗЯ АДНАЗНАЧНА АПРЕДЕЛИТЬ СТРАКУ НАДА КАДИРОВКУ УКАЗАТЬ».

Это именно политика. У разрабов python3 было слишком много власти, на них многое было завязано. И они решили сделать «всё правильно». И просто сломали и убили python2. И тут тоже есть этому сторонники.

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

И мне нравится тот старый python2, который проф программисту, пуристу, или ещё какому технарю кажется «нипрафисианальным».

Я не технарь. И выбора нас не оставили, всю инфраструктуру подтянули переходить на python3, а того неряшливо-элегантного языка не оставили. Аргументация «ну перепиши там, перепиши тут, чё там» тоже не подходит. Я не хочу переписывать. Мне не нужно развитие py2, он уже идеален. И не для одного меня. Но желание «нет, мы ща возьмём всё сделаем правильно, а то аноним на лоре с наших строк смеётся» просто похоронило py2. У людей было слишком много власти, они могли делать то, что решили нужным, они приняли политику «сломать всё нахрен».

И, естественно, я их после этого не одобряю, мягко говоря. Потому что они забрали идеальный для меня инструмент, выдав взамен «такое же, но другое». Что значит «внатуре не понимает», как это относится к вопросу, что я должен не понимать? Хоть один вообще посмотрел про что и о чём я пишу? Нахрена вы мне все байты свои суёте, вместо байтов мог быть любой другой пример. Самое тупое, что я написал одно, вообще не связанное с программированием, а только с политикой, а мне каждый второй лоровец с какой-то радости начинает рассказывать про программирование. Мне неинтересно программирование. Поэтому py2 был именно для меня.

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

Речь о том, что если убрать b' спереди и ' сзади, то будет ровно та строка, какую я хотел. Он не знал о кодировках, но выдал ровно то, что нужно. Тот же текст. Без знания о кодировках. Но он как-то догадался, что я хотел.

В py2 так и было - можешь что-то выдать, выдай, не можешь - падай. И уж точно никто не добавлял никакие b" в результативную строку.

Короче опять эти байты по кругу, настолько уже неинтересно. Как я жалею, что исходный пост запостил...

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

Строкобайты это очень удобно

еще один…

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

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

Как я жалею, что исходный пост запостил…

Ещё бы страниц семь-восемь и ты начал бы догадываться, что был не прав. Но кровавая модерастия этого не допустит.

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

Пароль выложи

Зачем? Уровень местного контингента я примерно понял. Чёт я думал, что он повыше, раз этак в 10, но тут триггерное мышление, увидели знакомое и дальше только на рефлексах, какие тут дискуссии, рассуждения и прочее. Пофигу, если честно, это уже не моя проблема.

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

Зачем

«Выложи пароль» – это эвфемизм.
Значение слова «эвфемизм» ты можешь посмотреть в словаре.

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

Ещё бы страниц семь-восемь и ты начал бы догадываться, что был не прав.

КАК? ВОТ ЧИСТО ТЕОРЕТИЧЕСКИ, КАК? Как я могу быть не прав в оценочном суждении «мне не нравятся те, за то, что они сделали то?».

Это как? Это моя личная оценка.

- Мне не нравится Вася
- Ты не прав

???

Ну блин люди же, ходят, какой-то минимальной логикой должны обладать. У людей какой-то комплекс «надо быть вечно правым», что ли развился? Если тут теоретически кто-то не может быть прав или не прав, кому-то НРАВИТСЯ, кому-то НЕ НРАВИТСЯ, кому-то СИЛЬНО НЕ НРАВИТСЯ?

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

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

Нет, все нужно обязательно оставить. Это отличная ЛОРовская тема.

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

Ну? для уровня лора развлекуха пойдёт, не спорю. Как раз на местный контингент. Столькими умными словами козырнули. Сами себе чё-то доказали. Ни слова из того, что я сказал, не поняли. В общем, весело посидели, как обычно.

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

«похоронили», «сломали», «убили»

негодование твое понятно.

но «сломали» - это неверное слово здесь.

возможно я не прав, но насколько я понимаю, ломающих изменений не бекпортили в python2.

представь, что эти ломающие совместимость изменения внесли бы ветку python 2.

ты не смог бы обновлять пакет python2 не нарушая работу своих программ столь долгое время.

вместо этого, всё это внесли в python 3, а python 2 существовал еще лет 10 и твои программы работали.

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

Я бы хотел, чтобы python2 оставался, он чёткий. И чтобы не ломали непонятно даже в чего даже в неочевидных (лично для меня) случаях. Слишком много «правильности» в python3 добавили, дух python пропал.

Это чисто политический вопрос, как и куда надо было двигаться. Раз решили так, то дальнейшее было неизбежно. Но иногда вдруг попадётся что-то, что ты легко и просто делал в py2, а в py3 такие вольности не допускается, что невольно возникает вопрос «а какого ....». Хотя после этого топика лучше вопросам не возникать, лучше молча в уголке - уж больно много развелось сторонников «единственно правильного» мнения.

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

ты не совсем понимаешь про str().

убрать b’ спереди и ’ сзади, то будет ровно та строка, какую я хотел.

он как-то догадался, что я хотел.

но саму-то строку он распознал

раскодировал внутри своей str-шной сущности строку, ты туда b" добавляешь

str() ничего не «догадался» и не «распознал», там ничего такого нет вообще. это у тебя сложилась иллюзия.

str() зовет b.__str__(), который имеет целью соорудить описание этого буфера. можно было бы это описать как угодно, например октеты в десятичном виде через запятую, например 255,255,255,255.. но используется нотация та же, что для литералов байт.

одно из свойств этой нотации, что некоторые октеты допускается указывать как hex эскейпом, так и буквой по ascii.

разумеется, может существовать bytes, все октеты которого можно записать буквой.

посмотри еще раз Python 3.13 (комментарий)

вот дополнительный пример

>>> b'\x4c\x49NUX' == b'LI\x4e\x55\x58'
True
>>> b'LINUX' == b'\x4c\x49\x4e\x55\x58'
True
asdpm
()
Ответ на: комментарий от alt-tab-let

ну, приблизительно наверное я понял тебя, в питоне 3 строкобайтов нет, и питон 2 был более ламповый вообще

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

ты не совсем понимаешь про str().

Я понимаю про str. Я про то, что поведение изменили по сравнению с py2 там, где это было совсем не нужно (str не единственный пример). Про это предыдущие 300 страниц этого треда. Давай не пойдём на 400ю. Py2 умер, и его уже не вернуть. Помянем. Про то, как и что решить, я упомянул во втором, наверное, своём посте, я вообще не про str писал, зачем мне снова про него слушать.

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

ну, приблизительно наверное я понял тебя, в питоне 3 строкобайтов нет, и питон 2 был более ламповый вообще

Ну да. Я знаю, что в наборе байт лежит точно строка, легитимная utf-8 строка, легитимная ascii строка, и я точно это знаю, я мамой клянусь. Py2 позволял проделывать классные вещи минимумом кода, а в py3 тебе придётся проводить лишние манипуляции. Естественно для меня py2 выигрывает.

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

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

#!/usr/bin/env python
import argparse
import io
import re
import sys
import threading
import urllib.parse
from concurrent.futures import ThreadPoolExecutor, as_completed
from functools import partial
from itertools import cycle

import bs4
import requests

INFO_RE = re.compile(r"^/banking_sector/credit/coinfo/\?id=\d+$")
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"

print_err = partial(print, file=sys.stderr)

_lock = threading.Lock()


def fetch_urls(url: str) -> set[str]:
    r = requests.get(url, headers={"User-Agent": USER_AGENT})
    soup = bs4.BeautifulSoup(r.text, "lxml")
    urls = set()
    for link in soup.find_all("a", href=INFO_RE):
        urls.add(urllib.parse.urljoin(r.url, link["href"]))
    return urls


def parse_url(session: requests.Session, url: str, seen: set[str]) -> set[str]:
    with _lock:
        print_err("Parse url", url)

    r = session.get(url)
    soup = bs4.BeautifulSoup(r.text, "lxml")
    links = {link["href"] for link in soup.find_all("a", class_="tab")}

    with _lock:
        try:
            return links - seen
        finally:
            seen.update(links)


def upload_results(buf: io.StringIO) -> str:
    response = requests.post(
        "https://0x0.st",
        files={"file": ("urls.txt", buf.getvalue())},
    )
    return response.text


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("-w", "--workers", type=int, default=10)
    args = parser.parse_args()

    initial_url = "https://www.cbr.ru/banking_sector/credit/FullCoList/"
    urls = fetch_urls(initial_url)
    print_err("Found urls:", len(urls))

    sessions = [requests.Session() for _ in range(args.workers)]
    for session in sessions:
        session.headers.update({"User-Agent": USER_AGENT})

    buf = io.StringIO()
    seen = set()

    with ThreadPoolExecutor(args.workers) as pool:
        futures = []
        for session, url in zip(cycle(sessions), urls):
            futures.append(pool.submit(parse_url, session, url, seen))

        for future in as_completed(futures):
            for link in future.result():
                buf.write(link + "\n")

    download_link = upload_results(buf)
    print(download_link)


if __name__ == "__main__":
    main()
rtxtxtrx
()
Ответ на: комментарий от rtxtxtrx

Покажи свой код. Я тебе покажу как правильно (или кто-нибудь покажет)

В том то и дело, что мне не надо правильно. В py2 была магия, я его вообще не учил, я просто предполагал, что вот так вот будет вот так и вот так, и оно само получалось, никакого многословие, появилась идея и фигак она сразу же работает. :) Иногда даже возможность сравнивания букв с цифрами позволяла экономить несколько строк кода, ибо ты избавлялся от ненужных проверок в частных случаев. Грязно, но классно.

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

но в PHP из коробки есть mbstring для работы с юникодом

Да, пхп - это канонический пример боли и страдания, а отсутствие строкового типа приводит к необходимости использования функций с префиксом mb_, где для того чтобы узнать длину строки нужно все ее распарсить вместо того чтобы получить еЁ из полЯ структуры

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

Перепиши мой код (write-only код, который я родил 20 минут назад чтобы стянуть с сайта ЦБ РФ список кредитных организаций и который недостежим для экспертов по многопоточности) выше на питон 2 и сравни насколько он «элегантнее» троечки. Мне кажется, что будет портянка раза в два больше при условии, что lxml и requests еще работают под двойкой (последний должен)… Может тогда поймешь как ошибаешься с глупыми заявлениями о преимуществе привета из конца нулевых

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

изучи сначала азы многопоточности:

  • что такое access atomicity, memory model, happens-before, memory visibility и пр.;

  • освой стандартные примитивы синхронизации (локи, рлоки, барьеры, count down latch, семафоры);

  • научись корректной работе с condition vairiables;

  • напиши хоть немного многопоточных программ

и только потом придешь и пояснишь за свой «атомарный += инкремент» в питоне (которого нет, но который якобы есть за счет GIL) и всю остальную пургу которую ты успел наболтать типа: «нам не нужны блокировки у нас же гил», «асинк решает проблему гил», «гил в питоне нужен, чтобы мы не могли одновременно записывать в глобальные переменные», «гил в питоне нужен, чтобы были атомарные операции в языке»

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

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