Главная Каталог Трекер NSFW Настройки

Программирование

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 535 58 127
Питон тред №135 Аноним 16/01/22 Вск 19:11:46 2266995 1
pylogo-01-16.jpg 36Кб, 416x416
416x416
guido-34.png 288Кб, 514x515
514x515
Тред, посвящённый языку программирования Питон, #135

Предыдущий: >>2248924 (OP)
Литература:
https://ln2.sync.com/dl/cf2c1d070#xq4s328t-xbbjys2z-9r6j7ss7-gf4e9dv6 <-- Книжки, новое собрание
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem

Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить
https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться

#######################################

ЧаВо: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat Актуальность примерно 2015 года

Вопросы-ответы:
— А стоит ли читать Лутца, том номер N?
Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.

— Стоит ли читать %книга_нейм%, если там питон версии 2.х?
Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х

— А что ещё можно читать?
Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html

— Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0

— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4

— А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.

— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)

— Можно ли на питоне делать мобильные приложения?
Да, смотри на фреймворк Kivy https://en.wikipedia.org/wiki/Kivy_(framework) https://kivy.readthedocs.io но народ на него жалуется

— Как можно без лишней возни ускорить программу на питоне
1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь.
2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.

— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём
Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.

ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником.
Исходник: https://dumpz.org/bASGKD8cCFDf
Аноним 16/01/22 Вск 19:48:27 2267035 2
image.png 7Кб, 593x76
593x76
почему так? флаш тот же результат дает
Аноним 16/01/22 Вск 19:53:27 2267040 3
>>2267035
Как так?
Аргументы принт вычисляются перед вызовом, врайт отрабатыват и возвращает свой результат, потом отрабатывает принт.
Аноним 16/01/22 Вск 20:13:16 2267066 4
В асинкопитоне есть приоритизация задач эвент лупа из коробки? Или хотя бы либа, которая упрощает это. Есть группа тасок одна из которых должна выполняться только когда остальные ждут/завершены. Пока сделал костыль через PriorityQueue, но он мне не нравится.
Аноним 16/01/22 Вск 20:50:25 2267090 5
>>2267066
Раздели их и всё. Группу делай в асинхронном режиме, а после неё синхронный. В conqurrent можно это обернуть без необходимости делать омерзительные асинхронные методы:
ex1=execute(task1, args)
ex2=execute(task2, args)
task3(args, ex1.ready())
Аноним 16/01/22 Вск 20:53:12 2267091 6
>>2267035
У тебя выполняется стдаут на этапе загрузки параметров в принт и даёт какой-то результат.
Ничего удивительного тут нет
Аноним 16/01/22 Вск 21:03:04 2267105 7
image.png 74Кб, 698x305
698x305
двач, поясни пожалуйста за super()
насколько я понял, он проксирует запросы к базовому классу, который определяется в порядке mro. если вызвать super() без аргументов, то это будет эквивалентно super(MyClass, self), и запросы к базовому классу буду проксироваться через self, т.е. в __init__, напиример, явно не нужно будет передавать self. На этом этапе все понятно, проблемы с пониманием у меня начинаются в тот момент, когда в качестве второго аргумента передается не объект, а тип.
Пример: если я переопределяю __new__, то в конце обычно пишут что то типо return super(MyClass, cls).__new__(cls, args, *kwargs)
Так вот, почему обязательно нужно указывать cls в качестве первого аргумента? Разве не должно произойти проксирование от лица cls, как в примере с __init__?
на пике аналогия с методом класса, и там это работает, как ожидается
получается __new__ -- не метод класса?
Аноним 16/01/22 Вск 21:13:20 2267121 8
Обзмеился
Аноним 16/01/22 Вск 21:30:51 2267138 9
>>2267090
У меня потребности немного другие, в твоем случае таска 3 не начнется до тех пор пока не завершится первая. Распишу подробнее.
Условно, есть бесконечная таска-продюсер, которая генерирует некоторые значения и кладет их в массив до тех пор пока он не будет заполнен (в моем случае это asyncio.Queue и наполняется оно через await queue.put) и есть таски-консумеры, которые берут значения через await queue.get.
В группу тасок консумеров могут в любой момент добавится еще в любом количестве. Важно, что бы если в массиве есть значения, а консумеры еще не закончились ни в коем случае не запускать таску продюсер (только в случае, если массив опустел, а консюмеры остались), так как она работает гораздо медленнее и соответственно для этого мне и нужны были приоритеты, что бы продюсер запускался только в момент простоев и опустощения массива.
Аноним 16/01/22 Вск 22:21:30 2267181 10
Чуваки,всем чая,пирогов итд.Вопрос к тем кто уже работает разрабом.Кто как учился,как попали на работу.Учили в универе,учились сами или на курсах?Какие проекты делали для резюме итд.Просто взял себе курсы,вроде как неплохие(не жидбрейнс и израэльбокс) и вот думаю мб все таки пытаться самому.
Аноним 16/01/22 Вск 22:31:28 2267192 11
>>2267105
new это статический метод, который именно создает новый объект, поэтому нужен тип. А init уже настраивает этот созданный в new объект, поэтому он уже знает, что это за класс.
Аноним 17/01/22 Пнд 00:26:04 2267302 12
>>2267192
да, это я в курсе, просто не очевидно было, что new это статический метод
Аноним 17/01/22 Пнд 00:28:54 2267304 13
Аноним 17/01/22 Пнд 01:53:08 2267343 14
>>2267138
Тут приоритеты не помогут. Нужны примитивы синхронизации. Тебе нужна третья синхронная? таска, контроллер, которая будет периодически (или может после каждой таски из обеих групп, но тогда это проще декоратором сделать, а не новой таской) запускаться, проверять выполнено ли условие (первая группа тасок завершило выполнение) и менять глобальный лок. Потом в зависимости от значения глобального лока вызывать таски одной из двух групп. Можно просто на все таски кастомный декоратор, который выполняет её только при определёном значении лока, а меняет значение лока только таска контролер. Вместо лока можно кондишионал вариэйбал использовать как>>2267304 этот анон посоветовал. Возможно так даже поконсистентней будет.
Аноним 17/01/22 Пнд 01:57:15 2267346 15
А у вас на работе тайпхинты использую?
Аноним 17/01/22 Пнд 03:48:40 2267361 16
>>2267343
>>2267304
Я решил еще попробовать тупо в лоб решить без всякого тюнинга просто создавая задачи через create_task внезапно оказалось, что таски выполяются в том порядке, что я и хочу, лишнего вызова генерации посреди сбора данных не происходит, все последовательно. Пошел курить статьи по работе эвентлупа.
Аноним 17/01/22 Пнд 09:38:23 2267433 17
>>2267181
Мехатронщик. Сам учил в пассивном режиме, т.к лет 10 так или иначе кодил что-то, алгоритмы разной степени сложности, логику плк.
На резюме просили делать простые серваки, микросервисы, генерация токенов, менедж файлов, пикч и тд.

Если до этого вообще не связывался с информатикой, то наверное лучше курсы.
Аноним 17/01/22 Пнд 09:40:23 2267435 18
>>2267433
Нашёл работу через месяца два примерно, т.к с вебом вообще не знаком был
Flask vs Quart (Будущее за асинхронностью) Аноним 17/01/22 Пнд 09:57:11 2267453 19
Вот вы мне скажите, во всех туториалах, книгах, иных источниках информации (по крайней мере тех что я читал) для создания микроприложений (API, microblog) используется Flask или, упаси боже, Django, но нахуя!? Они же не поддерживают асинхронность (я знаю что Django поддерживает, но для выбранных задач это как из пушки по воробьям), я понимаю что так видетели проще, но зачем заранее учить новичков плохому? Flask конечно хорош, но при расширении с ним всё будет виснуть, так скажите мне, прогромисты 300$/наносек. Нахуя!? Где альтернативы синхронным микро-фраймворкам!? (Прошу прощения за плохую орфографию, слегка пьян.)
Аноним 17/01/22 Пнд 09:59:20 2267455 20
>>2267453
Мне кажется сначала лучше понять REST, нежели и REST и асинхронность сразу. А если новичок не знает ещё чего-то, например работу с БД, ORM, то ещё больше информации новой приходится узнавать
Аноним 17/01/22 Пнд 10:04:20 2267460 21
>>2267455
Я понимаю, образование (буду его так называть) должно быть простым, но не в ущерб качеству будущих продуктов, REST понять можно за пару часов на всем известном сайте (https://www.restapitutorial.com/), тем более, разве не движок важнее всего? Скорость принятия и обработки запросов является чуть-ли не основополагающей проблемой при работе с большим кол-вом запросов (>10к/s к примеру), а сейчас заказчики просят чуть-ли не 80к/сек, для проектов стоимостью меньше 20к!
Аноним 17/01/22 Пнд 10:08:11 2267462 22
>>2267453
Пиздос, а до моды на асинхронность, которой от силы лет десять, как люди жили вообще? По домофону сайты грузили, сука.
Аноним 17/01/22 Пнд 10:11:07 2267465 23
>>2267462
Лет 10 назад запросы были меньше, по части скорости и кол-ву, так сказать что невидимо невооруженому взгяду - то асинхронно (Делитанское дерьмо, знаю, но звучит прикольно)
Аноним 17/01/22 Пнд 10:16:57 2267472 24
>>2267465
Точно так же решалось, как и сейчас - балансировкой нагрузки.
Аноним 17/01/22 Пнд 10:20:43 2267474 25
>>2267472
Разве не выгодней сразу сделать приложение, которое способно выдерживать большие нагрузки, чтобы не тратиться на создание инстансов на других серверах, чем создать вроде-как простое приложение, но не способное выдерживать большие нагрузки?
Аноним 17/01/22 Пнд 10:22:31 2267476 26
>>2267474
В разумных пределах, если это не мешает работе. Про вред преждевременной оптимизации почекай как-нибудь статейки или еще чего.
Аноним 17/01/22 Пнд 10:24:35 2267478 27
>>2267476
Разве автоматическое задумывание на будущее является чем то плохим? (Я понял про разумные пределы, я имею ввиду про некое злоупотребление)
Аноним 17/01/22 Пнд 11:20:48 2267530 28
>>2266995 (OP)
>2022 год
>использовать синхронные драйверы для коннекта в БД
Вы че, пистонисты бля, совсем гавном зажрались уже?
Аноним 17/01/22 Пнд 12:04:56 2267586 29
>>2267453
Сейчас все асинхронные фреймворки по сути напоминают тот же фласк
Аноним 17/01/22 Пнд 12:47:50 2267619 30
Существуют ли в джанго шаблоны и пилят их вообще? Например, как в dle. Чтобы просто поставить, накатить шаблон и уже готовый сайт. Или надо типо скопировать шаблон, расставить все в шаблонизаторе.
Аноним 17/01/22 Пнд 13:03:41 2267646 31
>>2267453
Если приложение получит пользу в производительности от перехода с синхроного на асинхроный формат, то это значит, что там слишком много ио операций и оно так же получит прирост перфоманса от увелечения количества тредов. В гуникорне можно просто задать оверкомит 8 тредов процесс и по одному процессу на ядро процессора. Плюс буферизация и распределение нагрузки в энджинксе если есть долгие и быстрые запросы. И на очень долгих селари. Этого достаточно чтобы код поддерживал тысячи запросов в секунду на одном инстансе. Причём на малом количестве запросов в несколько сотен например такой код быдет быстрее асинхроного т.к. не надо на каждый чих контекст в ивентлупе менять. С большим количеством запросов этот вариант не справиться, а асинхроный переварит ценой понижения перфоманса. В этом похоже и трейдоф. Хочешь быстро приложение делай синхроно. Хочешь чтобы паралельно много юзеров на одном инстансе сервилось делай асинхроно. Это уже вопрос экономии. А на инстансах нет особого смысла экономить тогда месяц аренды одного инстанса стоит как час работы одного спеца по асинхронщине. Поэтому видимо бизнес и не спешит переходить на асинхроные фреймворки
Аноним 17/01/22 Пнд 13:07:44 2267651 32
>>2267646
Как же ты филигранно размотал этого маленыша...
Аноним 17/01/22 Пнд 14:20:58 2267733 33
Сижу компилирую cpython, какие подводные камни?
Аноним 17/01/22 Пнд 14:45:08 2267774 34
>>2267733
>какие подводные камни?
Тебе это рили нужно или просто на хайпе?
Аноним 17/01/22 Пнд 14:47:02 2267776 35
>>2267646
>Причём на малом количестве запросов в несколько сотен например такой код быдет быстрее асинхроного т.к. не надо на каждый чих контекст в ивентлупе менять
Нужно всего лишь менять тред каждые 100 мс вне зависимости от того, есть ли в нем выполняемая нагрузка или нет. Соответственно, если у тебя висит 20 тредов, а задача только в половине, то процесс будет замедлен в два раза просто из-за необходимости ожидания. Треды для IO можно использовать только в языках где поддерживаются нормальные треды, а не GIL.
Аноним 17/01/22 Пнд 14:51:20 2267781 36
>>2267776
Чуть обосрался, не 100мс, а нс, но сути не меняет
Аноним 17/01/22 Пнд 15:20:13 2267810 37
>>2267776
АРЯЯЯ ДИДЫ ТАК ДЕЛАЛИ И НАМ ЗАВЕЩАЛИ! ЯСНО??
Аноним 17/01/22 Пнд 15:22:46 2267819 38
>>2267776
питон при работе с каждым новым питонобджект отпускает гил. А ещё при созвании сокета в входа в сишную библиотеку. Поэтому питон релизик гил достаточно часто чтобы скедулер ос за одну милисекунду успел пройтись по всем тредам несколько раз. Плюс в фласке более 90 процентов времени тред ждёт. Поэтому процесс питона почти всегда будет выполнять тред, который не ожидает ио. Тут главное не создавать лишних тредов чтобы вечное переключение контекста его не стало замедлять. 8 в процессе эмпирически выглядит хорошо. Но тут надо подгонять под каждый проект.
Аноним 17/01/22 Пнд 15:45:53 2267845 39
>>2267774
Хачю кейворды поменять
Аноним 17/01/22 Пнд 16:02:53 2267871 40
>>2267819
>Поэтому питон релизик гил достаточно часто чтобы скедулер ос за одну милисекунду успел пройтись по всем тредам несколько раз.
В любом случае, переключение треда гораздо дороже, чем таски в эвентлупе

>8 в процессе эмпирически выглядит хорошо. Но тут надо подгонять под каждый проект.
Только если у тебя нет походов на сторонние сервисы/в сеть, а сам инстанс ходит только в базу/память без тяжелых запросов. Иначе треды запнутся о 100 мс задержку на стороннее апи и приложение сдохнет без заливания дополнительными инстансами. В мелких проектах норм, но на чем-то большем начнут приходить неприятные счета за железо.
Аноним 17/01/22 Пнд 16:05:04 2267874 41
Что обычно питонят начинающие питухоноводы?
Аноним 17/01/22 Пнд 16:34:04 2267914 42
>>2267871
>В любом случае, переключение треда гораздо дороже, чем таски в эвентлупе
Да дороже. Но таски в ивентлупе переключаются чаще. 2 таск на 80 процентов состоящие из ио ожидания по 50 мс в двух тредах законачаться примерно через 50 мс, а в ивентлупе примерно за 60 мс. То есть выполняя простую операцию в треде тебе не нужно прерывать его каждый раз когда авэйт вызвается чтобы переключиться на другую таску. Там неявно вызывается релиз гила, но такой же релиз и в тасках с ивентлупом происходит. Так что ивентлуп помогает обслуживать больше одновременных запросов на том же железе за счёт небольшого увеличиния его времени выполнения.

>Только если у тебя нет походов на сторонние сервисы/в сеть, а сам инстанс ходит только в базу/память без тяжелых запросов.
Нет. Это неправда. Гил релизится на открытие сокета. То есть выполняя 2 запроса к внешнему апи в двух разных тредах по 100 мс они оба после открытия сокетов отпустят гил и выполнятся за 100 мс. Тут нет просадки пока не делаешь сотни запросов на один реквест. Но даже для этого есть оптимизация не требующая явного переписывания кода проекта на асинхроный мод.

> В мелких проектах норм, но на чем-то большем начнут приходить неприятные счета за железо.
Нет. В больших тоже годится. Вот возьми время ответа 40-50 мс. Это без учёта времени пинга и работы энджинкса т.к. они не влияют на работу треда. Это только время окупации треда. Если там время дольше, то таску можно перенаправить в селарии, доставаться значения из кэша вместо явного вызова каждый раз или как-нибудь ещё оптимизировать и тогда время станет снова 40-50 мс. И возьмём средний такой инстанс на 8 цп с 8 тредами на процесс за 20 центов в час. Это где-то 150 долларов на 1500 запросов в секунду. 10 запросов в секунду за каждый доллар. Для маленьких приложений это норм цена т.к. пока цена 5к доларов не привысит (зп одного разраба) можно не заморачиваться оптимизацией и скэйлить. А это 50к запросов в секунду. Потом уже можно заняться оптимизацией эндпоинтов, тюнингом параметров и править архитектуру клауда чтобы при тех же расходах держать в нескольк раз больше запросов в секунду. Так можно 100-200 тысяч запросов в секунду выдать почти не тратясь на облако при эффективности 20-40 запросов в секунду. Если прям очень надо выдать эффективности в сотню и больше запросов в секунду на доллар, то пора вводить асинхронность. И то в таком случае лучше вынести кретический функционал в микросервисы и переписать их на го ля большего выхлопа, чем поддерживать одновремено фласк и фастапи какой-нибудь. И вот тогда может и будет проект поддерживать сотни тысяч запросов в секунду на кластере ценой в пару десятков тысяч долларов. Но там вылазят проблемы другого масштаба и просто асинхроность тут не достаточно. Всякие фастапи полезны когда поднимаешь всего 3 инстанса (балансировщик, основной и резервный серверы) и хочешь как можно скорее новый код в продакшен и чтобы он справлялся с тысячами пришедших пользователей одновремено ценой скорости работы.
Аноним 17/01/22 Пнд 17:09:53 2267948 43
Если мы сделаем с Джанго-моделью вот это:

avatar.status = 'ready'
avatar.status = 'pending'
avatar.save()

То на моменте вызова save мы отправим 1 запрос (последний) или отправим несколько запросов на UPDATE поля status?
Аноним 17/01/22 Пнд 17:19:46 2267961 44
>>2267914
>То есть выполняя 2 запроса к внешнему апи в двух разных тредах по 100 мс они оба после открытия сокетов отпустят гил и выполнятся за 100 мс.
Это только работает только во время инициализации запроса, если при следующем переключении он будет продолжать ожидать, то там потребуется те же 100 нс без полезной нагрузки.

>то таску можно перенаправить в селарии
То есть использовать сторонний таск менеджер и получить дополнительный расход на загрузку и выгрузку задачи по которой ответ придет в течении 100-200 мс. Причем паралеллизм достигается за счет закидывания процессами, которые имеют такие же ограничения. Да и целом, речь шла о мультитрединге против асинхронности, процессы подключить и к асинхронному коду можно.

>доставаться значения из кэша вместо явного вызова каждый раз или как-нибудь ещё оптимизировать и тогда время станет снова 40-50 мс
>как-нибудь
А если никак-нибудь? Запросы не выдают один и тот же результат и поэтому их нельзя закешировать. Любая интеграция с крупным продуктом скорее всего породит такие проблемы.

>Вот возьми время ответа 40-50 мс
Нет, не возьму, даже запрос гугловой статики размазанной по куче CDN размером 1кб с главной страницы занимает 50 секунд и это без полезной нагрузки. У нас до главного поставщика данных запрос идет 300 мс, соответветственно дальнейшие расчеты можно не смотреть.
Аноним 17/01/22 Пнд 17:22:11 2267962 45
>>2267961
>занимает 50 милисекунд
фикс
Аноним 17/01/22 Пнд 17:28:55 2267964 46
>>2267619
ап

Еще тоже такой вопрос. Есть вообще цмски на питоне похожие на дле где есть многое из коробки, например, шаблоны.
Аноним 17/01/22 Пнд 18:15:29 2268022 47
>>2267948
Отправится только один запрос UPDATE (при выполнении строки с save).
Аноним 17/01/22 Пнд 18:27:16 2268041 48
Аноним 17/01/22 Пнд 18:39:55 2268057 49
>>2268041
Я знаю об этой цмске, там есть шаблоны, комунити пилит шабы или нет? А то придется вручную расставлять в шаблонизаторе.
Аноним 17/01/22 Пнд 18:45:53 2268064 50
>>2268057
Комунити, проект то опен сорсный
Аноним 17/01/22 Пнд 20:52:55 2268216 51
Интересует подход к реализации бекэнда.

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

Независимые методы, но громоздкая бизнес логика. Или же специальные методы, но простая бизнес логика.
Какой подход обычно вы используете и какой считаете оптимальным?
Только не утопическая золотая середина.
Аноним 17/01/22 Пнд 21:59:45 2268292 52
>>2267914
>10 запросов в секунду за каждый доллар
Ещё трафик надо добавить, 10 запросов в секунду это 250 миллионов запросов в месяц, от 50 до 1000 гигабайт трафика. Тариф там что-то около 10 центов за гигабайт, соответственно к этому доллару надо добавить ещё 5-100. Зависит от тажеловесности запроса.
Аноним 17/01/22 Пнд 22:07:17 2268298 53
>>2267914
Неохота вникать, но не понимаю, в чём проблема с использованием асинхронности.

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

Поэтому всё работает очень быстро. И ресурсы потребляются небольшие.

Один процесс питона спокойно может обслуживать тысячи одновременных соединений. При условии, что там данных немного, конечно, что один процесс в принципе такой объём данных может обработать.

Сейчас при работе с сетью использовать треды в питоне в принципе несерьёзно, только asyncio и всё, без вариантов.
Аноним 17/01/22 Пнд 22:10:48 2268302 54
>>2268298
А если задачи последовательны и каждый этап зависит от предыдущей?
Вообще любой вызов сервера это в большинстве случаев именно последовательные задачи.
Если один вызов делает кучу разных независимых задач, то может лучше их разбить на несколько, а не делать всё в один клик?
Асинхронность нужна на фронте. В беке она нахуй не упёрлась.
Аноним 17/01/22 Пнд 23:01:03 2268353 55
>>2268302
>А если задачи последовательны и каждый этап зависит от предыдущей?
>Вообще любой вызов сервера это в большинстве случаев именно последовательные задачи.

И что? IO там меньше не становится, суть не в том, что бы обслужить не один, а множество запросов.
Аноним 17/01/22 Пнд 23:17:22 2268375 56
Избранное
Аноним 17/01/22 Пнд 23:36:59 2268401 57
>>2268302
Асинхронность и синхронность - это тупо разные стеки. Разные модули, функции, разная работа с ними.

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

Сложно асинхронность с gui стыковать.

Аноним 17/01/22 Пнд 23:40:06 2268403 58
>>2268401
> Сложно асинхронность с gui стыковать.
С чего бы? Там изначально ивент луп, а если хочешь, чтобы оно не фризилось на тяжелых операциях, то надо хуярить треды или асинхронщину. Так что никто синхронно и не пишет.
Аноним 17/01/22 Пнд 23:44:23 2268408 59
>>2268403
Асинхронность в питоне это asyncio. Гуи в основном асинкио не поддерживают, они на базе тредов. И тебе придётся какой-то геморой пройти, запускать asyncio event loop в отдельном треде, потом организоыввать обмен данными между разными тредами и т.п. В общем не очевидно там всё.
Аноним 17/01/22 Пнд 23:47:16 2268414 60
>>2268408
Ну я в целом про гуи, а не про питон.
На питоне писать гуи это в любом случае изврат.
Аноним 18/01/22 Втр 00:30:48 2268438 61
>>2268353
Но ведь это делает сам сервер...
Аноним 18/01/22 Втр 00:32:03 2268440 62
>>2268438
А бизнес логику у тебя тоже nginx делать будет?
Аноним 18/01/22 Втр 00:35:21 2268441 63
>>2268440
В бизнес логике всё линейно. Что же вы там делаете такого, для чего чуть ли не весь код приходится делать асинхронным.
Аноним 18/01/22 Втр 00:35:25 2268442 64
>>2266995 (OP)
Всем привет, уважаемые заклинатели змеи, накачал книг по питону, возник вопрос, с какой стоит начать, какой продолжить? Какие-то может быть лишние?
Изучаем питон Марк Лутц ( и его же карманный справочник)
Аллен Б. Дауни Основы питона. Научитесь думать как программист
Кристиан Майер Однострочники питон
Билл Любанович Простой питон. Современный стиль программирования

На данный момент за плечами курс поколение питон для начинающих и полкурса поколение питон для продвинутых на степике
Аноним 18/01/22 Втр 00:37:38 2268445 65
>>2268441
А если два запроса придет? А три? А тысяча? И везде то поход в базу, то в другой сервис, то на сторонние АПИ
Аноним 18/01/22 Втр 00:43:04 2268451 66
>>2268445
Если придёт два запроса сервер сам создаст инстанс. На сторонние апи можно отправить от силы пару запросов параллельно, таких мест очень мало. Часто следующий запрос зависит от предыдущего.
Если придёт тысяча, есть celery и aws sqs.

Всё ещё не понимаю для каких задач бек нужно делать асинхронным.
Аноним 18/01/22 Втр 00:55:40 2268460 67
>>2268451
>Если придёт два запроса сервер сам создаст инстанс
Это хорошо, если у тебя нагрузка ограничивается двумя запросами одновременно

>celery
Ну то есть для тебя прикрутить многопроцессорную залупу с необходимостью дополнительного брокера и расходами на передачу туда данных это заебись, а воспользоваться нативной функциональностью языка, которая для этого была создана и более оптимально расходует сетевые ресурсы это НИНУЖНА?
Это как юзать сортировку пузырьком и говорить что нахуй этот тимсорт нужен, работает же.
Аноним 18/01/22 Втр 00:56:46 2268462 68
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
Аноним 18/01/22 Втр 00:57:11 2268463 69
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
Аноним 18/01/22 Втр 01:31:21 2268474 70
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
Аноним 18/01/22 Втр 01:59:39 2268483 71
>>2268460
Для асинхронного кода надо переписывать методы и менять логику.
Для celery надо просто закинуть данные в очередь.
Аноним 18/01/22 Втр 02:55:30 2268496 72
>>2267961
Я вернулся и готов продолжать.

>Это только работает только во время инициализации запроса, если при следующем переключении он будет продолжать ожидать, то там потребуется те же 100 нс без полезной нагрузки.
Нет. Обычный запрос во внешний апи это 99 процентов ожидание результата. То есть 2 треда с разнице ну может миллисекунду делает ревест во внешний апи, а потом отдновремено ждут результата. Поэтому такой кейс нормально паралелится тредами.

>То есть использовать сторонний таск менеджер
Таков путь. Ивентлуп или селари всё равно что-то придётся использовать. Без него бэкенд не полноценен.

>получить дополнительный расход на загрузку и выгрузку задачи по которой ответ придет в течении 100-200 мс
Не уверен о чём ты. Особености селари видны на очень долгих запросах. Если обычный запрос справляется за 30мс, то нет смысла ставить селари, а если там какая-нибудь долгая выгрузка объекта из с3 например, которая 200мс работает, то тогда стоит отправить запрос в селари и тред потрати время только на инициализацию таски всего 10мс и сможет следующий реквест хэндлить. Особеность асинхронщины, что этот запрос обрабатывался бы те же 200мс, но при этом несколько раз в одну мс менял бы контекст, переключался бы на другие реквесты, застревал бы в цпу баунд тасках других реквестов и общее время ответа сервера было бы не 200, а 250мс например.

>Да и целом, речь шла о мультитрединге против асинхронности, процессы подключить и к асинхронному коду можно.
Мультитрединг против асинхроности в одном процессе не совсем продакшен кейс. Если у тебя почему-то есть ограничение всего 1 процесс, то тогда для мультитредингу лучше взять джаву, а для асинхроности го и не писать такое приложение на питоне. С точки зрения инженерной эффективности такой случая можно расматривать, но с точки зрения пользы для бизнеса это какая-то крайность

>А если никак-нибудь?
Там перед как-нибудь было или. То есть перенос таски в селари точно поможет. Или могут быть другие более эффиктивные способы. Вынести например эти запросы в микросервис, хотябы с односекундным ттл может и можно кэшировать. То есть варианты оптимизации есть. Но даже если нет, то возвращаешь на такой долгий запрос 202 код и переносишь таску в селари. Это 100 процентов сократит время окупации треда до пары десятков мс.

> У нас до главного поставщика данных запрос идет 300 мс
Это ты время пинга учитываешь. Я говорю про время, котоое тред занят и не может принимать другие реквесты. Время пинга со стороны бэкенда никак не уменьшить. Тот же cdn очень быстро тебе результат отдаст. Файлик у него скорее всего в раме зэкеширован и меньше, чем за одну мс он его вернут. А всё остальное время потратится на передачу данных по сети. Вот как раз синхроность уменьшает время обработки запроса на сервере в том время как асинхроность увеличивает количество рпс. Это основной технический трейдофф. На принятие решения внедрять ли асинхроность ещё может влиять как сложно будет бизнесу переписать имеющейся код и стоит ли результат этого. Плюс если проект пишут с нуля, то могут подумать о ноде или го. Только если уже есть питоновская команда могут начать думать над новым проектом с фастапи. Ну и другие бизнесовые аспекты наверняка есть. Иммено поэтому асинхроность сейчас не такая популярная, но медленно набирает популярность в новых проектах
Аноним 18/01/22 Втр 03:08:51 2268499 73
>>2268292
В обоих режимах трафик на реквест будет одинаковый. Там только количество ресурсов съедаемых реквестом будет разным. То есть если ты за 10 долларов делаешь 100 рпс, то плати ещё долар сверху за трафик, а если 200 рпс, то ещё 2 долара сверху за трафик. Это для примера, но расходы трафика растут линейно с увеличением рпс. Поэтому в метрику рпс на доллар его сложно добавить. Да не надо наверно. типа если у тебя 10к запросов в секунду и ты тратишь Х доларов на трафик, то для синхроного кода тебе нужно 5 вмок, а для асинхроного одна и тоже Х доларов на трафик.
Аноним 18/01/22 Втр 03:23:45 2268501 74
>>2268298
>Неохота вникать, но не понимаю, в чём проблема с использованием асинхронности.
Нет проблемы. Другой анон жаловался, что асинхроность не повнедряли повсюду, а я говорю о низкой рентабельности её внедрения в общем случае.

>Соответствующая таска получит управление только тогда, когда на сокет придут данные.
Не правда. Таска получит контроль только тогда когда другая кооперативная таска отпустит поток выполнения и ивентлуп решит вернуть контроль таске этой таске работающей с сокетом

>И ресурсы потребляются небольшие.
Скорее не потребляются небольшие, а ютилизируются помаксимуму. Небольшое использование ресурсов это скорее про масштабируемости асинхроных сервисов

>Сейчас при работе с сетью использовать треды в питоне в принципе несерьёзно, только asyncio и всё, без вариантов.
Не обязательно. Бывают таски, где надо опрасить несколько сервисов и тогда время её выполнения это время завершения самого долгого реквеста. Асинкио ещё больше увеличит это время за счёт оверхеда если на каждый реквест ещё какой-нибудь парсинг джисона делать надо. Хотя большинству бизнесов наверно всё равно в селари запихнуть эту таску или в ивентлуп. Что проще прямо сейчас реализовать то и сделают
Аноним 18/01/22 Втр 04:35:21 2268505 75
Асинхронные срачи. Мои любимые.
Еще и goвноедов вспомнили, мм
Аноним 18/01/22 Втр 10:30:05 2268622 76
>>2268501
>Не правда. Таска получит контроль только тогда когда другая кооперативная таска отпустит поток выполнения и ивентлуп решит вернуть контроль таске этой таске работающей с сокетом
Переключение задачи возможно только на операции await. Это скорее плюс, тебе почти не нужно думать о race condition, которые в тредах могут возникнуть по любому поводу.

Но, если данные на сокет не пришли, event loop просто не станет переключать управление на твою задачу, а выберет другую. Поэтому ты в одном процессе можешь позволить себе держать тысячи ожидающих данные задач. Оверхед околонулевой.

Асинкио в принципе удобнее, хотя есть проблема с тем, чтобы встроить его в другие фреймворки. Если ты работаешь внутри фреймворка, вроде GUI, которые все сами по себе фреймворки, или джанго, то их стыковать с асинкио может быть тяжело. Но если делаешь что-то с нуля, то проще с асинкио сразу.
Аноним 18/01/22 Втр 10:52:17 2268655 77
>>2268622
>Переключение задачи возможно только на операции await. Это скорее плюс, тебе почти не нужно думать о race condition, которые в тредах могут возникнуть по любому поводу.
Да. Про это и говорю. И рэйсы в асинио возможны.

>Но, если данные на сокет не пришли, event loop просто не станет переключать управление на твою задачу, а выберет другую. Поэтому ты в одном процессе можешь позволить себе держать тысячи ожидающих данные задач. Оверхед околонулевой.
Нет. Ивентлуп ничего не знает про то что ты там выполняешь в таске. У него был вызов авэйта при открытии сокета он и переключился, отправив твою таску с сокетом в очередь с ожидающим стейтом. Когда очередь придёт он начнёт её выполнять. Снова наткнётся на код с чтением сокета, увидет, что чтение не закончилось и снова в очередь. Так пока не закончатся данные литеть (это если тсп сокет). Тут ивентлуп не может волжебным образом узнать что там внутри тасок и когда переключаться. Поэтому он почти рандомно прыгает между авейтами пока не найдёт код, который можно выполнять.

>Асинкио в принципе удобнее, хотя есть проблема с тем, чтобы встроить его в другие фреймворки. Если ты работаешь внутри фреймворка, вроде GUI, которые все сами по себе фреймворки, или джанго, то их стыковать с асинкио может быть тяжело. Но если делаешь что-то с нуля, то проще с асинкио сразу.
Да удобно. Да просто. Но только с инженерной точки зрения и в малых масштабах. Годно оно для пета, внутренней разработке или какого-нибудь легенького скрапера/коннектора/агрегатора/тулзы для автотеста, которые в продакшен не пойдут. А для продакшена: нет инструментов, есть оверхед на частое переключение контекста, на новых проектах работает меньше людей, чем на старых и когда создают новый проект, то не только фреймворк выбирают, но и язык. Поэтому как соискателю шансов нарваться на проект, где это нужно меньше, чем на проект с тредами. А как бизнесу есть тысяча поводов подумать нужно ли что-то делать с асинкио. Отсюда и низкая скорость принятия этой технологии. И никакие рассказы программистов про то, что это волшебство доступное из коробки не помогут
Аноним 18/01/22 Втр 11:50:46 2268720 78
Tornado vs node js кто эффективней?
Аноним 18/01/22 Втр 11:53:24 2268724 79
Аноним 18/01/22 Втр 13:49:53 2268867 80
Аноним 18/01/22 Втр 13:53:19 2268874 81
Аноним 18/01/22 Втр 14:45:19 2268930 82
>>2268655
>Нет. Ивентлуп ничего не знает про то что ты там выполняешь в таске. У него был вызов авэйта при открытии сокета он и переключился, отправив твою таску с сокетом в очередь с ожидающим стейтом. Когда очередь придёт он начнёт её выполнять. Снова наткнётся на код с чтением сокета, увидет, что чтение не закончилось и снова в очередь.
Ты не понимаешь как работает асинкио.
Чтение из сокета использует системный вызов kqueue в линуксе, select в винде. Это системные вызовы уведомляют систему, что пришли данные на сокет. Пока данные не придут, задача будет в idle состоянии и переключения на неё не будет вообще.
За счёт этого и достигается огромный прирост производительности по сравнению с тредами.

Аноним 18/01/22 Втр 14:47:46 2268933 83
>>2268930
> системный вызов kqueue в линуксе
тьфу, kqueue это BSD решение, в линуксе epoll. Но это примерно одно и то же. Смысл именно такой.
Аноним 18/01/22 Втр 15:55:03 2269034 84
>>2268930
>>2268933
Это один из тех методов, которые гивент патчит чтобы автоматические понимать когда должно переключение контекста делаться. В исходниках сипайтона этого нет. Там весь ивентул это гуляние по таскам, которые до этого вызывали елд фром. Не знаю в каких местах там всё в третьем питоне пропатчено. Возможно ивентлуп и не заходит в таски не получившие ничего на ввод, по это точно часть сетевой либы питона, и на сипайтона, а значит переключение контекста на новую таску для этой проверки всё таки происходит, он быстро видит, что нотифаев нет и переключается дальше. Да оптимизация, но проблемы частой смены контекста не решает
Аноним 18/01/22 Втр 16:16:10 2269072 85
image.png 16Кб, 399x317
399x317
Я обязательно вкатотуся.
Аноним 18/01/22 Втр 16:35:09 2269100 86
>>2269034
>Возможно ивентлуп и не заходит в таски не получившие ничего на ввод, по это точно часть сетевой либы питона, и на сипайтона, а значит переключение контекста на новую таску для этой проверки всё таки происходит, он быстро видит, что нотифаев нет и переключается дальше.
Это пофикшено в uvloop, буквально две строчки добавить
Аноним 18/01/22 Втр 16:40:27 2269111 87
>>2269072
Не ищи работу,а создай ее сам
Аноним 18/01/22 Втр 16:41:58 2269112 88
>>2268442
Нам на стажировке сказали Мэтта Харрисона читать. Хз, насколько она норм.
Аноним 18/01/22 Втр 16:43:39 2269115 89
>>2269034
Что ты несёшь?
Работа с сокетом это по-определению только 3-й питон. Без каких-либо патчей использует select-принцип получения данных.

Это есть и в исходниках, и в доках сказано, наконец просто сделай в линуксе strace работающей программы и посмотри на используемые системные вызовы.

Сотню тысяч открытых соединений асинкио держит, я проверял из праздного любопытства. С низкой активностью, конечно. Можешь сам проверить, хотя тут напрячься придётся, чтобы саму систему заставить столько соединений поддерживать на процесс.
Аноним 18/01/22 Втр 16:47:20 2269120 90
>>2269100
Естественно подразумевается, что ты используешь API от asyncio, то есть или через протоколы + loop.create_server/loop.create_connection делаешь, или через asyncio.start_server/asyncio.open_connection

но только так с асинкио и работают.
Аноним 18/01/22 Втр 16:53:33 2269128 91
>>2269115
>Работа с сокетом это по-определению только 3-й питон. Без каких-либо патчей использует select-принцип получения данных.
Гивент на втором питоне тоже пытается неблокающий ио делать. И у него костыльно, но получается. Точно помню, что он патчит этот самый епол и свитчит контекст на этих операциях.

Не знаю как в третьем питоне это сделано. Могу только предпологать на основе того, что знаю. Думал, что так же как и во втором с гивентом, но теперь нативно. Но видимо как-то по-другому

>>2269100
И как там теперь? Просто про бегающий по таскам ивент луп это точно. Прям во внутриностях сипайтона этот алгоритм захардкожен. Что делает ивент луп когда заходит в таску, которая пока не получила ничего в ио? Или он туда по какой-то причине не заходит раньше времени? Объяснишь?

Аноним 18/01/22 Втр 16:57:34 2269135 92
Аноним 18/01/22 Втр 16:58:16 2269137 93
>>2269135
Делай прожект сам для себя и зарабатывай
Аноним 18/01/22 Втр 17:00:16 2269141 94
>>2269137
Просто и без задней мысли?
Дай денег на проект, кста.
Аноним 18/01/22 Втр 17:02:54 2269144 95
Подскажите по pyodbc.
Смотрю коммитов нет нихуя, хотя по доке вызываю коммит на connection.
Погуглил, вот у чела в каменте чисто такая же хуйня
https://stackoverflow.com/questions/20199569/pyodbc-insert-into-sql
> in my case, cnxn( AKA connection) cnxn.commit() did not work, but I user the exact cursor like cursor.commit()
Благодаря ему починил, но какого хуя? Не могу понять почему так.
Аноним 18/01/22 Втр 17:49:11 2269219 96
>>2269128
>Что делает ивент луп когда заходит в таску, которая пока не получила ничего в ио? Или он туда по какой-то причине не заходит раньше времени? Объяснишь?
Он не заходит, таски полностью оборачиваются в epool вызовы
Аноним 18/01/22 Втр 18:41:51 2269308 97
Почему celery пропускает таски? Я отправил 10, а выполнилось 5. При этом они приходят, но просто не выполняются и помечаются как выполненные.
Аноним 18/01/22 Втр 20:05:10 2269374 98
>>2269128
>Гивент на втором питоне тоже пытается неблокающий ио делать.
Я сам когда-то это релазизовывал через модуль select, когда мне во втором питоне надо было с несколькими сокетами одновременно работать, а треды не хотелось.

Но asyncio всё поддерживает из коробки. Там другого способа и нет, по идее.

У тебя планировщик не переключит на другую задачу, пока ты явно через await какой-нибудь future ему это не разрешишь.

При этом более быстрая работа с сетью это low-level протоколы. Где ты у тебя планировщик просто вызывает синхронный метод класса-протокола (asyncio.Protocol, data_received(self, data)), когда у тебя данные приходят. Всё это обёрнуто в epoll/select.
Аноним 18/01/22 Втр 20:55:10 2269419 99
>>2266995 (OP)
Есть список айдишников одной модели: sections_ids
Мне в Джанго нужно обновить поле в каждой Section, айдишник которой лежит в этом списке. Вроде как очевидно можно пройтись циклом вот так:

for section_id in sections_ids:
----section = Section.objects.get(id=section_id)
----section.status = "executing"
----section.save()

Но блин, по факту тут мы будем высирать уйму sql-запросов, по одному на каждую секцию, а ведь в просто SQL я бы просто скинул batch-update и разом обновил все. Как это нормально сделать в Джанге? (сука, такой стек на проекте, ничего не поделать)
Аноним 18/01/22 Втр 21:24:32 2269446 100
Аноны, хелп, я не пишу на питоне и вообще даже не прогер, но нужен результат работы кода. Онлайн компиляторы нихуя не выдают. Может кто запустить и просто заскринить результаты? (по возможности развернуть на весь экран)
код https://ideone.com/SzTV5s
1) Шаг – 50, конец интервала – 5, точность – 0.1
2) Шаг – 100, конец интервала – 5, точность – 0.05
Аноним 18/01/22 Втр 21:43:54 2269486 101
image.png 23Кб, 640x480
640x480
image.png 23Кб, 640x480
640x480
Аноним 18/01/22 Втр 21:49:46 2269498 102
Аноним 18/01/22 Втр 22:24:22 2269556 103
>>2269308
Никто не сталкивался с этим? Уже неделю пытаюсь понять в чём дело. В логах ничего необычного не присходит. Просто не вызывается метод. Даже со включённым ask_late брокер помечает его как выполненный
Аноним 18/01/22 Втр 22:48:31 2269592 104
>>2269556
Ну и да, ещё botocore пишет dripped connection, но и на успешные таски он это пишет.
Ещё я concurencyустановил в 1, но всё равно он делает таски в обход ограничения в 1 секунду. Причём выдача настроена на стороне очереди. Хрень происходит какая-то в общем
Аноним 19/01/22 Срд 02:37:21 2269832 105
https://dumpz.org/am46dWRZtk83
Почему не создается архив?
Через консоль винды нормально работает, а питон шлет нахер.
Дебаггер тут if os.system(rar_command) == 0:показывает что возвращается 1 вместо 0 и собственно пиздец.
Это пример из книжки A Byte of Python, только под rar.
Аноним 19/01/22 Срд 02:57:31 2269846 106
Аноним 19/01/22 Срд 03:00:22 2269847 107
>>2269846
Unknown CVE ID
This site only contains valid CVE entries. Rejected or reserved CVE entries are not included in our database. Please visit http://cve.mitre.org and nvd.nist.gov if you think that the CVE entry is missing in our database.
Аноним 19/01/22 Срд 04:01:08 2269883 108
>>2269847
Так это из-за несовместимости ОС. Нужно установить винду 11 чтобы открыть страницу.
Аноним 19/01/22 Срд 04:08:02 2269886 109
Прошу прощения, тупая шутка.
Судя по описанию комманды os.system(rar_command) она должна написать в консоль текст ошибки, если была ошибка. Нужно прочитать этот текст и понять в чём именно проблема.
Аноним 19/01/22 Срд 04:14:14 2269890 110
image.png 41Кб, 1112x298
1112x298
Посмотрел что значит возвращаемый код 1 для винды. Возможно твоя винда не знает тех комманд, которые ты ней передаёшь через os.system(rar_command).
Попробуй на дебаге посмотреть значение переменной rar_command.
Скопировать дословно и ввести в консоль винды эту команду, чтобы проверить.
Аноним 19/01/22 Срд 04:14:34 2269891 111
image.png 41Кб, 1112x298
1112x298
Посмотрел что значит возвращаемый код 1 для винды. Возможно твоя винда не знает тех комманд, которые ты ней передаёшь через os.system(rar_command).
Попробуй на дебаге посмотреть значение переменной rar_command.
Скопировать дословно и ввести в консоль винды эту команду, чтобы проверить.
Аноним 19/01/22 Срд 10:44:15 2270027 112
>>2266995 (OP)
Привет программач.
Есть одна простенькая бд
И есть модуль, который сохраняет в базу данных строки по столбцам и извлекает их по запросу. Я это реализовал с помощью одних функций (создать базу если её нет, проверить наличие записи в бд, создать запись, обновить запись, удалить запись. Ключ - уникальный id).
И задался вопросом, может это сделать классом? Но так как я туповатый самоучка и с классами пока не работал (только теоретически и на детских примерах), не очень понятно с чего начать. inb4: идти в школу/нахуй/в университет/в гугл

Аноним 19/01/22 Срд 10:56:25 2270040 113
>>2267914
>То есть выполняя простую операцию в треде тебе не нужно прерывать его каждый раз когда авэйт вызвается чтобы переключиться на другую таску
Чаво блять? Если await стоит то он не спроста нахуй, нужно переключить контекст и вытащить результат определенной Future, потому что функция иначе не сможет дальше работать. Если тебе нужно что-то выполнить в бекгрануде то делается сразу несколько "хаков":

asyncio.create_task
loop.call_soon
Future.add_done_callback
asyncio.gather (для одновременного исполнения множества запросов)
Аноним 19/01/22 Срд 11:40:08 2270084 114
>>2268216
>Это будут два отдельным метода, типа сделать запрос и записать в базу
Скорее всего это будет проходить в одном методе, который однако будет дергать 2 других - какие-нибудь ModelService.make_request и ModelRepositary.save_model
Аноним 19/01/22 Срд 11:43:49 2270090 115
>>2268302
>Асинхронность в беке нахуй не упёрлась
Таблетки, дед
Аноним 19/01/22 Срд 12:22:02 2270116 116
>>2268496
>Особеность асинхронщины, что этот запрос обрабатывался бы те же 200мс, но при этом несколько раз в одну мс менял бы контекст
Чел... асинхронка вообще не так работает. Контекст меняется только в момент когда асинхронная таска исполнилась и ивент луп взял ее результат

>го
>для асинхронщины
Чел ты...
https://medium.com/nuances-of-programming/%D0%BA%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D0%B8%D0%B7%D0%BC-%D0%B2-golang-go-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D1%8B-82bae0f92e81
Аноним 19/01/22 Срд 12:38:18 2270127 117
Аноним 19/01/22 Срд 18:50:53 2270601 118
Можно как-то в модуле requests выставить ограничение по количеству запросов на конкретный ресурс? Для всего сервера. Есть сторонняя апи, которая ограничена 7 запросами в секунду блядь.
Типа, если в данный момент идут 10 запросов, то выполняются 6, а остальные ждут пока освободится место.
Аноним 19/01/22 Срд 19:34:54 2270692 119
>>2270601
Покажи код, ты через мультипроцессинг/мультитрединг сделал?
Аноним 19/01/22 Срд 19:36:18 2270696 120
image.png 741Кб, 1280x720
1280x720
>>2270601
Семафоры
Очевидно же
Аноним 19/01/22 Срд 19:53:03 2270729 121
>>2270692
Там говнокод обыкновенный. В некоторых тасках последовательные, в некоторых через futures по максимум 5 одновременных запросов за раз, если надо сделать больше. Асинк не использую, ибо джанго, да и не умею пока. Переписывать на фастапи уже поздно.
Проблема в том, что может получится так, что у меня будут активны много запросов на один и тот же домен. Ладно, если он просто возвращал ответ о превышени лимита, так он ещё в бан отправит нахуй, если я нарушаю частоту несколько раз.

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

Просто я не знаю как это сделать
Аноним 19/01/22 Срд 20:01:55 2270741 122
Как вообще хранить пользователей в джанге, которые вошли через oauth/openid? Хотелось бы конечно использовать стандартную модельку для юзера, но вот чё в эту модельку вместо пароля пихать и как аутентифицировать юзера хз.
Аноним 19/01/22 Срд 20:22:32 2270775 123
>>2270741
В джанге встроенный же это во всё. Указываешь базу и всё
Аноним 19/01/22 Срд 20:31:54 2270787 124
>>2270729
Если тебе лень разбираться, могу предложить в качестве костыля развернуть рядом с твоей аппкой прокси, которое будет обрубать тебе количество запросов.
Аноним 19/01/22 Срд 20:51:11 2270817 125
>>2270787
Это надо делать на домен. Не на все запросы. И таск должен просто подождать, а не кидать ошибку
Аноним 19/01/22 Срд 20:52:26 2270819 126
>>2270775
Так для стандартной аутентификации нужен пароль же, а уменя его по факту нет. Это получается мне свой бек для аутентификации писать?
Аноним 19/01/22 Срд 20:58:29 2270826 127
Сап питонюги.
Я ньюфаг в этом деле, буквально вот-вот начал интересоваться.
Python 3.9 на команду pip instal sha256 очень ругается, не могу понять почему.
В гугле ответ на проблему не смог найти.
Буду рад, если кто пояснит почему такое происходит и как фиксить.
Аноним 19/01/22 Срд 20:59:22 2270828 128
>>2270826
install само собой быстрофикс
Аноним 19/01/22 Срд 21:18:11 2270849 129
>>2270826
Успокой его и он не будет ругаться
Мы как должны понять что у тебя не так? Скидывай трейсбек
Аноним 19/01/22 Срд 21:18:55 2270851 130
>>2270817
В общем, ratelimits позволяет такое провернуть. Осталось понять, как это привязать к домену, а не только к функции
Аноним 20/01/22 Чтв 01:26:26 2271107 131
>>2270851
Штуковина ratelimits подошла хорошо. Тред можно закрывать
Аноним 20/01/22 Чтв 05:00:35 2271137 132
image.png 40Кб, 951x272
951x272
Привет питонисты. У меня вопрос, как у вас многопоточность реализована? Каждый экекутор в этом случае это отдельный OS process, порождённый родительским процессом (python процессом, который исполняет main скрипт?)
Аноним 20/01/22 Чтв 05:05:11 2271139 133
Всмысле та же хуйня что и в джаве. Каждый поток это процесс на уровне операционной системы. И если нужно мчаться кабанчиком, то переключение контекста между потоками ОС становится слишком длинным и вот из-за этой причины нужна всякая асинхронная поеботина? Типа планировщик потоков переносим с уровня ОС на уровень приложения?
Я просто научную работу пишу на эту тему в Берлинском технологическом университете. Никак не могу разобраться.
Аноним 20/01/22 Чтв 09:38:08 2271195 134
>>2270116
Контекст переключается на каждом авейте. Авейт это такой гоуту на глобальную функцию ивентлупа, которая сама решит какую тасочку потом продолжить. А внутри асинхроной либы может быть дохуя вложеных асинк функций с авейтами. и статью твою читать не буду. она на русском. я не говноет таким обмазываться
Аноним 20/01/22 Чтв 09:43:51 2271196 135
>>2270040
то что авейт не спроста не значит что он не несёт оверхед. внутри одной вункции стоит несколько авейтов. потом эту функцию с авейтом вызывают. и так несколько раз внутри всей асинхроной библиотеки. в итоге дохуя цпу времени тратится просто на переключение между контекстом вместо того чтобы тратить его на цпу баунд таски. в итоге с асинхронмы кодом ты не можешь на 100 процентов заюзать цпу полезными тасками. ты заюзаешь его на 90 процентов полезными и на 100 переключением контекста. а в тредах это можно сделать и там скорость выполнения простых тасок выше.
Аноним 20/01/22 Чтв 09:48:31 2271201 136
>>2271139
Нет же. процесы вместо тредов обычно нужны из-за гила. а асинхроность ускоряет ио баунд таски. типа если тебе надо 100 раз по урлам обратиться открыть проще это в одном треде асинхроном сделать, чем для каждого урла создавать тред и тратить ресурсы ядра на эти операции
Аноним 20/01/22 Чтв 12:08:48 2271318 137
>>2271137
У тебя явно написано тредпул
Аноним 20/01/22 Чтв 12:20:09 2271326 138
>>2271196
Переключение тредов тоже требует ресурсов, скорее больше, чем переключение задач в asyncio. Особенно если ты ещё какие-нибудь uvloop добавишь.

Альтернатива асинкио это несколько работающих ПРОЦЕССОВ, и внешний балансировщик, который раздаёт задания процессам. В принципе в большинстве случаев ты запускаешь много процессов, которые обслуживают всю нагрузку. Вместо того, чтобы держать event loop, ты можешь держать достаточно много процессов, с запасом, каждый процесс просто последовательно запросы обслуживает.

Синхронные фреймворки только так и запускают, тебе про треды ничего знать и не надо в этом случае.
Аноним 20/01/22 Чтв 12:33:52 2271340 139
>>2271326
>Переключение тредов тоже требует ресурсов, скорее больше, чем переключение задач в asyncio
Конечно. Но это происходит гораздо реже. То есть если у тебя асинхроная либа и ты парсишь джейсон ответ от сервера, то и персить ты будешь асинхроно т.к. иначе одна таска займёт весь поток и другие не получат время. это смысл кооперативных тасок. поэтому твой парсер джйсона будет работать дольше, чем просто в треде его синхроно запускать. это не учитывая то время когда таска не выполняется потому что исполняется другая. то есть в треде не учитываем время когда другой тред держит гил, а в асинкио не учитываем когда ивентлуп переключился на другую таску. и тогда время потраченное на вычесления в тредах меньше, чем в асинкио

И процессы это не альтернатива. Это абсолютно другой вариант распаралеливания. Он не заменит асинкие
Аноним 20/01/22 Чтв 15:21:19 2271485 140
Почему celery продолжает засовывать все таски в default queue, несмотря на то что я запускаю воркеров с разными очередяни, указал в конфиге какая очередь для какой таски используется и явно указываю очередь при передаче аргументов через apply_assync? В конфиге указал очередь для beat, и всё равно он юзает очередь по умолчанию
Аноним 20/01/22 Чтв 16:06:04 2271530 141
>>2271485
Проблема точно в beat. Обнови его конвиг и рестартни. Ещё можешь ивенты включить и посмотреть кто куда что отправляет
Аноним 20/01/22 Чтв 16:14:08 2271538 142
36313900.jpg 80Кб, 581x604
581x604
Перекатился в бидон и начал забывать перл.
Жалка.
Аноним 20/01/22 Чтв 16:39:47 2271553 143
>>2271530
Самое интересное, что с остальных очередей таски суются в default queue, несмотря на явное указание.
Аноним 20/01/22 Чтв 18:47:02 2271700 144
Как aiopg использовать правильно? В примерах ахуеть какая громадная портянка. Да и создается пул чтоб SELECT 1 сделать.
Аноним 20/01/22 Чтв 21:48:10 2271893 145
>>2271553
Всё решилось указанием очереди в app.task(queue=...) Остальное просто игнорировалось
Аноним 21/01/22 Птн 02:44:27 2272029 146
Ряяя. Поздравьте! Нашел первую первую работку на Питоне!!!

Выбираю стек технологий в новый проект. Подскажите ORM, который бы при UPDATE записи базы данных, если заблокированна, сам дожидался ее разблокирования и выполнял апдейт (прозрачно для программиста).
Аноним 21/01/22 Птн 10:33:47 2272119 147
>>2271196
>в итоге дохуя цпу времени тратится просто на переключение между контекстом
1 мкс?
Шизофреник, ты че несешь? Ты попробуй произвольную синхронную прогу переписать на асинк так чтобы он был исключительно оверхедом, т.к. без IO-операций - по приколу вызывай каждую функцию через await и посмотри на оверхед, он блять не превысит 3%
Аноним 21/01/22 Птн 11:17:16 2272144 148
>>2272029
>Первую работу
>Выбираю стек
Пизда проекту. Не такого орм, который бы дедлок аккуратно доидался. У тебя к хуям сервис умрет
Аноним 21/01/22 Птн 11:23:06 2272145 149
>>2271195
>она на русском я не говноет таким обмазываться
Прозападный пердикс косит под зумерка, спешите видеть
Аноним 21/01/22 Птн 14:09:34 2272282 150
Как согласовывать обновы кода с изменениями базы данных?

Вот есть у меня джанго-приложуха, я в ней меняю схемы БД на удаленном тест-серваке через миграции, затем через какое-то время на этот сервер я заливаю другой код, из более ранее ветки, и там же сцуко схемы БД будут другие из-за чего могут вылезать занятные ошибки на NOT-NULL CONSTRAINT и прочее. Как с таким справляться?
Аноним 21/01/22 Птн 15:41:00 2272359 151
>>2272282
На серве? А локально че делать если я работаю на ветке провел N миграций а потом возвращаюсь к более старой ветке и миграции там не залиты. Как разрабатывать-то?
Аноним 21/01/22 Птн 15:47:02 2272366 152
>>2272282
Проиграл. У тебя есть мастер ветка. В которой хранятся финальные или околофинальные изменения. Делаешь дроп таблицы? Ок. Старая ветка юзает поле, которое дропнуто? Не юзай его, переделывай таску. Если просто конфликт миграций - вливаешь масте в свою ветку, обновляешь миграцию и делаешь её последней.
Аноним 21/01/22 Птн 15:51:20 2272370 153
>>2272366
>вливаешь масте в свою ветку
Шо? Рибейз что ле?
Аноним 21/01/22 Птн 15:56:40 2272379 154
>>2272366
Тут ситуация такая: никакие миграции не конфликтуют, однако при попытке добавить запись в таблицу вылезает NOT NULL CONSTRAINT VIOLATION потому что в новых миграциях была добавлена новая колонка, которая обазательна (а default у нее не проставлен). Очевидно что в старом коде добавление происходит без учета этой колонки. Как его тестить-то блэт?
Аноним 21/01/22 Птн 15:59:08 2272382 155
>>2272119
>1 мкс?
Тут есть нюанс, если у тебя есть операции (например, парсинг/генерация жсона, которой необходимо 20 мс) для выполнения в 2 из 10 тредов, а в остальных ожидание базы/апи/етц, то их скорость снизится в 5 раз, так как каждому треду выделяется равное количество процессорного времени и в рамках 100 мс на треды с полезной нагрузкой будет выделено только 2 * 10 мс. В то время, кооперативная многозадачность позволит решить эту проблему, так как в этом случае трата гпу на неактивные таски не производится.
Аноним 21/01/22 Птн 16:24:08 2272409 156
16325880837930.png 56Кб, 800x800
800x800
С сегодняшнего дня примыкаю к вам, питонистам! Заступил на курс по пайтона, там 4 вебинара, после каждого дают задания. В конце среди тех кто выполнил все Д/З, будут отбирать на оплачиваемую стажировку.

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

Я верю в себя, пацантре! Я стану лучшим на этой стажировке!

мимо 1С-Битрикс middle
Аноним 21/01/22 Птн 16:27:16 2272411 157
>>2272409
Лучше бы книгу почитал, вебинар.
Аноним 21/01/22 Птн 16:29:27 2272413 158
>>2272411
Так это чтобы попасть на стажировку, офк с вебинара почти ноль полезной инфы, плюс у них плеер плохой, когда перетаскиваешь ползунок, то не показывает какая минута видео. А на ютуб отказываются заливать, лол.

Я же сказал
>мурзилка - метанит

Потом мб книги с шапки почитаю.
Аноним 21/01/22 Птн 16:47:12 2272434 159
>>2266995 (OP)
Привет, Питонисты. Реквестирую объяснения на человеческом работы Channels для Джанги 3, почему какие-то вечные sync to Async , че вообще, можно как-то привычные вещи с эвент лупом написать? Как вообще мне asyncio использовать в этой либе? Мне кажется, я не понимаю ее идею именно, для каких целей она создана
Аноним 21/01/22 Птн 16:53:59 2272444 160
>>2272434
Типа почему я не могу перенаправлять роутом запросы TCP/UDP на то место, где я скажем поднял на другом порте что-нибудь асинхронное в своей как бы среде, с asyncio, aiohttp и шлюхами

Тут и постепенное внедрение микросервисов, тут и гибкость, тут и как бы меньше кода, удобнее, почему нет?

Разве что на фронте могут быть проблемы какие-то, но думаю это решаемо

В ту сторону вообще воюю, господа ?
Аноним 21/01/22 Птн 16:58:21 2272448 161
>>2272379
Ну добавь какое-то значение в старый код, если оно обязательно и нет дефолта. Очевидно же.
Аноним 21/01/22 Птн 17:48:51 2272523 162
Челики, подскажите.
В мейне создаются сервисы асинхронные, в зависимости от параметров переданных и запускается
from aiomisc import entrypoint
with entrypoint([list, of, entrypionts] as loop:
____loop.run_forever()
Так же в мейне я хочу инициализировать пул коннектов для бд. Пул создать еще до создания сервисов, бд должна отдать данные для сервисов и из пула брать коннект до остановки сервисов. Я написал получение коннектов, но нужен работающий цикл событий. Как это сделать? Еще один евент луп создавать что ли? Но так, вроде, делать неправильно
Аноним 21/01/22 Птн 18:19:44 2272573 163
>>2272523
Я запутался если честно, попробуй добавить инициализации конекторов при создании лупа или же просто как отдельную короутину запускай сначала, может быть gather-ом , я бы 2 луп не создавал, тебе охота с 2 ебаться ?
Аноним 21/01/22 Птн 19:04:22 2272616 164
Как работают платежные системы встроенные в сайт?
Видел ссылки на всякие python-sdk но суть нигде так и не пояснена: КАК работает платежкп? Куда там и как реквесты передаются?
Аноним 21/01/22 Птн 19:13:24 2272626 165
Аноним 21/01/22 Птн 19:24:53 2272635 166
Прикиньте? А у циана таки прод на торнадо написан!
Аноним 21/01/22 Птн 19:51:04 2272647 167
>>2272635
У нас сервис авторизации тоже на торнадо написан.
Аноним 21/01/22 Птн 20:01:54 2272653 168
>>2272635
У них изначально вообще был фласк, потом они патчили его через гевент.
Аноним 21/01/22 Птн 20:12:44 2272662 169
Аноним 21/01/22 Птн 20:21:31 2272668 170
https://hh.ru/vacancy/51494568
>Python developer trainee
>Практический опыт с Python от полугода

Шутки кончились!
Аноним 21/01/22 Птн 20:37:57 2272685 171
>>2272573
Короче вот пример
from aiomisc improt entrypoint
...
if __name__ == '__main__':
__# Вот тут как сделать асинхронный вызов функции в том же цикле событий, что и внизу луп?
____service = Service()
____with entrypoint(service) as loop:
________looз.run_forever()
Аноним 21/01/22 Птн 21:03:25 2272724 172
>>2272668
Ну дак это немецкая компания, плюс 40к платят, так что справедливо. Тем более это необязательно коммерческий опыт, можно и пет-проекты.
Аноним 21/01/22 Птн 21:15:38 2272731 173
>>2272685
Побробуй asyncio.Run in executor

Тебе зачем вызывать инициализацию базы в эвент лупе ? Почему не сделать так
1. Запуск инициализации пул коннектов
2. Далее в эвент лупе создаешь сервисы или че там

че там aiomisc я не знаю в душе, я угарел по стандартной либе
Аноним 21/01/22 Птн 21:17:53 2272733 174
>>2272731
>Тебе зачем вызывать инициализацию базы в эвент лупе ?
Конфиги там для сервисов лежат, таймеры, предельные значения, таймауты и т.д.
Аноним 21/01/22 Птн 21:29:53 2272743 175
>>2272733
Ну вызови тоже самое в эвент лупе через asyncio , по сути у тебя что вызывается то ? Асинхронные функции , короутины, вот, он их и вызовет в отдельном как бы исполнителе, это не то чтоб отдельный эвент луп, если представить завод, то executor это что-то типа подрядчик с соседнего цеха , собственно , более того, у тебя 1 эвент луп будет, если ты решишь получить экземпляр лупа, то он будет как у тебя изначально в твоем коде после комментария, то бишь даже так, твои инциаилизации не будут крутится в этом лупе, но будут выполнены до начала лупа, что тебе и нужно, нет?
Аноним 21/01/22 Птн 21:32:54 2272747 176
Снимок экрана 2[...].png 94Кб, 582x328
582x328
>>2272743
Бля, я в начале хотел сказать в executor , более того можешь даже в thread pool executor

>Ну вызови тоже самое в эвент лупе через asyncio

я об этой строке
Аноним 21/01/22 Птн 21:57:39 2272766 177
посмотрел "джанго за час" на ютабе, где можно мои 300кк забрать?
Аноним 21/01/22 Птн 22:16:11 2272771 178
>>2272766
У Гоши Дударя спроси, или кто там еще есть из таких, во, Аудио Хо или АудиХо, ну как-то так, что-то с Хо
Аноним 21/01/22 Птн 22:31:24 2272796 179
>>2272766
Ты сначала свое что-то напиши или на опенсорсе что-то зделай, какой-нить плагин допили/обнови, который авторы забросили. Вот это будет считаться. А твоё видео это кал.
Аноним 21/01/22 Птн 22:34:50 2272803 180
>>2272796
Это очень большая ошибка посылать новичка сразу в попенсорс. Туда как раз таки пишут люди с большим опытом и пониманием того что и зачем они делают. Даже просто так обновить либы нельзя, потому что это требует проверки на совместимость.
Аноним 21/01/22 Птн 22:37:10 2272806 181
>>2272803
Ну ладно тогда просто зделай пет-проект, вкатись за еду в рандом-город, где мало конкуренции и учись у старших коллег писать код, а потом в опенсорс. Хотя уже не понадобится.
Аноним 22/01/22 Суб 04:46:49 2273012 182
>>2266995 (OP)
Аноны, что представляют собой переменные с точки зрения интерпретатора? Где они хранятся?
У Лутца (Изучаем Python, т.1, 209 стр.):
>Переменные — это записи в системной таблице, в которых предусмотрены мес­та для связей с объектами.
Это мне ни о чем не говорит - пытался нагуглить, что за системные таблицы, ничего конкретного нет.
Ответ, что переменная - это указатель на значение в памяти, не подходит. Я понимаю, что она делает - вопрос в том, что она собой представляет.
Аноним 22/01/22 Суб 07:40:27 2273021 183
Аноним 22/01/22 Суб 10:54:26 2273066 184
Анончики, может кто объяснить, как работает такой компрехеншн, откуда у вызова функции поиска в глубину (dfs) есть информация о node?
Почему он сначала вычисляет вложенный цикл?
graph_cycles = [[node]+path for node in graph for path in dfs(graph, node, node)]
Аноним 22/01/22 Суб 11:08:45 2273070 185
>>2273066
Компрехеншен разворачивается слева направо.
Аноним 22/01/22 Суб 12:25:37 2273107 186
wolfreview.jpg 121Кб, 820x430
820x430
Что мне гуглить что бы узнать про модули и как работает импорт в питоне. Как работает в питоне аналог композера в пхп?
Аноним 22/01/22 Суб 12:48:09 2273119 187
Аноним 22/01/22 Суб 13:48:11 2273157 188
>>2273107
Что такое композер?
Аноним 22/01/22 Суб 15:08:06 2273237 189
Аноним 22/01/22 Суб 18:12:26 2273492 190
Как сделать чтоб джанга была быстрее
Аноним 22/01/22 Суб 18:58:39 2273537 191
Суть такова. Один запрос это проверка наличия какой-то записи на другом апи, если её нет, создать, потом привязать полученный id паррочкой других (последовательных) запросов, потом проверить наличие ещё одной херни и создать если нет и заключительный один или два запроса.
Вот вы тут значит дрочите на скорость асинхроннщины. Как быть с этим, когда последующий запрос напрямую зависит от предыдущего?
Аноним 22/01/22 Суб 19:30:38 2273581 192
>>2273537
Если у тебя один запрос в секунду и каждый из них выполняется раньше, чем поступает следующий то никаких преимуществ.
А вот теперь представь, что у тебя два (три, четыре, сто, etc) запроса одновременно. Во время ожидания первого запроса уже можно начинать второй, так как контекст в это время свободен.
Аноним 22/01/22 Суб 19:46:07 2273610 193
>>2273581
Я так и делаю. Выделяю относительно независимые участки кода и сую их в executor. Но таких мест очень мало. Просто обидно что один запрос оьрабатывается так долго, примерно секунды две.
Приходится делать очередь с одним воркером, скорость пиздец, но по другому нельзя, иначе у меня появятся два одновременных запроса которые создадут две записи, чего быть недолжно.

Уже мысль появилась, может копить это говно по 10 штук и одновременно их обрабатывать. Апи позволяет делать пакетные запросы, но это в итоге в такой говнокод превратится, это пиздец
Аноним 22/01/22 Суб 19:53:19 2273625 194
>>2273610
>примерно секунды две
У тебя там процессинг какой-то или простое ожидание?

>Приходится делать очередь с одним воркером, скорость пиздец, но по другому нельзя, иначе у меня появятся два одновременных запроса которые создадут две записи, чего быть недолжно.
То есть тебе нельзя делать одновременные запросы, но при этом ты решил делать все через асинхронность? А ты знаешь зачем она вообще нужна? Тебе даже с мультитредами/процессами пришлось бы ждать.
Однако, ты говорил про то, что ты проверяешь какую-то запись. Если это происходит по айди приходящему извне, то ты можешь сделать лочку через set().
Аноним 22/01/22 Суб 20:26:46 2273676 195
>>2273625
Не, я не это имел ввиду. К примеру, мне приходит запрос, содержащий номер телефона и сообщение. Я делаю запрос, чтоб проверить наличие контакта и получить его id, если контакта нет, делаю следующий запрос на создание контакта, откуда получаю id, потом использую его на создание чата и получения id чата (храню в базе), потом проверки наличия связи этого чата с другой сущностью и создание если его нет и только потом отправка сообщения по id чата.
Вся эта процедура это один запрос на мой сервер. К примеру, мне могут прийти одновременно два таких запроса на разные параллельные инстансы сервера. Он вполне может создать два одинаковых контакта, если его нет. Как решаются такие проблемы? Очередь с одним работником? Я так и делаю сейчас, но это пиздец как медленно
Аноним 22/01/22 Суб 20:53:57 2273733 196
>>2273676
Первый вариант
Делаешь внешнее хранилище, например redis, проверяешь отсутствие номера там, куда кидаешь его внутрь и после окончания удаляешь оттуда, соответственно, если номер там, то отбрасываешь реквест, желательно, что бы клиент был синхронный, что бы во время ожидания не сделать доп запрос.

Второй вариант
Делаешь дополнительно сервис-балансировщик, который принимает все запросы и каждому инстансу присваиваешь номер. Подбираешь ключ партицирования (в твоем случае это номер телефона) и функцию партицирования так, что бы запросы распределялись равномерно по сервисам. (можно просто mod). Каждый запрос кидаешь по нужному инстансу согласно результату функции. В самом сервисе уже можешь сделать внутреннее хранилище, например set/dict, которое проверяет обрабатывается ли этот ключ в данном сервисе в данный момент и откидывает его (или кладет в какую-нибудь очередь, что бы потом запроцессить, после окончания предыдущего запроса).

Первый вариант гораздо легче реализуется, второй идеалогически правильнее.
Аноним 22/01/22 Суб 21:18:01 2273772 197
>>2273733
Я еще чуть подумал, в случае редиса можешь и асинхронный клиент юзать. Сам редис однопоточный и даже если ты сделаешь два запроса одновременно один гарантированно отвалится.
Аноним 22/01/22 Суб 21:19:37 2273775 198
>>2273733
Выглядит неплохо, вероятность появления дублированных запросов снижается, но всё же остаётся.
Можно попробовать в мемкеш сувать какой-нибудь идентификатор запроса и удалять его при завершении. Если он присутствует - приостанавливать запрос, либо отправлять его содержимое в мемкеш, где предыдущий запрос в конце будет проверять наличие другой. Но в первом случае забьются инстансы, а во втором память.
Аноним 22/01/22 Суб 21:21:46 2273779 199
Блядь, вечно приходится выбирать меж двух стульев. Как же заебало
Аноним 22/01/22 Суб 21:37:00 2273800 200
>>2273775
>но всё же остаётся
Откуда она у тебя остается? Хранилище последовательно обрабатывает запросы на удаление/вставку.
Аноним 23/01/22 Вск 00:07:04 2273977 201
Как использовать установленые пакеты в virtualenv. Установил расширение flask_bootstrap и хрен его знает как его импортировать
Аноним 23/01/22 Вск 02:42:29 2274173 202
Снимок экрана 2[...].png 115Кб, 1526x740
1526x740
>>2273977
Чел, видимо программирование это не твое.
Аноним 23/01/22 Вск 05:47:23 2274214 203
Можно в джанге uvicorn указать для отдельных роутов только одного активного воркера?
Аноним 23/01/22 Вск 06:10:17 2274216 204
Какой фреймворк лучше всего подходит для чистого бекенда?
Аноним 23/01/22 Вск 06:11:40 2274217 205
Аноним 23/01/22 Вск 06:37:16 2274219 206
>>2274217
Без вебстраниц, статикфайлов, и тп
Аноним 23/01/22 Вск 07:20:39 2274224 207

>>2274173
Кидает ошибку при импорте.нахуй иди
Аноним 23/01/22 Вск 07:30:30 2274229 208
Аноним 23/01/22 Вск 09:20:51 2274250 209
Аноним 23/01/22 Вск 10:20:30 2274265 210
>>2274229
Включил, не тот питон в баше работал А ты токсик ))
Аноним 23/01/22 Вск 10:56:01 2274277 211
Надо загнать один пакет в приватный гитлаб, но чтобы его можно было поставить через pip. Кто делал?
Аноним 23/01/22 Вск 12:13:53 2274309 212
Аноним 23/01/22 Вск 13:49:46 2274401 213
>>2266995 (OP)
Антуаны, возможно вопрос не по теме, но не знаю где еще спросить.
Почему -4//3 дает -2?
Почему не -1?
Спасибо.
Аноним 23/01/22 Вск 14:00:58 2274420 214
>>2274401
В сети нашел такое объяснение.
>Разделить целое число a на целое число b!=0 с остатком — это значит
>найти такие два целых q и r, которые удовлетворяют следующим условиям:
>1) a = b q + r;
>2) 0 <= r < |b|.
Но все равно не сходится. Предположим, что -4//3 будет -2
(-2)
3+1 получается -5, а не -4
Аноним 23/01/22 Вск 15:01:14 2274481 215
>>2274401
Если вкратце, // округляет вниз, ближайшее целое, меньшее -1.(3) - это -2
Аноним 23/01/22 Вск 19:07:55 2274756 216
>>2267346
Если ты про аннотацию типов и тип возвращаемого значения -- я использую, мне очень нравится. У меня тоже вопрос: как пользоваться директивой todo? Есть гайды на эту тему, примеры? Я бы хотел отмечать в коде планы на будущее
Аноним 23/01/22 Вск 19:59:28 2274807 217
>>2274756
Что тебе конкретно непонятно в использовании todo?
Просто без задней мысли пишешь
# todo: допилить хуйнянейм
И всё, дальше тебе IDE напомнит, если что.
Типа, туду не надо использовать в виде "планов на будущее", как ты сказал, для этого должен быть адекватный бэклог. Это просто записка о том, что код можно в этом месте улучшить/отрефакторить, но сейчас это делать некогда.
Аноним 23/01/22 Вск 20:27:27 2274852 218
>>2273492
А какие у тебя вопросы по скорости к сейчас? Покажи пару тестов, замаж офк что не нужно видеть или вырежь, джанга так -то по скорости удовлетворяет большинству задач малого бизнеса
Аноним 23/01/22 Вск 22:44:06 2275027 219
Снимок экрана о[...].png 193Кб, 629x267
629x267
Пытаюсь добавить фильтр в jinja2, все делаю по инструкции, если делаю все прямо скрипте так
def debug(text):
print("i debug filter")
return ''


environment.filters['debug'] = debug
то работает на ура. Но если пытаюсь применить этот фильтр где то на html page , то жалуется что такого фильтра нет и падает приложение.
Как правильно добавлять фильтр правильно, че то не могу нагуглить как оно глобально работает
Аноним 24/01/22 Пнд 00:03:22 2275110 220
Сап аноны не могу сделать одну фигню
Я пытаюсь написать редактер с tkinter
В общем там несколько окон
Основное с холостом
И окно с инструментами делаю toplevel
Есть в итоге два файла main.py и tools.py с этим окошком.
Пытаюсь написать функцию которая ресует на canvas из main при нажатии на кнопку в побочном окне. Всё это в tools.
Только вопрос как мне получить доступ к canva из main в tools
Я хотел при создании в main передавать типа
c=Canvas()
from tools import *
tool = tools(c)
Но ошибку выдаёт что делать?
Аноним 24/01/22 Пнд 00:20:23 2275124 221
IMG202201240018[...].jpg 50Кб, 720x705
720x705
Аноним 24/01/22 Пнд 05:32:52 2275225 222
Есть одна рулетка...
Написал функцию, вложил в цикл. На первой итерации работает нормально, после - не обновляет количество очков. В чем может быть проблема?
https://pastebin.com/NeyyThfB
Аноним 24/01/22 Пнд 10:19:29 2275301 223
>>2275225
Параметр функции score перекрывает глобальный.
Аноним 24/01/22 Пнд 11:37:56 2275354 224
>>2275225
Что-то в голосину с наименования переменных. Ты в курсе, что лучше сразу приучать себя к нормальному неймингу?
Аноним 24/01/22 Пнд 11:40:36 2275359 225
Аноним 24/01/22 Пнд 12:33:25 2275405 226
>>2275354
Да я срал в этот нормальный нейминг,скучно с ним.
>>2275301
Как такое возможно? Это ведь не переменная даже.
Аноним 24/01/22 Пнд 12:37:16 2275410 227
>>2275405
> Это ведь не переменная даже
Лол, а что же это?
Аноним 24/01/22 Пнд 13:07:01 2275434 228
>>2275405
Тогда и на реальных проектах тебе будет скучно, завязывай, другалек.

Глобальная переменная - это тебе намек на то, что надо почитать про области видимости переменных.
Аноним 24/01/22 Пнд 13:10:47 2275436 229
Вот пишу я у себя на компе программу на питоне, и мне нужно, чтобы, с одной стороны, у меня на компе были установлены нужный питон и пакеты с зависимостями, с другой - чтобы всё это не было установлено глобально, т. к. для другой программы версия питона и пакеты могут быть другими, а с третьей - чтобы можно было этот набор (питон + пакеты с зависимостями) точно воспроизвести на любом другом компе (на сервере, например). Какие тулзы для всего этого принято использовать?
Аноним 24/01/22 Пнд 13:12:18 2275438 230
Аноним 24/01/22 Пнд 13:12:20 2275439 231
>>2275410
>>2275434
Вы лучше вот что мне объясните, если это переменная и она локальная, создаётся для каждого вызова функции, как она может влиять на что-либо вне самой функции? Может, там как-то можно удалить неиспользуемые переменные?
Аноним 24/01/22 Пнд 13:12:53 2275441 232
Аноним 24/01/22 Пнд 13:19:14 2275451 233
>>2275439
Так она и не влияет, ты пробуешь менять глобальную переменную в функции, но она недоступна, потому что перекрыта локальной. Да и это бы не получилось, потому что надо было бы пробрасывать ее в скоуп через global. В любом случае, это хуевый подход. Лучше чтобы функция возвращала на хуевертила с глобальными переменным, а возвращала результат, который уже можно использовать вменяемо.
Аноним 24/01/22 Пнд 14:54:19 2275556 234
Аноним 24/01/22 Пнд 15:13:09 2275566 235
Есть хендлер который навесили на все ошибки в Celery через декоратор вот так:

@task_failure.connect
def my_handler(args, *kwargs):
----pass

Проблема в том что он глобально нах не нужен, его стоит вешать только на определенные типы ошибок. Как это поменять?
Аноним 24/01/22 Пнд 15:44:59 2275586 236
Каково влияние на производительность, если я импорты делаю внутри вызываемых функций а не вверху модуля? (из-за предотвращения циклических импортов)
Аноним 24/01/22 Пнд 16:00:57 2275605 237
Screenshot 2022[...].png 27Кб, 940x168
940x168
Помогите адаптировать кусок питона на ноду. Оба метода из либы Cryptodome. Продублирую и сюда, помимо js треда, на случай если среди питонистов есть разбирающиеся в криптографии и знающие ноду.


Cryptodome.Hash -> SHA1
Cryptodome.Signature -> pss



Перепробовал множество разных вариантов с модулем crypto (да и со сторонними) - не получается.. Есть сервер, на который эта подпись отправляется, так и узнаю о корректности данных. Через питон запрос успешно проходит, а на ноде ошибка.
Аноним 24/01/22 Пнд 16:33:12 2275635 238
Как в psycopg2 кешировать результат селекта?
Я сделал нотификацию, когда данные изменились и время взять свежие, но как их закешировать?
Аноним 24/01/22 Пнд 16:36:26 2275637 239
>>2275635
Анус себе закешируй
Аноним 24/01/22 Пнд 17:53:23 2275684 240
Хочу создать чат-бота для сайта. Для начала хотел начать с простого - что-то вроде обратной связи/ящика пожеланий: чтобы пользователь мог выбрать куда отправлять (например, номер отдела и т.п.) и сообщение. Данные уходили бы в бд Postgre. С чего начать в данной задаче?
Аноним 24/01/22 Пнд 18:07:15 2275704 241
>>2275684
С чего там можно начинать? Форма обычная, делов на пять сек.
Аноним 24/01/22 Пнд 18:50:39 2275768 242
>>2275704
А примеры есть? В питон вебе почти ноль
Аноним 24/01/22 Пнд 18:59:45 2275779 243
>>2275768
Бля, ну читни какую-то начальную книгу по фласку или джанго, или что ты там хочешь, или посмотри видяшку на ютубе от зумера зумеркова.
Это самое начало начал.
Аноним 24/01/22 Пнд 21:09:13 2275888 244
Раз тут про асинхронность пишут, где можно почтитать? Вот прям с нуля и не документацию. Там уже рачитано, что шарю в этом. Циклы событий как делаются, как вклинить в существующий цикл, чтоб в синхронном вызвать асинхронный код и т.д.
Аноним 25/01/22 Втр 04:27:59 2276082 245
Я вкочуся вот увитити...и не просто клепать апи на фастапи, а в датасаенс!!! я понимаю тчо такое лагарифм и видео в ютубе по байесому митаду пастматрел изи 300к\наносек буду...вот увитити...

Кроме шуток, заебала эта биполярка, никак не начну даже пытаться найти работу. С утра проснусь думаю збс, много чего уже знаю, проходит три часа и уже ужасаешься, что невозможно найти РАБоту, просматривая списки требованийпоплакал
Аноним 25/01/22 Втр 08:16:54 2276106 246
Аноним 25/01/22 Втр 08:30:29 2276108 247
>>2276106
Смотрел у него про ООП - неблохо, приятный чувак.
Надо будет глянуть.
Аноним 25/01/22 Втр 16:05:26 2276499 248
Планирую начать изучать Питон, а потом перейти на PyGame и попробовать на нём запилить какую-нибудь простенькую 2д игру со знакомым художником.
Какие подводные моего плана?
Аноним 25/01/22 Втр 16:29:51 2276530 249
>>2276499
Если не планируешь зарабатывать деньги на этом,то никаких.
Аноним 25/01/22 Втр 16:35:18 2276533 250
У меня есть функция, которая в бесконечном цикле исполняется.
При определенном условии она должна пинговать классам разным, что состояние изменилось и надо получить новые данные.
Как это сделать? Думал через коллбек сделать, но тогда придется список классов вносить, какие методы дергать.
Через сигналы вроде можно, но тогда надо метод определить, который бы присваивался классу, да и хз как его сделать. статическим нельзя, ведь переменные класса надо менять, а класс метод - опять же надо список классов иметь.
Какую-то корутину определять не знаю как, да и выглядит так себе. Слушатель должен быть один, а если она будет, то каждый будет дергать бд и куча лишних коннектов к бд будет
Аноним 25/01/22 Втр 17:17:17 2276571 251
>>2276530
На игре не планирую.
В будущем планирую, но тема с питоном это просто как разминка для мозга.
Потом планирую вкатываться в c# уже по серьёзному.
Аноним 25/01/22 Втр 17:33:22 2276594 252
Если я делаю
class A:
____def __init__(self, some_obj)
________self.method_a = some_obj.method_a
Могу ли я как-то сделать, чтоб при вызова some_obj.method_a()
в классе A помимо method_a выполнялись другие действия?
Аноним 25/01/22 Втр 17:36:31 2276598 253
>>2276594
Что за наркомания. Почему не передать в some_obj объект класса А и уже из obj.method_a вызывать действия с классом А
Аноним 25/01/22 Втр 23:00:22 2277032 254
изображение.png 121Кб, 815x553
815x553
Дайте гайдов книг или примеров как делать приложения на Flask. Скачал книгу по фласку, но как то она мне не очень. Прыгает как то сильно по темам и только расширения установаливает миллион ну и конечно я долбоеб не умею гиглить и по книгам учиться зашквар
Аноним 26/01/22 Срд 00:27:46 2277148 255
>>2276106
Немного не то, что я имел ввиду. Мне бы что-нибудь про подробный разбор asyncio. Там ебнешься сколько методов запуска, с новыми потоками, с тасками. Вот тут я обосрался, когда пытался в существующем цикле событий вставить вызов маленькой функции
Аноним 26/01/22 Срд 11:30:45 2277333 256
Джангочушки, почему вы такие зачуханные? Вам не стыдно нахуй? Если встречаем джангиста, который идет к нам собеситься, начинаем его закидывать вопросами по фастапи, он поскуливает и пытается оправдаться что не очень хорошо с ним знаком, но мы подъебываем его на тему "это стандарт нахуй. это знать надо!". Под конец можно ебануть и несколько вопросов по Джанге, чтоб потроллить канешн, например про сигналы джанги спросить или про конкурентность, когда он таки высирается, интересуемся, каково постоянно юзать такие вот костыли, после такого он обычно морально убит нахуй
Аноним 26/01/22 Срд 11:34:15 2277336 257
>>2277148
>когда пытался в существующем цикле событий вставить вызов маленькой функции
Че?
Аноним 26/01/22 Срд 11:42:37 2277342 258
>>2277333
Вброс конечно, но по работе основной бек был изначально на джанге, все новое пилю на фастапи. Перегруженные тонной ебанины конвееры типа джанги и ему подобных аналогов на других языках считаю устаревшим подходом. Всегда можно ебануть элегантную и более эффективную сборку на микрофреймах и чувствовать себя хозяином в своем коде.
Аноним 26/01/22 Срд 11:51:43 2277351 259
Аноним 26/01/22 Срд 11:52:41 2277354 260
>>2277333
Токсичная у вас атмосфера.
Аноним 26/01/22 Срд 13:10:26 2277450 261
>>2276571
>планирую
Планирую планирую

Нахуй нам это знать, другалек ? Планами знаешь кого насмешишь? Делай лучше. 0 токсичности
>>2276533
Архитектурно сложно и муторно, попробуй изменить архитектуру

>>2277333
двачую
>>2277342
двачую
Аноним 26/01/22 Срд 13:16:48 2277461 262
>>2276533
>При определенном условии она должна пинговать классам разным, что состояние изменилось и надо получить новые данные.
Pub-Sub
Аноним 26/01/22 Срд 17:23:31 2277770 263
Аноним 26/01/22 Срд 20:21:06 2278024 264
Без имени.png 35Кб, 652x660
652x660
Поставил я значит anaconda.navigator, создал там среду, скачал туда kivy, запускаю vsconde среда подключилась, pip freeze говорит что kivy установился но в самом редакторе kivy не видит в чём причина?
Аноним 26/01/22 Срд 20:21:37 2278025 265
Сап. Конечно, этот вопрос можно было бы задать в основном треде, но я думаю там бы все равно пнули сюда. Вообщем, походил я на разные курсы, а-ля "Программирование для начинающих" да, я еще шкила, прошел курс на питонтьюторе и... Все. Я не знаю куда двигатся дальше. Я могу решить несложную олимпиадную задачу, но не более.
Как мне, допустим, написать калькулятор? Отдельным окошком, с кнопочками. Ну, на сишарпе я наверно сделать смогу, там конструктор винформс, как делфи. На андройде также.
Но как написать графическое приложение на питоне, или там базу данных например? Где все книжки на эту тему? Каюсь, ничего не искал особо, но все книги или гайды, которые я видел, это либо "для начинающих", либо что-то для уже программистов, что выше моего уровня.

Покажите путь ньюфагу, аноны
Аноним 26/01/22 Срд 20:22:49 2278027 266
>>2278025
pyside(qt), kivy и т.д. посмотри это на счёт форм
Аноним 26/01/22 Срд 20:26:19 2278031 267
>>2278024
Он в венве, а ты поставил для системного бидона небось.
Аноним 26/01/22 Срд 20:27:30 2278032 268
image.png 11Кб, 609x212
609x212
Аноним 26/01/22 Срд 20:31:32 2278037 269
>>2278031
Оказалось в vscode нужно было выбрать интерпретатор
Аноним 27/01/22 Чтв 00:24:39 2278204 270
>>2277450
>Планирую планирую
>
>Нахуй нам это знать, другалек ? Планами знаешь кого насмешишь? Делай лучше. 0 токсичности
Вообще, довольно токсично. Я уже начал изучать питон.
Аноним 27/01/22 Чтв 00:31:58 2278212 271
>>2267453
Чем старше инструмент, тем больше в сети по нему статей. Если видишь много статей для какого-то инструмента, есть повод задуматься что он устарел. Чаще смотри на даты статей. Юзай fastapi и pydantic

мимокрокодил 250кк в секунду
Аноним 27/01/22 Чтв 07:37:28 2278334 272
Есть такая штука:
https://docs.python.org/3/library/asyncio-stream.html
Задача:
Несколько клиентов1 подключается на 1001 порт, несколько клиентов2 на 2002 порт одного сервера. Требуется обработать и передать клиентам2 всё что отправит на сервер каждый из клиентов1.
Не пойму как православно реализовать такое. Держать глобально массив Writer'ов? Для каждого клиента2 создавать очередь? Или вообще использовать другую либу?
Аноним 27/01/22 Чтв 07:48:01 2278335 273
То есть как передать данные из одного сервера в другой, чтобы каждому клиенту досталось?
Аноним 27/01/22 Чтв 12:43:33 2278491 274
Сап. Нужно в определенное фиксированное время исполнять какие-то действия. Допустим, есть список чатиков, в каждый чатик нужно закинуть что-то свое. Какой инструмент мне бля этого нужен? Message broker?
Аноним 27/01/22 Чтв 12:59:01 2278518 275
Аноним 27/01/22 Чтв 13:30:04 2278553 276
>>2278491
Тебе крона достаточно будет
Аноним 27/01/22 Чтв 13:31:26 2278555 277
>>2278334
>Для каждого клиента2 создавать очередь?
Да, так любая вебсокетная либа устроена
Аноним 27/01/22 Чтв 14:19:22 2278596 278
>>2278555
А тот факт, что всем по сути отправляется одно и то же никак не упрощает задачу? Может что-то на протоколах наколдовать можно?
Трудно себе представляю как сервер1 будет знать сколько клиентов у сервера2. Получается, нужна главная очередь и очереди на каждое соединение? Не много ли очередей для такой простой задачи? Без них не обойтись?
Аноним 27/01/22 Чтв 14:20:33 2278598 279
Всмысле не встроены ли там очереди уже в эту либу под капотом?
Аноним 27/01/22 Чтв 15:06:43 2278689 280

Посоны, нужна ваша помощь (написать скрипт для голосования чтоб защитить честь двача и спасти жизнь Абу) подробнее тут

https://2ch.hk/b/res/262122227.html
Аноним 27/01/22 Чтв 15:21:11 2278709 281
>>2278596
А у тебя клиенты как подключаются то? По какому протоколу? Тебе в любом случае нужно иметь пул соединений
Аноним 27/01/22 Чтв 16:25:40 2278786 282
>>2278709
asyncio.start_server() разве сам его не создаёт?
Может есть ссылка что почитать где нормальным русским языком объясняется про все эти потокобезопасности, сокеты, вебсокеты, пулы, протоколы, стримы и т.д. А то сами исходники понятней чем английские маны по ним. Везде 100500 способов сделать сервер на asyncio, но к какому способу в каком случае и зачем прибегают нигде не сказано. Везде "можно ещё вот так и вот так изъебнуться, смотри как здорово!"
Аноним 27/01/22 Чтв 18:05:03 2278944 283
Объясните кое-что по поводу замеров времени, аноны. Замеряю двумя разными способами простой цикл, но результаты разные.
Цикл:
https://ideone.com/8oczQe

Замер с помощью timeit, результат - 3.97 секунд

python3 -m timeit "from main import countdown; countdown(100)"
100000 loops, best of 5: 3.97 usec per loop

Если замерять цикл с помощью time.perf_counter(), результат - 9.8 секунд.
https://ideone.com/cS4HjQ

9.873999999999994e-06


1. Почему результаты разные? И как правильно в этом случае?
2. Почему он считает 3.97 / 9.8 секунд, если выполняется буквально секунду-две? Прикидывает среднее время выполнения одной итерации и экстраполирует на остальные итерации цикла? Использование perf_counter дает те же самые результаты, если это важно.
Аноним 27/01/22 Чтв 18:19:37 2278963 284
>>2278944
Это микросекунды, а не секунды.
А разница из-за способов подсчета, очевидно. Надо разбираться.
Аноним 27/01/22 Чтв 18:23:40 2278968 285
Аноним 27/01/22 Чтв 18:33:38 2278982 286
Screenshot9.png 60Кб, 973x456
973x456
Как правильно сделать кнопку "Назад" в чат боте? aiogram
После возврата не принимает ничего
async def update_text(message: types.Message, action: str):
with suppress(MessageNotModified):
await Form.back.set()
directs = {"rk":"направление1","inv":"направление2","tpr":"направление3","tinv":"направление4"}
await message.edit_text("Выбранное направление: "+directs[action]+"\nВведите тему:", reply_markup=get_back())


@dp.callback_query_handler(callback_direct.filter(action="back"), state=Form.back)
async def callback_back(call: types.CallbackQuery):
await cmd_switch(call.message)
await call.answer()


@dp.message_handler(commands="w")
async def cmd_switch(message: types.Message):
#user_data["username"] = 0
await Form.name.set()
await message.answer("Куда хочешь направить:", reply_markup=get_keyboard())
@dp.callback_query_handler(callback_direct.filter(action=["rk", "inv", "tpr", "tinv"]), state=Form.name)
async def callback_directs(call: types.CallbackQuery, callback_data: dict, state: FSMContext):
action = callback_data["action"]
if action == "rk":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
# await topic_text(call.message)
elif action == "inv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tpr":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tinv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
await call.answer()


@dp.message_handler(state=Form.topic)
async def topic_text(message: types.Message, state: FSMContext):
with suppress(MessageNotModified):
async with state.proxy() as user_data:
user_data["Topic"]=message.text
await message.answer("Опишите проблему:")
await Form.next()
Аноним 27/01/22 Чтв 21:03:42 2279181 287
изображение.png 12Кб, 914x220
914x220
Читаю это https://flask.palletsprojects.com/en/2.0.x/cli/
И тут они применяют вот это на пикче. Объясните что это за скрипт, потому как я не понял что это такое и откуда он взялся
Аноним 27/01/22 Чтв 21:05:22 2279184 288
>>2279181
Я забыл написать, откуда они взяли блядский hello
Аноним 27/01/22 Чтв 21:08:53 2279187 289
>>2279181
Там же все описано.
Аноним 27/01/22 Чтв 21:48:37 2279231 290
>>2279187
ПРо hello ничего не написоно я не вижу
Аноним 27/01/22 Чтв 21:52:02 2279234 291
>>2279231
Читаешь каждую строчку и вникаешь.
Потом можешь почитать, как работает wsgi.
Аноним 27/01/22 Чтв 21:52:31 2279236 292
Untitled.png 82Кб, 1324x728
1324x728
Аноним 28/01/22 Птн 10:50:44 2279614 293
>>2279552
то есть тебя рпиняли, хотя ты в этом не шаришь? охуеть
Аноним 28/01/22 Птн 11:10:00 2279647 294
>>2279635
Давай, старайся! Ты должен превозмочь! а что по бабкам?
Аноним 28/01/22 Птн 11:24:56 2279656 295
Аноним 28/01/22 Птн 14:06:30 2279777 296
почаны, каким образом можно отобрать папки, в которых есть только файлы с заданным расширением и никаких больше?
то есть все папки, кроме подходящих под условие, не должны попасть в конечных список?
3 день думаю, нихуя не придумаю.
Аноним 28/01/22 Птн 14:24:28 2279786 297
>>2279777
Тупо в лоб перебирать, кмк
Аноним 28/01/22 Птн 14:25:27 2279788 298
Аноним 28/01/22 Птн 14:36:50 2279805 299
>>2279786
перебирал с помощью glob, listdir - не понимаю, как заставить скрипт игнорировать папки, в которых их нет файлов интересующего меня расширения.
Аноним 28/01/22 Птн 14:37:59 2279806 300
image.png 6Кб, 402x159
402x159
Аноним 28/01/22 Птн 15:15:01 2279843 301
>>2279806
чел, ты мой герой. я бы еще долго думал до os.walk'а считая его слабее glob и listidir). ну а в цирке походу выступаю я.
Аноним 28/01/22 Птн 15:29:51 2279864 302
Бля, помогите, весь мозг сломал.

class A:
__def __init__(self):
#это конечная операция, не долгая
____self.data = asyncio.get_event_loop().run_until_complete(self.get_data())
____# Тут как сделать вызов асинхронного listen который вечный цикл юзает, чтоб не блокировало программу?

__async def listen(conn):
____async with conn.cursor() as cur:
______await cur.execute("LISTEN channel")
______while True:
________try:
__________msg = await conn.notifies.get()
________except psycopg2.Error as ex:
__________print("ERROR: ", ex)
__________return
________if msg.payload == "finish":
__________return
________else:
__________print("Receive <-", msg.payload)
Я просто хз уже. Вызов слушания блокирует всё, он должен работать всегда.
Аноним 28/01/22 Птн 15:39:03 2279875 303
>>2279864
>msg = await conn.notifies.get()
Вот эта строка за каким-то хуем блокирует всё
Аноним 28/01/22 Птн 16:34:05 2279957 304
Аноним 28/01/22 Птн 19:07:44 2280215 305
Подскажите как тут грамотно разширить функционал?

Есть такой код https://ideone.com/W9RNzB

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

Но проблема в том, что базовый класс много где используется. И если я отправлю пулреквест на замену всех использований базового класса на свой, то этот пулреквест не пройдёт ревью т.к. мои фичи не везде нужны, но при этом должна быть возможность их везде запускать. То есть идеально было бы это сделать новый класс и от него унаследовать базовый. Но тогда я не смогу использовать методы базового класса внутри нового. Как тогда такого добиться?
Аноним 28/01/22 Птн 19:41:48 2280245 306
>>2280215
Делай так, наследуешься от класса, делаешь фичи без флага. Там, где они нужны, создаешь объект от твоего класса, где нет - от базового.
В идеале даже так, Базовый класс с абстрактными методами, Делаешь два класса, которые от него наследуются. Старый класс и твой. Создаешь объект нужного класса на этапе определения есть ли флаг
Аноним 28/01/22 Птн 20:37:00 2280308 307
>>2280245
>Там, где они нужны, создаешь объект от твоего класса, где нет - от базового.
Слишком много мест, где придётся заменять базовый класс на мой. Мне так не разрешат. Это должно работать во всех местах где есть базовый класс, но подэфолту выключено. Если я в каждом месте базовый клас заменю на новый и оставлю этот функционал выключены, но на меня как на дурочка будут смотреть если делать так

>Базовый класс с абстрактными методами
Эти методы отлично вписываются в базовый класс. Они не должны там быть абстрактными. Мне нужно просто их расширить.

Думал вариант над mixin. Вот так получилось https://ideone.com/3v1qm9

Но мне нужен порядок вызовов. Сейчас там порядок вызова старта A -> B. Базовый класс тоже унаследован от другого, который унаследован от ещё одного, но супер внутри старт и стопа не вызывает. Поэтому мне надо. Если вставляю mixin, то получаю A -> mixin -> B. А мне нужно A -> B -> mixin чтобы мои фичи самые последние запускались. Такое можно сделать?
Аноним 28/01/22 Птн 22:00:25 2280385 308
Сколько понадобится время чтобы найти работу с нуля каждый день занимаясь по 3-4 часа? Только вот релаьео чтобы найти а не потом год тестовые делать.
Аноним 28/01/22 Птн 22:02:03 2280386 309
>>2280385
Это надо склонировать одного вкатуна пару тысяч раз и проивзести статистические подсчеты.
Готов послужить подопытным для вкатологии?
Аноним 28/01/22 Птн 22:15:25 2280395 310
>>2280386
Я так чисто интересуюсь, сам даже не планирую. Неужели нет хотя бы примерной инфы от состоявшихся джунов?
Аноним 28/01/22 Птн 22:25:24 2280405 311
>>2280308
Я сначала написал ответ, как реализовать нормально надо. Но вижу, что ты уперся в свой флаг и мне не охото стало рассказывать
Аноним 29/01/22 Суб 02:08:32 2280503 312
Почему в sqs fifo таски с одинаковыми id gevent воркер распределяет задачи медленнее чем pool=solo, который делает зто почти моментально?
Аноним 29/01/22 Суб 02:11:41 2280505 313
>>2280503
Т.е он получил набор последовательных тасков и выполняет их последовательно с большим интервалом, когда как solo и prefork делают это гораздо быстрее.
Однако у gevent производительность в параллельных тасках гораздо быстрее, для чего он мне и нужен, но если есть только одна последовательность он просто ждет по 10с блядь
Аноним 29/01/22 Суб 11:10:16 2280600 314
>>2280308
Нихрена не понятно.

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

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

Есть ещё варианты, тоже грязнованые правда, это просто переписать класс в рантайме. То есть ты можешь сделать так, чтобы просто твой Base класс реально указывал на его наследника. Это обезьяньи техники (monkey), такое при тестировании используют, для рабочего кода мне кажется это не очень.
Аноним 29/01/22 Суб 11:53:15 2280637 315
>>2280308
Дополню себя >>2280600

Тебе надо как-то прояснить, зачем ты это делаешь.

Есть базовые принципы SOLID, они в том, например, что функционал уже существующего кода не должен меняться при доработке классов-наследников. Если люди используют базовый класс, значит им нужен базовый класс. А ты даёшь какой-то дополнительный функционал, и, соответственно, твой класс будут использовать те, кому он нужен. Обычное ООП для этих целей работает очень хорошо.

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

Пример, есть библиотека, где определён класс:
===
class Base:
____def __init__(self, value='default value'):
________print("original base class __init__")
________self.value = value

____def prn(self):
________print(f"Base print, value {self.value}")

def foo():
____b = Base()
____b.prn()
===
Вот допустим, ты хочешь подменить класс, не влезая в код библиотеки, ты просто делаешь
===
import lib

class Magic(lib.Base):
____def prn(self):
________print(f"Magic-print, value: {self.value}")

lib.foo()
lib.Base = Magic
lib.foo()
===
запускаешь
>python3 magic.py
>original base class __init__
>Base print, value default value
>original base class __init__
>Magic-print, value: default value

это monkey-patching
Но для продакшен-целей так делать не надо.

Для продакшен целей делают разные декораторы, либо иные обёртки. Надо смотреть, что у тебя за задача.
Аноним 29/01/22 Суб 15:19:59 2280738 316
Читаю Лутца, вроде все понятно, но чувствуется, что эти знания без практики выветрятся.

Например, зачем мне знать про области видимости, про global и nonlocal, если функции я начну писать очень не скоро.

В общем, вопрос: это нормально или лучше читать Лутца, параллельно кодя что-то осмысленноеХочу в pygame что-нибудь сделать, как раз функции буду писать для создания игры
Аноним 29/01/22 Суб 16:37:39 2280797 317
>>2280738
Так там тебя не учат этому, просто могут быть структурированные таблички. А так будет по порядку.
Но вообще лутц не лучшая первая книга, это да.
Аноним 29/01/22 Суб 16:57:19 2280809 318
>>2280505
Никто не занимался этим?
Аноним 29/01/22 Суб 17:05:05 2280815 319
>>2280809
Gevent мало кто юзает с тех пор как появилась нативная асинхронность
Аноним 29/01/22 Суб 17:10:48 2280821 320
0980570345843.jpg 208Кб, 1049x868
1049x868
1642998633264.jpg 87Кб, 1200x1200
1200x1200
>Если позиции товаров повторяются, то в итоговый список попадает суммарное количество товара по данной позиции.
Убил 8 часов на это, еле-еле сделал, ну и сложные задачки, конечно.
Аноним 29/01/22 Суб 17:27:52 2280838 321
Аноним 29/01/22 Суб 17:58:39 2280859 322
тестовое сообщение
Аноним 29/01/22 Суб 18:03:45 2280864 323
>>2280838
Для меня нереально сложно.
Аноним 29/01/22 Суб 18:19:00 2280879 324
Тема: парсинг.(скорее всего)
Внимание! Вопрос к знатокам.
Сап двач, я собственно из другой сферы программирования, просто стала задача по вебу(батяня попросил написать ему программульку) и я так понимаю для быстрого его решения подойдет лучше питон.
Суть вопроса моего такова:
У меня есть страничка на али (ордер заказа), на ней есть комментарий продавца, который мне надо получить в мою программульку.
одним из вариантов решения я вижу для данной задачи использовать какой нить парсер по типу (Silenium, beautifulsoup )
Важное примечание, что для того чтобы получить инфу надо быть залогининым(вериф идет по почте) как это обойти? Я видел, что с помощью этих фреймов можно проходить обычную верификацию , а можно ли подставить свои куки для обхода этого? и сработает ли это ?
Потом, на сколько я понимаю в ваших вебах сама инфа на страничке генерится жабаскриптом, парсер сможет ее прочитать или он только хтмл + цсс читает ? или как это вообще работает?

Как все делать мне показывать не надо, у меня чисто вопросы по вебу, по выбору фрейма, и то что я тут обсуждаю в теории будет работать ? или какие тут подводные камни ? Просто в альтернативе тогда захерячить какой нить макрос, но мне не хочется делать его , так как это прям всемогущий костыль будет, и может повлиять на юзера(в теории). Либо есть еще альтернативы в решении этой таски? Буду благодарен если кто нить по существу ответит.
всем продуктивного вечера!




Аноним 29/01/22 Суб 18:25:44 2280886 325
>>2280879
Насколько я помню, на али весьма злоебучий процесс логина, так что чистыми запросами будет сложно. Так что берешь селениум или какой-то pyppeteer, дергаешь нужные селекторы и все. И не надо парится насчет генерируемого и подругажемого контента. Просто ждешь готовую страницу и забираешь что надо.
В данном случае у питона никаких особых плюсов нет, это делается примерно одинаково везде.
Аноним 29/01/22 Суб 18:36:57 2280895 326
>>2280886
Благодарю вас
Я почему то думал, что это надо попробовать через парсер как то делать , но вот вижу, что через селениум можно браузер эмулировать.
Еще раз спасибо.
Аноним 29/01/22 Суб 18:42:28 2280906 327
>>2280864
Почитай про словари.
Аноним 29/01/22 Суб 19:40:26 2280965 328
1642998633264.jpg 87Кб, 1200x1200
1200x1200
>>2280906
Да я знаю про славри и методы, но до такого:
>items.setdefault(name, {}).setdefault(item, 0)
чтобы догадаться надо иметь IQ > 140 явно, какой-то космос tbh
Аноним 29/01/22 Суб 21:18:02 2280993 329
>>2280815
Как и селери?
Что вместо очередей теперь используют?
Мне надо распределять запросы на последовательную обработку по определённому идентификатору в самом запросе.
Делаю чаты. Мне приходят сообщения с разных чатов и я отправляю их в другой сервис с чатами. В пределах одного чата нужен порядок.
Аноним 29/01/22 Суб 21:20:50 2280994 330
>>2280993
Я в вебе буквально полгода, многих технологий могу не знать. Единственное что нашёл это селери и fifo очереди. Основной сервер на gunicorn с одним инстансом, который сразу отправляет данные в очередь, где они дальше распределяются.
Понимаю что под нагрузкой он не сможет работать адекватно. Запускал на uvicorn, производительность атас, но порядка нет никакого.
Аноним 29/01/22 Суб 21:25:28 2280996 331
>>2280993
Я не понял причем тут селери относительно предыдущего вопроса, оно вполне себе юзается. Хотя ты упомянул селери в контексте очередей и для этого какой-нибудь кролик лучше подходит.
Аноним 29/01/22 Суб 21:57:16 2281027 332
>>2280996
С брокером проблем нет. Проблемы именно в работниках, которые тупят по 10с прежде чем забрать следующий таск в случае с gevent воркерами. Prefork так не делает, а solo вообще без тормозов.
Но gevent нужен для лучшей масштабируемости
30/01/22 Вск 00:55:57 2281145 333
Как использовать символ \, чтобы он не экранировал?
Аноним 30/01/22 Вск 01:10:49 2281160 334
Есть строка:
string = '1. 0.1, 0.2, тест, тест. ' \
'2. тест, тест, 0.5=0.3+0.2.'
Нужно заменить точки на запятые только в тех местах, где они отделяют дробную часть числа, чтобы было вот так:
string = '1. 0,1, 0,2, тест, тест. ' \
'2. тест, тест, 0,5=0,3+0,2.'
Как это сделать?
Только без костылей типа string = '1. ' + '0.1, 0.2, тест, тест'.replace('.', ',') + '. 2. тест, тест, ' + '0.5=0.3+0.2'.replace('.', ',') + '.'
Аноним 30/01/22 Вск 01:16:43 2281163 335
Аноним 30/01/22 Вск 02:18:08 2281205 336
Аноним 30/01/22 Вск 05:59:25 2281236 337
Аноним 30/01/22 Вск 10:27:41 2281284 338
Есть два стула списка:

my_list_1 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
my_list_2 = [2, 1, 4, 5]

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

Почему код вида:

for number in my_list_1:
if number in my_list_2:
my_list_1.remove(number)

Не удаляет все единицы и двойки из списка my_list_1?
Аноним 30/01/22 Вск 10:57:14 2281296 339
>>2281284
1. Потому что нужно читать документацию
>If a list contains duplicate elements, the remove() method only removes the first matching element.
2. Потому что так писать вообще не стоит. Ты на пустом месте получаешь n^2, хотя задача решается за линейное время.
[x for x in my_list_1 if x not in set(my_list_2)]
Аноним 30/01/22 Вск 11:02:32 2281300 340
>>2281284
ну и в догонку - ты меняешь коллекцию в процессе итерации. Так не надо делать.
Аноним 30/01/22 Вск 11:36:22 2281320 341
>>2281296
>x not in set(my_list_2)
Это линейное что ли?
Аноним 30/01/22 Вск 11:38:20 2281321 342
>>2281320
Это константное. А x for x in my_list_1 - линейное. В сумме линейное
Аноним 30/01/22 Вск 11:41:20 2281323 343
>>2281321
Это логарифм от размера my_list_2 (и set в лямбде тоже ленивый получится, то есть, пердон его на каждой итерации будет из листа переделывать)
Аноним 30/01/22 Вск 11:47:21 2281327 344
>>2281322
Просто ты умница, а остальные даунята.

Ты ведь это хотел прочитать?
Аноним 30/01/22 Вск 11:48:21 2281330 345
>>2269498
Если не пограммист, то зачем тебе сравнение интеграторов?
Аноним 30/01/22 Вск 12:00:01 2281340 346
>>2281296
>1. Потому что нужно читать документацию
>If a list contains duplicate elements, the remove() method only removes the first matching element.

Что интересно, итоговый my_list_1 выглядит так: [1, 1, 2, 2, 3]. То есть почему-то удаляется две единицы и две двойки. Если бы удалились по одной, то всё было бы понятно. Но почему работает так?
Аноним 30/01/22 Вск 12:01:01 2281344 347
>>2281323
Ты че, на плюсах пишешь обычно? Тута у нас set через хэшмап сделан, а не кчд.
Да и даже логарифм растет медленнее линейной функции, так что в сумме все еще O(n)
>и set в лямбде тоже ленивый получится
Да господи, это же общая идея. Скасти его заранее же.
Аноним 30/01/22 Вск 12:02:38 2281345 348
>>2281332
Потому что все люди разные и с разными интеллектуальными способностями.
ваш кэп-крокодил
Аноним 30/01/22 Вск 12:05:43 2281348 349
>>2281340
Потому что ты меняешь коллекцию в процессе итерации же:
In [8]: my_list_1 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
...: my_list_2 = [2, 1, 4, 5]

In [9]: for i, number in enumerate(my_list_1):
...: if number in my_list_2:
...: my_list_1.remove(number)
...: print(i)
...: print(my_list_1)
...:
...:
0
[1, 1, 1, 2, 2, 2, 3, 4]
1
[1, 1, 2, 2, 2, 3, 4]
2
[1, 1, 2, 2, 3, 4]
3
[1, 1, 2, 3, 4]
4
[1, 1, 2, 3]
Аноним 30/01/22 Вск 12:09:58 2281352 350
Кто-нибудь учил джанго по мануалу от мозиллы https://developer.mozilla.org/ru/docs/Learn/Server-side/Django
есть русик, на гите есть код. В целом вроде все рассказали и разжевали. Остается только повторить успех.
Аноним 30/01/22 Вск 12:51:40 2281409 351
>>2281348
Всё равно непонятно: почему на итерации 2 удаляется двойка из списка, а не единица?
Аноним 30/01/22 Вск 12:54:27 2281413 352
Ебаный ваш рот блядь, что тут за порашный свинарник?!
Аноним 30/01/22 Вск 12:56:13 2281419 353
Был. Хе-хе.
Аноним 30/01/22 Вск 13:09:49 2281425 354
>>2281409
Ты удаляешь первое вхождение и всё сдвигается назад.
Аноним 30/01/22 Вск 14:13:42 2281469 355
Какой модуль для питона, чтобы изменять PDF-файлы? Есть некоторый PDF-файл, надо через код заполнять поля.
PyPDF2 не имеет такого функционала.
Аноним 30/01/22 Вск 14:57:58 2281516 356
изображение.png 225Кб, 480x360
480x360
>>2281332
Декораторы, асинхронность
Аноним 30/01/22 Вск 15:53:27 2281566 357
>>2281316
На ютабах и гите нет моих задач. Везде хеловорлды пишут, а чего-то реального нет.
Никто не хочет делиться опытом, чтоб не было конкуренции и они были незаменимыми на рынке.
Аноним 30/01/22 Вск 15:56:14 2281571 358
>>2281332
Так ты просто скрипт сделал, это хуйня из под коня.
Аноним 30/01/22 Вск 16:00:03 2281577 359
>>2281352
Учил джангу на боевом сервер, ибо
КОГДА ГОТОВ? СКОЛЬКО ВРЕМЕНИ НАДО?
@
НЕДЕЛЬКИ ХВАТИТ ЧТОБ СЕРВЕР СДЕЛАТЬ?
@
ДАВАЙ ТЕСТИТЬ
@
ТЕСТЫ ДЕЛАЮТСЯ РУКАМИ, ТЫКАЮТ КНОПОЧКИ, О ЮНИТ ТЕСТАХ НЕТ И РЕЧИ
@
НУ РАБОТАЕТ, ДАВАЙ НА ПРОД
@
ОЙ А ПОЧЕМУ ЭТОГО НЕТ, НАДО ЧТОБ БЫЛО
@
ПОЧЕМУ НЕ РАБОТАЕТ ФРОНТ? ПОХУЙ ЧТО ТЫ НА БЕКЕ
Аноним 30/01/22 Вск 16:23:41 2281594 360
>>2281322
Че-то всё вперемешку.
Ну показал что можешь пользоваться либой дискорда и асинки везде делать. Это как бы одна из базовых вещей. Ну и всё на этом. У тебя все происходит в либе, абсолютно всё.
Как будешь деплоить? Это ж бот, он как бы и сервер иметь должен свой наверное не?

Короче мешанина непонятная. Нет внятной точки входа. Кажется будто это просто часть какого-то другого проекта либо сделано как тестовое. С учётом нулевого опыта можно снисходительно оценить.

Как боевой проект - однозначно нет.
Для начала, разделяй бизнес логику от основной. В мейне расписывать методы НЕЛЬЗЯ, там должна быть ТОЛЬКО точка входа. В бизнес логике методы расписывать НЕЛЬЗЯ. Методы расписываются в другом месте. В твоём случае отдельным файлом типа tasks. Нет настроек, чем окружение разделять будем? Где requirements? Чем демонизировать?
Разумеется, этого всего можно не делать, если вы не собираетесь поддерживать свою хуйню уже с завтра. Но если вы позиционируете себя как ниибаца крутой, будьте любезны делать всё по стандартам.
Аноним 30/01/22 Вск 16:33:11 2281598 361
>>2281594
Ой, что там расписывать, стандартная лапша.
Это как в языках с визуальной разработкой нубы накидывают на форму контролов и хуярят все в обработчиках событий.
Но гонору пиздец.
Аноним 30/01/22 Вск 16:37:21 2281599 362
Дайте какую-нибудь идею новичку, к которой двигаться и реализовывать её, попутно учя язык.
Аноним 30/01/22 Вск 16:46:21 2281608 363
>>2281599
Единственное что могу сказать - делай рабочий проект. Не калькуляторы или какой-нибудь демонстрационный проект для портфолио, а то чем ты будешь пользоваться, чего тебе не хватает или другим.
У тебя будет стимул писать хорошо, поддерживать свой код, крутить-вертеть по всякому. А если ещё и получать прибыль с него это вообще стимул стимулов.
Аноним 30/01/22 Вск 16:50:42 2281615 364
>>2281608
Но мне ничего не надо и я ничем не пользуюсь. Ну написал я сохранятель картинок в треде с двача, как кто-то посоветовал, но им нет смысла пользоваться, так как в любом треде обязательно будет картинка с говном или гомосеком.
Аноним 30/01/22 Вск 16:54:11 2281618 365
>>2281615
Ну, например, сделай к тому же сохранятелю картинок чтоб он проверял дубли.
Аноним 30/01/22 Вск 16:55:41 2281620 366
>>2281618
Не те картинки которые 1в1, а разных размеров, например, или какой-нибудь фигней типа мелкой надписи сбоку, чтоб он считал их одинаковыми
Аноним 30/01/22 Вск 17:26:39 2281659 367
>>2281615
Храни папку картинко с говном, и проверяй на вхождение, когда сохраняешь
Аноним 30/01/22 Вск 18:55:29 2281732 368
ВЫЗЫВАЕТ МЕТОД ИЗ ЛИБЫ ИСПОЛЬЗУЯ AWAIT
@
КРУТО
@
ПРИ ЭТОМ ЮЗАЕТ IF SOME: PASS
@
ДА ВАЩЕ ИЗИ ТУТ ВСЁ СПРАШИВАЮТ

Чет проиграл с этого дебила
Аноним 30/01/22 Вск 19:36:30 2281781 369
>>2281594
Ну и логирования нет. Куча try except pass и ни одного сообщения, даже info. Когда будут косяки будешь по полчаса искать их.
Аноним 30/01/22 Вск 20:38:44 2281827 370
Не спалось прошлой ночью, от нефиг делать открыл гайды по этому вашему питону и за пару часов запилил скрипт, который вытягивает нужные данные по апи яндекс метрики, оформляет их как таблицы и раскладывает по файлам, которые потом на php через include_once собираются в один общий отчет.

Покидайте идей чего еще интересного можно попробовать на нем сделать. Гуглил useful python scripts, но такого чтоб прям зацепило не находится.
Аноним 30/01/22 Вск 23:13:19 2281995 371
Нашёл ещё одну странность при работе с celery и gevent воркерами в sqs.
Если таски делает один поток (из одной очереди), то он делает очень большие паузы, между ними, за каким-то хуем привязанные к wait_time_seconds.
Если таски разбирают два и более потока одновременно, то они разбирают их очень быстро, без пауз. Менял все конфиги, пробовал разные настройки - результат такой же.

Я уже просто заебался гуглить эту хуйню. Такое чувство будто никто с этим не сталкивался.
Аноним 30/01/22 Вск 23:57:14 2282036 372
image.png 40Кб, 551x527
551x527
image.png 7Кб, 289x88
289x88
Сап, нужно убрать из строки все нестандартные символы типа пикрил1 и оставить между словами обычные пробелы. Попробовал сделать способом как на пикрил2, но оно не работает. Что я делаю не так?
Аноним 31/01/22 Пнд 00:06:19 2282041 373
>>2282036
Что это за редактор так показывает?
Сам исходник питоний у тебя как утф сохранен?
Аноним 31/01/22 Пнд 00:08:53 2282043 374
>>2282041
Алсо, зачем построчно? Так для целого текста и хуярь реплейсом.
Аноним 31/01/22 Пнд 00:11:58 2282046 375
>>2282041
Исходник в utf-8, показывает так PyCharm. На пике длинные пробелы типа табов, U-2004 в таблице символов винды
Аноним 31/01/22 Пнд 00:17:44 2282048 376
>>2282043
Построчно т.к. я удалял последнюю строку, где указан год написания. Потом будет нужно разбить этот текст на отдельные слова и посмотреть, какие встречаются чаще всего, поэтому даты не должны портить статистику
Аноним 31/01/22 Пнд 00:17:47 2282049 377
>>2282046
Лол, только сейчас заметил, строки же иммутабельны.
Надо делать str = str.replace
Алсо, лучше переделай на имена, т.е. str.replace("\N{THREE-PER-EM SPACE}", " ") и т.д.
рулет очка Аноним 31/01/22 Пнд 00:25:35 2282055 378
Имеется некоторое количество переменных, которые постоянно увеличиваются в количестве. Мне нужны только последние 30 шт. Как записать их в массив/список, удалять старые и читать только несколько последних? Есть в питоне такие функции?
Аноним 31/01/22 Пнд 00:27:11 2282058 379
>>2282055
Генераторы и списков смотри
Аноним 31/01/22 Пнд 00:29:05 2282059 380
>>2282055
Подробнее расскажи, не совсем понятно.
Аноним 31/01/22 Пнд 00:30:16 2282060 381
>>2282049
Неа, даже так не сработало. Странно, что раньше интерпретатор вообще не ругался на мою попытку реплейснуть строку.
Аноним 31/01/22 Пнд 00:34:04 2282061 382
Аноним 31/01/22 Пнд 00:34:07 2282062 383
Аноним 31/01/22 Пнд 00:38:40 2282063 384
>>2282059
Рандомайзер генерирует число. Это число записывается в некоторый список. Мне не нужно больше 30-и последних, т.е. список должен быть ограничен и при добавлении нового числа, 31-е должно удаляться. Также из этого списка я должен читать и сравнивать некоторое их N-ное количество.
Аноним 31/01/22 Пнд 00:43:50 2282067 385
Аноним 31/01/22 Пнд 00:45:21 2282068 386
Аноним 31/01/22 Пнд 00:49:41 2282070 387
>>2282067
Ого, спасибо! Как эта йоба работает?
Аноним 31/01/22 Пнд 00:51:52 2282073 388
Аноним 31/01/22 Пнд 01:00:17 2282077 389
image.png 17Кб, 465x155
465x155
image.png 9Кб, 1509x88
1509x88
>>2282060
>>2282062
Ха! Эта штука заработала, когда я начал сразу записывать строки в файл, не дожидаясь обработки всего текста. Чувствую себя пиздец победителем, спасибо за помощь, анончик :)
Аноним 31/01/22 Пнд 01:51:20 2282104 390
Есть тут кто диплом на пистоне писал? Лучше юзать ORM или сырыми запросами базу инициализировать и данные вытаскивать?
Аноним 31/01/22 Пнд 02:07:49 2282118 391
Аноним 31/01/22 Пнд 04:15:40 2282134 392
Нашёл ещё одну странность при работе с celery и gevent воркерами в sqs.
Если таски делает один поток (из одной очереди), то он делает очень большие паузы, между ними, за каким-то хуем привязанные к wait_time_seconds.
Если таски разбирают два и более потока одновременно, то они разбирают их очень быстро, без пауз. Менял все конфиги, пробовал разные настройки - результат такой же.

Я уже просто заебался гуглить эту хуйню. Такое чувство будто никто с этим не сталкивался.
Аноним 31/01/22 Пнд 06:19:55 2282147 393
Аноним 31/01/22 Пнд 10:54:31 2282225 394
>>2282134
>wait_time_seconds
А оно за что отвечает? Мб задания дублируются как-то?
Аноним 31/01/22 Пнд 12:28:32 2282309 395
>>2282225
Это амазоновский параметр, регулирует вроде как частоту опроса или хз что вообще.
Просто суть в том что если gevent обрабатывает таски в нескольких тредах, то всё ок, но если только в одном треде - время между тасками равно этому параметру.
Аноним 31/01/22 Пнд 12:33:51 2282314 396
>>2282309
Просто сейчас создаётся впечатление, что воркер фризится и не знает какому треду отдать таск, из-за этого он не даёт его никому и ждёт пока селери опросит очередь.
Хотя по идее, он забирает данные сразу пачками, короче хз, какая-то залупа происходит.
pool solo работает очень быстро, prefork медленнее, а gevent вообще ждёт по 10с.
Я делаю тест, просто вывожу сообщение в лог, т.е нагрузки нет никакой
Аноним 31/01/22 Пнд 12:34:20 2282315 397
>>2280395
Хуйфы.
Как учиться, чему учиться, с какой целью.

На веб-дебила:
1. Язык, чтобы не спрашивать каждый раз "а что такое дикаратор" или "ой че-та библиотека не подгружается" или "пук строку не могу ревеснуть стак лох оверфлоу памахи"
Для этого нужно ботать книжки или доку. Ты конечно можешь сразу сесть и кодить, но это путь говнокодера, т.к тонкости языка пройдут мимо тебя.
2. Фреймворк. Нужно прочитать доку + сделать пару петов.
3. Основы веб: хттп, тлс, хэши, криптография, хтмл, ксс, основы сетей (базовое понимание как вообще запросы от юзера к сайту идут)
4. Инструменты: гит, гитхаб и прочая ссанина.
5. Базы данных.
Аноним 31/01/22 Пнд 13:17:00 2282353 398
>>2282315
Чтоб учиться нужен стимул и время.
У тебя дохуя времени, учишь тонкости-хуенкости, считаешь байтики, дорожки на платах, вычисляешь сопротивление, считаешь схемы транзисторов, как делаются процы. И всё ради того чтоб просто сервер поднять. А зачем это всё надо знать? Надо, ведь иначе ты говнокодер. Но да ладно, предположим что всем этим он будеть заниматься.
А какой у него будет стимул для этого? Ну, т.е он учит чего-то, но не видит результата, для этого нужен проект. Он не может просто писать код без задней мысли, потому что тогда станет говнокодером, ведь он ещё не знает как устроены конвейеры в проце.
Работать? Работать он не сможет.

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


Чтобы учиться кодить надо кодить. Просто брать задачи и делать, остальное будет приходить в процессе. Не надо бояться говнокодить, все проходят через говнокодинг. Ты ж когда был пиздюком в 1.5 годиков и учился говорить, не начинал же с грамматики, правильно? Здесь то же самое.
Аноним 31/01/22 Пнд 13:33:47 2282372 399
>>2282353
>У тебя дохуя времени, учишь тонкости
До уровня транзисторов доходить не надо, но основные конструкции языка + подводные камни лучше изучить до активного кодинга.

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

С остальным тоже самое: как ты будешь какое-нибудь веб-приложение писать, если не понимаешь хотя бы на среднем уровне как работает фреймворк? По туторам с ютуба будешь кодить? На каждую ситуацию тутора нет, а дока написана с учетом того, что человек знает язык, на котором она написана.
Аноним 31/01/22 Пнд 13:50:27 2282389 400
>>2282372
Дока зачастую написана уебищно, функции можно узнать по definition и то не всегда. Для этого не нужно знать чего-то сверх.
С фреймворками та же история, гуглишь базово как им пользоваться, а остальное в процессе.
Очень важно первостепенно сделать что-нибудь что работает, а оптимизацией занимайся потом. Не наоборот. С опытом придёт понимание как надо, а как не надо.

Если человек не может сам что-то делать и гуглить, значит он не умеет учиться самостоятельно, это уже проблемы совсем другого уровня. Он либо без вышки, где его учат учиться, внезапно, либо совсем без мозга.
Аноним 31/01/22 Пнд 14:11:08 2282396 401
123.jpg 85Кб, 1283x508
1283x508
Анон, прислали тестовое на джуна, помогай!
1) сущности - это же про модели? Правильно понимаю, что надо использовать связь многие к одному? (ингредиенты к одному рецепту)
2) Про JSON REST API в душе не ебу, но речь про функции представления? (views)
3) Написано делать бэкенд - то есть и шаблоны (templates) тоже пилить надо?
Аноним 31/01/22 Пнд 14:14:10 2282400 402
>>2282396
А сколько времени дают на такое тестовое?
Аноним 31/01/22 Пнд 14:16:05 2282403 403
123.jpg 66Кб, 1548x284
1548x284
Аноним 31/01/22 Пнд 14:22:22 2282411 404
>>2282403
7 дней на эту хуйню?
Как вы с такими тестовыми умудряетесь не вкатиться?
Аноним 31/01/22 Пнд 14:24:38 2282419 405
>>2282411
Да я и не собирался неделю пилить всё это. Просто уточняю у вас моменты эти, дабы не оподливиться. По факту проект у меня есть похожий, собирался сделать ctrl c - ctrl v.
Аноним 31/01/22 Пнд 14:26:29 2282421 406
Аноним 31/01/22 Пнд 15:23:56 2282471 407
Няши, что-то я не понимаю, как пользоваться асинхронными итераторами. Вот как это запустить?
https://pastebin.com/tW1G4rp9
Аноним 31/01/22 Пнд 15:32:43 2282478 408
Аноним 31/01/22 Пнд 15:34:06 2282481 409
>>2282403
Тебе его оплачивают?
Аноним 31/01/22 Пнд 15:45:59 2282485 410
>>2282396
> сущности - это же про модели?
Ага
>Правильно понимаю, что надо использовать связь многие к одному? (ингредиенты к одному рецепту)
Хз что ты имеешь ввиду, но есть такая штука, как нормальные формы реляционных отношений. Таблиц у тебя должно получится три - ингредиенты, рецепты и таблица связей ингредиент-рецепт
> 2) Про JSON REST API в душе не ебу, но речь про функции представления? (views)
Загугли, если не ебешь - с гугления программирование и начинается.
API - скорее control, а не view, если говорить в терминах MVC.
> Написано делать бэкенд - то есть и шаблоны (templates) тоже пилить надо?
Нет. шаблоном(представлением) данных в твоем случае будет их сериализованное в json представление.
Аноним 31/01/22 Пнд 15:59:41 2282490 411
изображение.png 36Кб, 783x250
783x250
>>2282478
А как? Я пробовал всяко, не получается.
Аноним 31/01/22 Пнд 16:35:50 2282505 412
>>2282485
Благодарю
>>2282481
Нет, офк. Я же вкатывальщик на джуна.
Аноним 31/01/22 Пнд 16:44:06 2282508 413
>>2282490
Прочитать текст ошибки.
>asyncio.run(AsyncFunc)
Ты запихиваешь в run функцию вместо корутины.
А корутина в данном случае - это то, что AsyncFunc возвращает
asyncio.run(AsyncFunc()) должно быть.
Но все равно не заработает. У тебя в __anext__ count вместо self.count.

Ну и не используй camelCase для функций.
Аноним 31/01/22 Пнд 19:37:27 2282658 414
>>2282508
Вот спасибо, всё понял.
Осталось ещё понять, в чём преимущество асинхронных итераторов, ведь всё равно они выполняются последовательно.
Я так предполагаю, что они нужны потому что в обычных итераторах нельзя сделать await и подождать выполнения какого-то асинхронного кода.
Но опять-таки, непонятно, почему нельзя. В джаваскрипте же, вроде, можно писать await где угодно перед промисами.
Аноним 31/01/22 Пнд 19:55:27 2282671 415
>>2282658
__iter__ и __next__ это синхронные функции, которые пишутся через обычный def, в них нельзя await писать
Аноним 31/01/22 Пнд 20:01:00 2282678 416
>>2282671
А вот почему в обычной функции нельзя написать await? inb4 потому что
Аноним 31/01/22 Пнд 22:03:05 2282821 417
>>2282678
Потому что вызов асинхронной функции порождает корутину и она до закидывания в луп не исполняется, а вызов обычной какой-либо результат сразу. Можно конечно было бы забить хуй и заставить интрепретатор определять что эта за хуйня на момент создания функции по наличию ключевого слова await, но это неудобно в том числе и для программиста во время чтения кода.
Аноним 31/01/22 Пнд 22:14:52 2282842 418
>>2282821
А в чём разница для программиста, кроме того, что он как минимум ещё одну функцию должен объявить с async, а потом ещё и передать ей управление, вместо того, чтобы просто сделать await в обычной функции?
Аноним 31/01/22 Пнд 22:18:44 2282848 419
6.PNG 11Кб, 323x459
323x459
7.PNG 2Кб, 129x96
129x96
Ачё всмысле, где асинхронность
Аноним 31/01/22 Пнд 22:20:29 2282851 420
>>2282848
Это синхронный слип.
Аноним 31/01/22 Пнд 22:27:25 2282864 421
>>2282851
И принт тоже синхронный?

Я-то думал мы пишем типа
t1 = await go()
...
...
if t1:
...
и он запускается в момент await и спустя какое-то количество строк кода, когда мы вызываем результат t1 он либо ждёт результата, если не успел, либо даёт результат

Если это работает не так, то это ж пиздец. Ладно, буду дальше посмотреть
Аноним 31/01/22 Пнд 22:29:59 2282868 422
>>2282864
Ладно, хватит каламбура. Как провернуть такое с requests?
Аноним 31/01/22 Пнд 22:31:07 2282870 423
>>2282864
Просто обычный слип блокирует весь скрипт, вместе с лупами и залупами.
Аноним 31/01/22 Пнд 22:39:58 2282882 424
6.PNG 14Кб, 322x461
322x461
7.PNG 2Кб, 122x131
122x131
3511818.jfif 44Кб, 468x895
468x895
Аноним 31/01/22 Пнд 23:23:42 2282921 425
>>2282864
>и он запускается в момент await и спустя какое-то количество строк кода, когда мы вызываем результат t1 он либо ждёт результата, если не успел, либо даёт результат
Не. При await следующие строчки не выполнятся, пока не завершится та асинхронная функция, которая указана после await.
А вот, кстати, хрен знает, как сделать так, как ты описал. Кроме как через asyncio.gather.
>>2282868
Очевидно, заменить его на httpx.
https://www.youtube.com/watch?v=m_a0fN48Alw
Аноним 31/01/22 Пнд 23:48:04 2282948 426
>>2282921
Жаль. В любом случае пока пользуюсь threadpoolexecutor и внимательно ищу узкие места где можно было бы сделать что-нибудь ещё помимо прочего.
Может когда-нибудь перейду на асинки. Когда сменю джангу на что-нибудь другое.
Аноним 31/01/22 Пнд 23:54:01 2282955 427
>>2282864
>И принт тоже синхронный?
Конечно.
А слип, видимо, слипу рознь. Наверное, этот слип отдаёт управление от питона операционной системе. А тут нужен asyncio.sleep, наверное, чтобы отдал управление эвент лупу, запущенному в asyncio.run
Аноним 31/01/22 Пнд 23:55:53 2282958 428
>>2282882
Создание таски автоматически закидывает корутину в луп, где начинается ее выполнение, последний await отрабатывает сразу, так как к этому моменту она уже закончена.
Аноним 01/02/22 Втр 00:12:51 2282966 429
>>2282882
Вообще непонятно, что тебя тут смущает. Ожидаемый результат же.
Аноним 01/02/22 Втр 01:58:55 2283003 430
>>2282842
А как ты декоратор тогда напишешь?
А как ты при наследовании будешь поступать?
А что, если я не хочу await-ить крутизну, а хочу ее через таск запустить?
Ну и нужно понимать, что корутина - это все всего лишь хитровыебаный генератор, а не какая-то магия.
Аноним 01/02/22 Втр 08:36:16 2283089 431
щас обнаружил что если создать функцию в которой любой аргумент по умолчанию пустой список, то при вызове этой функции несколько раз без "необязательного" аргумента она вызывается с одним и тем же списокм

например
def test(a, b = []):
b.append(a)
print(b)

test(1)
>> [1]
test(2)
>> [1, 2]
test(3, [])
>> [3]
test(4)
>> [1, 2, 4]

Как мне этого избежать, но сохранить возможность пустого списка как параметр по умолчанию?
Аноним 01/02/22 Втр 08:39:02 2283092 432
>>2283089
Вопрос решён самостоятельно
b = none
if not b:
b = []
bla bla bla
Аноним 01/02/22 Втр 09:55:43 2283114 433
Пилю гайд как выучить наконец-то джангу.

Смотрим джангу за час, или быстро читаем доки примеры с опросами.
Далее. Находим начинатора. Я выбрал divanov11 и его репу. Он пилит сайты на джанго.
Начинаем читать чужие коды.
Как читать.
Смотрим в самом проекте на урлы и сеттинги. Тут все.
Далее в самом эппе смотрим
Модели, формы, урлы и вьюшки. Именно в таком порядке читаю. Понял вообще все.
Далее что почитать.
Чужие коды искать на гите так
туду эппы, маст хэв, понимается круд технология.
всякие блоги хуеги
можно почитать туторы от мозиллы, и сделать их задание сделать блог, но я и так нашел и чекнул на гите.
Начинаем пилить хелло ворд на джанге. Далее думаем о шаблонах. Кроме красивых шаблонов в джанге проблем я не нашел. Любой чих задокументирован, куча примеров на гите.
Аноним 01/02/22 Втр 10:05:44 2283125 434
Аноним 01/02/22 Втр 10:06:53 2283126 435
>>2283114
Вот я делаю приложуху на джанге и хочу чтоб все рендерилось на стороне сервера, то есть чтоб на клиенте js было по минимуму. И как быть со всеми этими шаблонами? Там же анрил как-то порядок держать. А ещё если из шаблона передавать данные в js скрипт, то это вообще каша получается и боль.
Аноним 01/02/22 Втр 11:06:19 2283169 436
>>2283003
>А как ты декоратор тогда напишешь?
>А как ты при наследовании будешь поступать?
Не понимаю, чем await внутри обычной функции помешает сделать ей декоратор или как await внутри обычного метода помешает его переопределить.
>А что, если я не хочу await-ить крутизну, а хочу ее через таск запустить?
А что этому помешает, если await можно будет внутри обычных функций использовать?
>Ну и нужно понимать, что корутина - это все всего лишь хитровыебаный генератор, а не какая-то магия.
Всё равно не понимаю. В чём проблема дождаться завершения работы хитровыебанного генератора в обычной, а не асинхронной процедуре?
Аноним 01/02/22 Втр 12:51:11 2283280 437
изображение.png 32Кб, 1312x358
1312x358
>>2282658>>2283169
>пОчЕмУ нЕлЬзЯ пОдОждАтЬ коРуТиНу вНе аСинХроНноЙ фУнКциИ
>в жАбАсКриПтЕ мОжНа
Шизоебанаты.
Аноним 01/02/22 Втр 12:59:57 2283295 438
>>2283280
Ты мудак?
Ну, в джаваскрипте тоже нельзя. Но почему?
Аноним 01/02/22 Втр 13:04:14 2283306 439
>>2283295
Прочитать два абзаца о том, что такое корутина и как они реализованы не можешь ты, а мудак я. Ясн.
Аноним 01/02/22 Втр 13:09:54 2283315 440
>>2283306
Ты хочешь сказать, что это просто?
То есть ты не можешь на простой вопрос ответить, и вместо этого начинаешь писать оскорбления, и после этого ты не мудак? Ясн.
Про какие два абзаца ты написал - вообще непонятно. Ты хоть понимаешь, что в интернете миллиарды абзацев?
Аноним 01/02/22 Втр 13:19:28 2283326 441
Аноним 01/02/22 Втр 13:32:33 2283347 442
>>2283326
Мудак. Потому что мог бы либо помочь не оскорбляя, либо пройти мимо. С чего ты вообще взял, что я программист? Может, я таксист? Ты вот знаешь, где улица Есенина? Не знаешь? Шизоебанат, загуглить не можешь?
А ссылка твоя хуёвая, не работает нихуя. Она же по логике вещей должна гуглить за меня, а она не гуглит, только делает вид, что собирается погуглить. Это какое-то наебалово. И вообще, на английском непонятно. На русском два абзаца дай. А пока не дал - не пытайся умничать, что кто-то не может их прочитать.
Аноним 01/02/22 Втр 13:38:18 2283353 443
>>2283347
Хуево быть тобой, за два часа не смочь найти ответ.
Ну, значит, не особо он тебе и нужен, таксист вполне себе хорошая профессия.
Аноним 01/02/22 Втр 13:52:22 2283374 444
>>2283353
Я и не искал. Ты ведь сказал, что для этого нужно прочитать два абзаца, и я жду, когда ты уточнишь, которые именно. А ты юлишь жопой. Наверное, ты просто боишься, что я брошу таксовать и отберу у тебя рабочее место с зарплатой 300 к в наносек.
Аноним 01/02/22 Втр 15:15:27 2283470 445
Такой вопрос. По джанго.
Есть два хтмл файла например.
home.html
blog-page.html
Простой блог. Где домашняя и там где будут статьи.
Так вот. Как сделать пагинацию чтобы все это дело множилось?
Аноним 01/02/22 Втр 15:52:27 2283509 446
Есть ли в джанге сигнал апдейта модели через .update? Гулятся только костыли.
Аноним 01/02/22 Втр 16:19:27 2283528 447
>>2283470
>Как сделать пагинацию чтобы все это дело множилось?
Без задней мысли. Ты делаешь запрос, в ответ тебе приходит json с какими-то там статьями, штук 30 например, ты их рендеришь в шаблоне. И делаешь ссылку на следующие 30 штук
Аноним 01/02/22 Втр 17:26:54 2283610 448
Как передать аргумент в функцию данном случае?

Вот функция:

def savetofile(filename):
file = open('{filename}.csv', 'w')
...

Вот вызов:

savetofile(001)

В итоге вместо создания файла 001.csv создается файл {filename}.сsv
Аноним 01/02/22 Втр 17:41:27 2283629 449
Аноним 01/02/22 Втр 17:54:31 2283642 450
>>2283528
А если я типо сам вылаживаю статьи?
Аноним 01/02/22 Втр 18:01:40 2283648 451
image.png 205Кб, 1369x1178
1369x1178
image.png 6Кб, 568x35
568x35
Блин, не понимаю. Куда вводить пасскод?
Вот метод massege принимает параметр passcode, это булевая переменная, а куда сам пасскод-то назначать? Почему у двача такая уебищная документация...
Аноним 01/02/22 Втр 18:15:09 2283663 452
>>2283610
f, format, % дохуя способов.
Сразу проиграл, вспомнив, что у пистона ДОЛЖЕН БЫТЬ ОДИН СПОСОБ СДЕЛАТЬ ЭТО И ПРИ ЭТОМ -САМЫЙ ОЧЕВИДНЫЙ
Аноним 01/02/22 Втр 18:21:36 2283668 453
>>2283648
Открыть исходник и посмотреть, как оно там сделано.
Аноним 01/02/22 Втр 18:31:01 2283680 454
>>2283663
Ну и очевидно, что f-strings самый правильный. А остальные оставлены для обратной совместимости. Короче, нужно тонкости языка знать и понимать, впрочем, как и везде
Аноним 01/02/22 Втр 18:36:10 2283688 455
>>2283680
Юзаю везде format, что я делаю не так?
Аноним 01/02/22 Втр 18:37:14 2283690 456
>>2283688
Юзай f-string, они быстрее и удобопонятнее.
Аноним 01/02/22 Втр 20:05:36 2283808 457
>>2283374
>нужно прочитать два абзаца, и я жду, когда ты уточнишь, которые именно
>отберу у тебя рабочее место с зарплатой 300 к в наносек
О дивный манямир
Аноним 01/02/22 Втр 20:50:42 2283833 458
>>2283629
>>2283663
>>2283680
Окей, подставлять переменную в название файла получилось:
file = open(f'{filename}.сsv', 'w')

А как быть вот с такой конструкцией?
file.write(tabulate({filename}().to_values(), headers=headers, tablefmt="tsv"))

Максимум что получается через f-string - это записать строку "tabulate(название файла().to_values(), headers=headers, tablefmt="tsv")" в файл "название файлаю.csv". В остальных вариантах {filename} вообще не распознается.
Аноним 01/02/22 Втр 21:28:44 2283861 459
>>2283833
Бля, чел, не дави тупостью, если у тебя там какие-то операции над переменной - сделай новую
filename = '_'.join(filename.to_values())
file.write(f'tabulate{filename}.csv') Или что там у тебя
Аноним 01/02/22 Втр 22:02:21 2283895 460
>>2283690
Т.е. если мне надо маппинг распаковать, писать f'{mapping["key1"]} ... {mapping["key2"]} ... ' вместо '{key1} ... {key2} ... '.format_map(mapping) ? Принял к сведению))
Аноним 01/02/22 Втр 22:43:22 2283951 461
помогите преобразовать spisok = ['1 2 3', '4 5 6'] в [1, 2, 3, 4, 5, 6]
пробовал через for n in spisok но чет жидко обосрался с ошибкой <generator object <genexpr> at 0x01E14F00>
Аноним 01/02/22 Втр 22:44:54 2283953 462
image.png 58Кб, 1847x375
1847x375
image.png 55Кб, 1723x288
1723x288
image.png 2Кб, 252x41
252x41
Что я делаю не так?
Аноним 01/02/22 Втр 23:03:16 2283993 463
Аноним 01/02/22 Втр 23:06:45 2283996 464
Аноним 01/02/22 Втр 23:07:03 2283998 465
>>2283808
Ну так не бойся и покажи, что за абзацы такие.
Аноним 01/02/22 Втр 23:09:18 2284001 466
>>2283996
Бляяя, анон, спасибо! Пиздец я долбоеб слепой, уже полчаса сижу тыкаю, не могу понять в чем проблема.
Аноним 01/02/22 Втр 23:13:25 2284005 467
изображение.png 4Кб, 167x27
167x27
изображение.png 8Кб, 247x41
247x41
Аноним 01/02/22 Втр 23:14:41 2284007 468
>>2284005
А, подсказали уже.
Конечно, макака долбоёб. Везде пасскодом называет, а в апи нет - юзеркод, блядь, а потому что на хуй пошли, вот почему.
Аноним 01/02/22 Втр 23:21:04 2284012 469
>>2284007
Чтоб такие как ты ее взламывали макабу.
Я бы вообще использовал какой-нибудь md5 вместо названия поля
Аноним 01/02/22 Втр 23:27:31 2284021 470
>>2283951
Чё-то типа
puk = [*pok.split(..) for pok in kok]
Только я не помню как разворачивать его, наверное ещё надо что-то сделать. Ну или вариант на две- три строки
Аноним 01/02/22 Втр 23:30:44 2284028 471
>>2283895
Конечн принимай, принимай ещё что фстринги быстрее
Аноним 01/02/22 Втр 23:33:43 2284033 472
image.png 13Кб, 953x58
953x58
>>2283953
>>2283996
>>2284005
>>2284007
Короче, пацаны, с юзеркодом я конечно проебался, но мне бы консоль написала, что инвалид параметр, проблема была в том, что Get запросы не принимают message body, только хэдеры, нужно вот эту хуйню перед параметрами добавлять
Аноним 02/02/22 Срд 00:01:26 2284069 473
Аноним 02/02/22 Срд 00:05:54 2284079 474
>>2284069
>>2284021
>>2283951
In [1]: import itertools

In [2]: puk = ['1 2 3', '4 5 6']

In [3]: list(map(int, itertools.chain.from_iterable([pok.split(' ') for pok in puk])))
Out[3]: [1, 2, 3, 4, 5, 6]
Аноним 02/02/22 Срд 00:41:18 2284112 475
>>2284033
В доке же написано запрос с параметрами. Тебе надо params.
Аноним 02/02/22 Срд 01:14:31 2284128 476
>>2284079
>>2284021
хуя жеские. Я не знал про itertools и map (я только учусь), и смог вывести ['1 2 3', '1 2 3'] через цикл с с записью в пустой массив с исключением пробела. Получилось
>puk = ['1', '2', '3', '1', '2', '3']
А требуется
>puk = [[1,2,3][1,2,3]]
Простым словом, я изначально сам себе неправильно поставил задачу и теперь надо как-то исправлять.
Аноним 02/02/22 Срд 01:19:16 2284134 477
>>2284128
Убрать itertools, внести внутрь map, дальше сам
Аноним 02/02/22 Срд 01:28:24 2284141 478
>>2284134
Я пока еще не дошел в курсе до itertools и map, предполагается что я решу все с помощью циклов. Думаю с помощью цикла проверить каждый элемент, в него вложить цикл с условием который будет менять символы пробелов в элементах на запятую, и потом надо будет вспомнить как поменять значение в элементе с str на int через его индекс.
Аноним 02/02/22 Срд 01:37:22 2284147 479
>>2284128
Хз в чём проблема, так даже проще
puk = [int(pok.split(" ") for pok in kok)]
Аноним 02/02/22 Срд 01:44:23 2284152 480
>>2284079
Зачем так сложно
puk = []
[puk.extend(pok.split(" ")) for pok in kok]
Аноним 02/02/22 Срд 03:11:56 2284182 481
image.png 23Кб, 1101x153
1101x153
Есть класс который подгружает аттрибуты в реальном времени из файла
Аттрибут всегда лямбда функция где ВАЖНЫЙ параметр это имя самого аттрибута (поэтому загрузка из файла что бы в лямбду передать строку)

Дальше будет сложно объяснить, но я хочу лишиться парсинга из файла

Могу ли я сделать так что бы имея одну фунцию и при написании object.blablabla я бы получал ссылку на свою функцию куда в параметр будет передан аттрибут blablabla ?
Блять пиздец я тупой даже не знаю как скачать что мне нужно
Послушаешь себя так у меня шиза вообще, но функция везде реально одинаковая, отличается только одна строка переданая в параметр


на пикче мой шизокод
Проблема в том что при обновлении api мне нужно будет обновлять файл и записывать туда новые функции и выписывать старые, а вообще похуй на самом деле чё в функцию передавать, если у api такой функции нет, он мне просто ошибку вернёт, поэтому тут уже мне нужно будет следить что я пытаюсь вызвать
Аноним 02/02/22 Срд 03:31:43 2284184 482
Аноним 02/02/22 Срд 03:39:06 2284185 483
>>2284184
Ебать, спасибо огромное
Живи век добрый человек
Аноним 02/02/22 Срд 09:31:09 2284249 484
Аноним 02/02/22 Срд 09:49:32 2284258 485
>>2283895
Если у тебя такая вереница получается, которую нельзя свести к более простой конструкции, значит ты пишешь говнокод
Аноним 02/02/22 Срд 10:26:34 2284295 486
Аноним 02/02/22 Срд 10:55:48 2284314 487
>>2284152
В int преобразовать не забудь
Аноним 02/02/22 Срд 11:14:32 2284323 488
>>2284182
Сделай просто py файл. Зачем такие изьебства. Хранить конфиги в py это нормально
Аноним 02/02/22 Срд 11:47:23 2284343 489
PepeNote.png 20Кб, 128x102
128x102
>>2284258
Динамические SQL-запросы с кучей параметров это у нас теперь вереница и признаки говнокода, так и запишем.
Буду тогда построчно джойны форматировать через f', а потом конкатенировать через if-elif в единый скрипт, так будет не говнокод))
Аноним 02/02/22 Срд 11:51:40 2284347 490
>>2284343
В этом случае это
>'{key1} ... {key2} ... '.format_map(mapping)
ненамного лучше f-strings. Какие же двачеры дегенераты, им дают удобную фичу, а они продолжают кушать говно.
Аноним 02/02/22 Срд 12:05:55 2284374 491
>>2284347
Где лучше, ебанат? Скорость себе в очко засунь, толку от твоих десятков милисекунд никакой.
С ф-стрингами мне надо явно указывать название маппинга и обращаться к ключу через ['ключ']. Если потом поменяется название маппинга, мне руками лишний раз ctrl-c + ctrl-v делать? А если набор ключей поменяется, руками лезть и заменять всю эту портянку?
С форматом мне достаточно указывать только ключи и распаковать маппинг. Если поменяется маппинг - поменять маппинг в формате, если поменяется набор ключей - через дикт компрехеншн отфильтровать. Ой забыл, это же всё говнокод, надо всё на ф-стринги переводить, ебаться с конкатенацией, чтоб сэкономить милисекунды на форматировании, но добрать их на конкатенации, зато фичу использую.>>2284347
Аноним 02/02/22 Срд 12:08:27 2284378 492
Поясните плис за шаблоны проектирования. Вроде же в питоне уже все встроено чтобы кодить по всем канонам, там уже все шаблоны реализованы же, нет?

Например паттерны - структурные, порождающие и прочее.
А как быть с SOLID, это же про ООП?
И про GRASP это нужно и чем отличается?
Аноним 02/02/22 Срд 12:12:54 2284387 493
>>2284374
Да, это говнокод, если тебе уж так необходимо всегда передавать длинный список параметров, то выдели его в структуру или класс, это БАЗА рефакторинга.

>Если потом поменяется название маппинга, мне руками лишний раз ctrl-c + ctrl-v делать?
Решается простейшей глобальной заменой, к тому же, навряд ли у тебя эта переменная будет в одном месте. Но если ты настолько беспомощен, что не может пользоваться ей, то что ты вообще делаешь в программировании?

>если поменяется набор ключей - через дикт компрехеншн отфильтровать
Лол. И разве это не говнокод?
Аноним 02/02/22 Срд 12:16:16 2284391 494
>>2284378
Паттерны (или шаблоны) проектирования описывают типичные способы решения часто встречающихся проблем при проектировании программ.

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

В пайтоне уже некоторые паттерны реализованы, да, типа фабрики, декоратора, итератора, но никто не мешает тебе реализовать и другие
Аноним 02/02/22 Срд 12:20:09 2284393 495
>>2284387
>выдели его в структуру или класс
У меня это так и работает, распаковка сериализованных данных из MyClass.dict().
По твоей логике мне надо всё засрать 'MyClass.dict()["ключ"]'.

>решается простейшей глобальной заменой
Глобальной заменой чего, класса? У меня разный набор входящих данных сериализуется в отдельных функциях, причем тут вообще глобальная замена?

>Лол. И разве это не говнокод?
Потому что ты так скозал - да.

Аноним 02/02/22 Срд 12:33:41 2284412 496
>>2284387
Добавлю к >>2284393
>если поменяется набор ключей - через дикт компрехеншн отфильтровать
Вообще я могу это делать на уровне класса, но в том же пайдантике есть параметры типа exclude_unset, так что это пример для чистого дикта.
Очередная экономия на спичках, и лишь бы доебаться со своими фишечками, где они удобны только в простых случаях. Никто это переделывать и переписывать не будет, т.к. всё работает и так и никто на ревью не доёбывался.
Аноним 02/02/22 Срд 17:00:22 2284688 497
>>2284412
Запиши это в комментах к коду, чтоб после тебя, когда его будут править другие люди, они видели чем ты руководствовался
Аноним 02/02/22 Срд 17:10:47 2284701 498
Двощ, поясни, как быть. Учусь скраптить странички, пользую селениум. На одном из этапов кликается кнопка:
element = wait.until(
EC.element_to_be_clickable((By.ID, "scroll"))
)
element.click()
После чего начинается новомодный скролл траницы с отрисвокой. Но мне нужно кликнуть на то, что отрисуется после скролла.
Проблема в том, что этот элемент "clickable" сразу, а скролл-то ещё не доехал и этого элемента не видно. Как можно без sleep() заставить движок подождать завершения скрола?
Аноним 02/02/22 Срд 17:23:24 2284713 499
>>2284688
Пока мой код дойдёт до рефакторинга пара команд сменится, либо его перепишут на goвно
Аноним 02/02/22 Срд 17:28:37 2284723 500
Анончики, я тут понял, что не очень понимаю конструктивные особенности if-else.
Есть ли какая-то принципиальная разница, если я напишу if - elif - elif - else или if-if-if-if?

https://ideone.com/3vhGMk линкрил.
Аноним 02/02/22 Срд 17:30:09 2284724 501
>>2284688
Побежал во всех проектах переделывать формат на ф-строки и отправлять пулл реквесты с комментарием "Руководствовался советами с двача, чтоб сэкономить 20 миллисекунд"
Аноним 02/02/22 Срд 17:57:00 2284777 502
>>2284723
Во-первых, страдает читабельность.
Много ифов намекает, что может быть несколько совпадающих условий для одного случая. А иф-елсиф-елс это только один вариант.
Ну и делать инвертированый вариант всех условий для елс это тупо и не всегда возможно.
Аноним 02/02/22 Срд 17:59:58 2284780 503
>>2284777
>Много ифов намекает, что может быть несколько совпадающих условий для одного случая. А иф-елсиф-елс это только один вариант.
Справедливо. Оке, понял, спасибо.
Аноним 02/02/22 Срд 18:12:56 2284790 504
>a = '0'*10000
>if len(a) > 0:
> print('Питон говно.')
Аноним 02/02/22 Срд 18:17:33 2284797 505
>>2284790
Горелодупый жабий скриптовик, ты?
Аноним 02/02/22 Срд 19:49:39 2284906 506
>>2284713
Был проект, предложили переписывать. Говорил, давайте на го сделаем, он быстрее, можно на микросервисы сделать, согласились. А потом звонят и говорят, ну его, давай лучше на джанге, так быстрее чем го осваивать.
Аноним 02/02/22 Срд 19:53:49 2284912 507
ok-javascript-7[...].png 25Кб, 500x666
500x666
Аноним 02/02/22 Срд 20:38:59 2284976 508
794245286fea2f2[...].jpg 50Кб, 672x653
672x653
у меня жопу сейчас порвало от того что решал задачу на курсе по питону два вечера и код был похож на отрыжку индуса в 16 строк, а в коментах какая-то тяночка скинула частичное лаконичное решение в 5 строчек (коменту несколько лет и потереть его забыли походу), я специально загуглил и она даже нихуя не работает в айти.
А у вас было такое?
Аноним 02/02/22 Срд 21:01:54 2285014 509
>>2284976
Покажи задачку хоть, может там ваще хуйня для однострочника.
Аноним 02/02/22 Срд 21:07:08 2285019 510
>>2267035
Интерпретатор код читает справа на лево
Аноним 02/02/22 Срд 21:33:44 2285057 511
>>2285014
Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности строк. После последней строки матрицы идёт строка, содержащая только строку "end" (без кавычек, см. Sample Input).

Программа должна вывести матрицу того же размера, у которой каждый элемент в позиции i, j равен сумме элементов первой матрицы на позициях (i-1, j), (i+1, j), (i, j-1), (i, j+1). У крайних символов соседний элемент находится с противоположной стороны матрицы.

В случае одной строки/столбца элемент сам себе является соседом по соответствующему направлению.
Аноним 02/02/22 Срд 22:43:06 2285100 512
>>2285057
https://github.com/Testudinate/Python/blob/master/26_while_matrix.py
Если такие малочитабельные list comprehensions использовать, то почти любой достаточно большой код на Питоне можно сократить в полтора раза. "В пять строчек" твою задачу без них (ну или без itertools или numpy) решить никак нельзя.
Лично я при одинаковой алгоритмической сложности предпочту решение в 16 строк, чем в пять, но подобное.
Аноним 02/02/22 Срд 22:50:02 2285109 513
>>2285100
>li, lj = len(m), len(m[0])
Бля, вроде очевидная такая хуйня, а меня на нее осенило только после того как кругами раз 20 по комнате походил, потом еще записал в отдельный текст и сохранил на рабочем столе что
>количество элементов в списке a[0] - это количество столбов, количество вложенных списков в a[] это количество строк.

вроде и интересно такое все решать, а вроде и жепу рвет.
Аноним 02/02/22 Срд 22:53:56 2285113 514
>>2285100
>>2285109
Ну и вообще спасибо что показал оптимальное и понятное решение.
Аноним 02/02/22 Срд 22:54:40 2285114 515
Анчоусы, у меня есть несколько дат в формате вот в таком формате: 2020-12-13T09:23:25Z
Подскажите, как мне посчитать разницу в минутах между двумя этими датами? Никогда не работал с таким типом данных, вообще хз.
Аноним 02/02/22 Срд 23:09:20 2285124 516
>>2285114
Импортируешь в datetime, а там есть функции для разницы.
Аноним 02/02/22 Срд 23:26:03 2285140 517
Как нормально писать код, сил нет.
Пишешь сервер, всё хорошо, всё по полочкам, на своих местах. А потом в какой-то момент это превращается в какую-то мешанину, особенно бизнес логика и условный tasks превращается в какую-то помойку из независимых классов на 2к строк по 10-20 методов, которые вроде как дублируют друг друга, сука, и в то же время нет, потому что отличаются какой-нибудь специфичной залупой.
Трясёт уже от этой херни. Чувствуешь себя конченым дебилом
Аноним 02/02/22 Срд 23:28:19 2285143 518
>>2285140
Ещё самое обидное, что некому это ревьюить. Сидишь себе в этой замкнутой бочке и перевариваешься в собственном соку до состояния говна. Ни спросить ни посоветоваться, нихуя. Только на прод выкати завтра, а дальше ебстись как хочешь
Аноним 03/02/22 Чтв 01:09:49 2285226 519
>>2285143
У меня на ревью кода, я отправл на ревью, был косяк, в словаре закомментил строку и подсунул True для проверки что там будет выводиться при разных данных. Так на ревью апрувнули без вопросов. Сук, как это бесить, хоть блять 1/0 пиши, апрувнут не глядя
Аноним 03/02/22 Чтв 01:46:33 2285246 520
56666.PNG 2Кб, 316x49
316x49
Кто в vscode работает, как фиксить это дерьмо? Либа кривая или че?
Аноним 03/02/22 Чтв 01:55:13 2285250 521
>>2285246
Просто редактор не подтягивает методы декоратора, как я понял.
Аноним 03/02/22 Чтв 02:26:55 2285254 522
Аноны, мне очень стыдно, но не могу разобраться, как сделать задачу. Суть:
У меня есть список кортежей: [('ask', 421), ('answer', 634), ('answer', 125), ('answer', 285), ('ask', 755), ('ask', 451), ('answer', 935), ('ask', 633)]

Мне нужно профильтровать его так, чтобы у кортежей чередовалось первое значение. Если повторяется значение 'answer', то мне надо выкинуть из списка все кортежи, кроме первого в этом повторении. Если повторяется значение 'ask' - то выкинуть все, кроме последнего в этом повторении. По итогу фильтрации должен остаться такой список:
[('ask', 421), ('answer', 634), ('ask', 451), ('answer', 935), ('ask', 633)]

Первым значением в кортеже всегда бывает либо ask, либо answer, второе значение в кортеже не играет роли (но мне надо соблюсти изначальную сортировку). ask/answer может и не повторяться, а может повторяться 2-5 раз подряд.
Аноним 03/02/22 Чтв 03:17:03 2285260 523
Аноним 03/02/22 Чтв 03:43:27 2285262 524
Почему воркер gevent пулит очередь с большой задержкой чем prefork? Причём он задерживает ответ, завершает таск, но отправляет ответ брокеру только спустя 10 секунд.

Олимпиадные задачки тут нарасхват вижу, а обсудить подобные проблемы нет. Такое чувство будто в треде одни вкатуны.
Аноним 03/02/22 Чтв 03:53:42 2285263 525
16319073777300.webm 8990Кб, 720x476, 00:04:43
720x476
>>2285260
Охуеть, спасибо, анончик! Только как это работает? Вообще не могу понять.
Аноним 03/02/22 Чтв 04:11:37 2285265 526
>>2285263
groupby нарезает последовательность на группы по ключу, первому элементу тупли в данном случае. Потом по этому же ключу выбираем, какой элемент взять из группы.
Аноним 03/02/22 Чтв 11:47:59 2285403 527
Где перекат?
Аноним 03/02/22 Чтв 12:03:58 2285421 528
image.png 421Кб, 1210x783
1210x783
Помогите с задачей пожалуйста, не могу дойти до решения
Аноним 03/02/22 Чтв 12:54:02 2285473 529
Аноним 03/02/22 Чтв 13:08:14 2285488 530
>>2285421
Ты где такое взял? Это что-то на динамическое программирование. Да ещё с какой-то начальной эвристикой. Какие хоть ограничения по времени, сложности, памяти?
А ещё подпись про 64 битный ввод намекает, что предлагается решение не на питоне.
Аноним 03/02/22 Чтв 13:27:31 2285514 531
>>2285488
ограничение по времени 5 секунд, ограничения по памяти нет

>А ещё подпись про 64 битный ввод намекает, что предлагается решение не на питоне.
в питоне же int не ограничен или я ошибаюсь?
Аноним 03/02/22 Чтв 13:29:39 2285518 532
Аноним 03/02/22 Чтв 13:33:38 2285521 533
>>2285518
тогда какая проблема с 64 битным вводом? могу ведь считать все в строку а потом в инты уже
Аноним 03/02/22 Чтв 15:27:13 2285621 534
Аноним 03/02/22 Чтв 15:41:28 2285637 535
>>2285421
Упорядочим A по возрастанию. Теперь для заданного x_0 проверить порождает ли x_0 хорошую последовательность можно за O(n) времени, так как можно доказать, что элементы из A оптимально брать в порядке возрастания. Теперь запускаем бинарный поиск для x_0 с границами 1 и M = max(A). Сложность по времени на этом шаге составляет O(n) * O(log M). Для заданных ограничений должно уложиться.
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов