Это копия, сохраненная 1 февраля 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий: >>2138718 (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
лол
Сейчас бы нонейма слушать
Евангелист Мозиллы, который стал придворным шутом в ХТМЛ Академии. Лицо представили?
if a == b or a ==c or a ==d
более компактно записать?
Эт вроде зависит от используемых библиотек + от системы
a in (1, 2, 3)
for elem in (b, c, d):
----if a == elem:
--------do_shit()
но вообще так не делают ,пиши нормально
У тебя синдром дефицита внимания и гипеактивность. Ты не разобрался в аргументах видео и того, что тут говорили, а сразу постить сюда пытаешься.
> File "/home/<anon>/demo.py", line 5
> print("World")
> ^
>IndentationError: unindent does not match any outer indentation level
Для питона и yaml проблема имеет особое значение, потому что табы и пробелы несовместимы между собой. Ещё особая роль у табов в make-файлах.
Здесь проблема чуть сложнее, чем визуальное отображение в редакторах.
Ты можешь спокойно использовать табы, но только если пышешь проект один или в одну команду с общими правилами, и твой код полностью изолирован от другого кода, никаких копи-паст, бойлерплейта и т.п.
Учти, что библиотечный код питона при этом тоже полностью на пробелах.
Корень проблем в совместимости, а не во вкусах.
Долбоеб блять
Тебе уже 500 раз пояснялось, что современные ide изи конвертируют табы в пробелы
Ты че в блокноте или в виме хуяришь?
Напоминаешь шизика, который топит за написание жс-кода исключительно в стиле es5 "шоб точно работало во всех браузерах", когда ему начинают пояснять про транспиляторы, лишь раздаются визги "вы ничо не понимаете" и наша принцесса убегает в закат
У тебя не просто СДВГ, но ещё и какие-то аффективные расстройства коммуникации.
Вот ты пишешь код. Я хочу внести в него правку. Чтобы я смог внести правку, мне надо под твой файл перенастроить редактор, чтобы он работал с табами. Когда в соседнем окне и для других людей мне нужны настройки с пробелами. Нет, я не буду перенастраивать редактор, просто не буду в твой код что-то вливать. И не пущу тебя в свой код, чтобы ты там табами пачкал.
Да, если вдруг твой код мне понадобится, то я легко пропущу его через автозамену. Но только я тебе потом влить его не смогу, потому что он полностью перезатрёт твой.
Проблема совместимости. А отсюда то, как принято в сообществе. В сообществе питона только пробелы.
Можешь жить в своём мирке и делать как считаешь идеальным, с сообществом не пересекаться, никто не запрещает.
Падажжи, если они конвертируют, и в итоге все равно в коде пробелы, то за какие именно табы копротивление? Чисто за клавишу что ли? Ну так что жать - это дело вкуса, тебе-то какая разница кто каким пальцем отступы ковыряет, если в коде один фиг пробелы получатся.
Алсо, кулстори в тему - пришел как-то проект на поддержку, там не было соглашений/линтеров и т.п., не удивлюсь, если часть предыдущих разрабов в блокноте код писала. Потому что по всему проекту было сраное месиво из табов и пробелов. Так вот когда мы его завели в гит, оказалось что в интерфейсе битбакета таб равен ВОСЬМИ пробелам. Как это выглядело - врагу не пожелаешь. пыха, хуле
> мне надо под твой файл перенастроить редактор, чтобы он работал с табами
Он сам работает с табами, дурында. Ты вообще с этим не сталкивался, а корчишь знатока. Съеби.
Редактор с пробелами сможет загрузить табы и наоборот, вопрос только в консистентности, которая как раз соблюдается в масштабе одного редактора.
В рамках одного проекта, одной кодовой базы, невозможно совмещать табы и пробелы. Для питона в виду известных вещей это абсолютно критично.
Или твой проект должен быть на табах, или на пробелах. Таб это символ с кодом аски-кодом 9, пробел это символ с аскикодом 32.
Можно рассуждать на тему как идеологически правильнее, но делать надо так, как принято в индустрии, чтобы не создавать проблемы.
Когда ты пытаешься внедрять табы в питон-код, ты создаёшь большие проблемы для других. Причём из-за ерунды. Вот и всё.
Когда будешь вести какие-нибудь серьёзные проекты, когда сможешь пытаться правила навязывать. Только не будешь, потому что с тобой никто в команде работать не захочет. А в одиночку серьёзные вещи не делаются.
Я не понимаю, почему ты споришь. Это настраивается и это работает. Ты с этим не сталкивался, потому что это работает, а всё равно споришь.
>невозможно совмещать табы и пробелы
бляяяя
ты врубаешься вообще что таб конвертируется в пробел и наоборот по щелчку пальцев мыши? или нет?
Ты предлагаешь лезть куда-то в настройки и чего-то править то в одну сторону, то в другую. Зачем?
Вот ты залил на гитхаб код с табами. Мне надо серьёзно переработать код. Я его скачиваю, делаю замену на пробелы. Если я после этого волью правки, с точки зрения гида это будет уже весь мой код, 100% замена кода будет. Мне надо конвертировать пробелы в табы обратно? И помнить, какой файл в каком формате?
Есть единые стандарты. Они не всегда идеальные, но их надо придерживаться, если нет возможности стандарты изменить.
А такой возможности нет. Переписывать все проекты на табы никто не будет, только потому, что так тебе кажется более современным.
Ты в курсе как работает ide?
Код показывай, мы то откуда знаем какие у тебя либы и как все настроено
Тупой редактор так делает. Нормальный смотри что там было и оставляет - были табы оставит табы, были пробелы заменит таб на пробелы (vscode).
Твои действия?
Неси пивас, Петрович, вкатим тебя.
Анонче, реквестирую книгу по асинхронному веб питонычу. Вообще задача вникнуть в Django Channels , но я готов начать и с каких-нибудь асинхронных фреймворков в общем смысле.
винда?
взял и установил дефолтный интерпретатор с оф сайта для начала, потом и анаконду душить будешь
Ну вот мне бы вникнуть в это все с азов. Дальше задачи об обедающих филасафах с курса операционных систем и базовых упражнений по запуску тредов я не делал. Вообще для этого можно сразу на Go писать, но задача для начала разобраться с питоном в этом вопросе(в вопросе асинхронного веба)
go на мультрединге хуярит а не на асинхронище если че
почитай про промисы в жс и event loop https://learn.javascript.ru/promise-basics https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
потом про генераторы, ебана, в питоне асинхронка на генераторах https://webdevblog.ru/vvedenie-v-generatory-python/ https://realpython.com/introduction-to-python-generators/
потом про async/await питоновский и asyncio какие-нибудь курсы позырь
Удали к херам анаконды и сторонние питоновские интерпретаторы, загрузи установщик с python.org и ебошь
>go на мультрединге хуярит
Там неявное переключение контекста, то есть await'ы есть, но их расставляет за тебя компилятор
https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part2.html
>What’s brilliant about the Go cooperating scheduler is that it looks and feels preemptive. You can’t predict what the Go scheduler is going to do. This is because decision making for this cooperating scheduler doesn’t rest in the hands of developers, but in the Go runtime. It’s important to think of the Go scheduler as a preemptive scheduler and since the scheduler is non-deterministic, this is not much of a stretch.
>There are four classes of events that occur in your Go programs that allow the scheduler to make scheduling decisions. This doesn’t mean it will always happen on one of these events. It means the scheduler gets the opportunity.
>The use of the keyword go
>Garbage collection
>System calls
>Synchronization and Orchestration
базаришь
команда питон, причем питон 3 это норма.
а конда вроде работает только в виртуальном окружении?
наверное поэтому не видит питон на компе.
по крайней мере из строки ты просто можешь запустить питон а на анаконде по умолчанию свое окружение
Возможно ли селениумом открывать дефолтный хром?
1. Апи
было бы апи вопроса не возникло бы
2. 2. bs4 и парсинг html
БС это парсер для разбора страниц, запросы то ты всё равно отправляешь через requests
3. Как уже и писал его детектируют антискрэпинговые системы.
Я не король скрепинга, посмотри что можно сделать чтоб наебать систему. Она ж анализирует твое поведение и твое заголовки которые ты отослал в запросе, просто так не понять - человек шлет запрос или бот
Вероятно ты User-Agent хуеровый прописал
Там очень много подводных камней помимо заголовков и есть подозрение, что проще эмулировать пользовательский браузер, чем подделывать селениум.
Даже на самом дваче какая-то защита приличная стоит.
Вот предлагаю в свежем приватном окне открыть f12, и после этого попробовать загрузить какой-нибудь тред на дваче. Вот не получился так просто, хотя думаю, что обходится.
То есть хрен так просто логи соберёшь, как там что к чему коннектится.
Скрипты могут в принципе отлавливать, что находятся в режиме отладки.
Куча способов понять, что не живой пользователь, а окно селениума, по системным событиям вроде движений мышки, фокусов и т.п.
Короче если очень хотеть, то защититься можно. А сейчас многие хотят.
Конечно если очень хотеть, то и обойти это будет можно. Но это тоже серьёзный скилл уже, не всё так тривиально.
Так ты селениумом и эмулируешь пользовательский браузер и скорее всего и так уже используешь драйвер хрома. Тебе или нужно дырки в сайте искать или отвалить денег на решал капчи.
Хедер то сделал в реквесте?
Сенениум слишком весь в себе, в него только ограниченно можно вмешаться. И поэтому он палится.
То есть условно там срабатывает скрипт, который определяет, что крутится на селениуме, и после этого блокирует работу. А обычный браузер высылает какой-то запрос на сервер и после этого нормально работает.
Ты можешь, в принципе, вместо того, чтобы исполнять js код, как это селениум делает, просто тупо выслать ответ, который от тебя ожидает сервер. И серверу будет сложно понять, что на самом деле там просто консольное приложение, а не реальный браузер. Но для этого надо хорошо изучить протокол, что там и как происходит. Это может быть очень сложно.
>А обычный браузер высылает какой-то запрос на сервер и после этого нормально работает.
Селениум и так использует хром, ты же не зря chromedriver туда прокидываешь. В нем можно сделать абсолютно все, что ты делаешь в обычном браузере и жс скрипты действуют точно так же.
asyncio.create_task(my_task())
То получаю ошибку "RuntimeError: no running event loop"
Как запульнуть my_task так чтобы он начал исполняться на заднем плане и мой код не блокировался ожидая его исполнения? Тред в котором event loop будет создан?
1) проводит авторизацию
2) выводит таблицу
3) позволяет добавлять записи с валидайцией
4) позволяет редактировать записи с валидайцией
На каком стеке писать этот костыль в 2022, чтобы минимально забивать голову хтмл, пагинацией, шаблонизацией и вот этой фронтендовской фигнёй?
Это значит, что скорее всего у тебя луп еще не запущен на момент вызова этой функции, тебе заранее нужно его вызвать
Если хочешь исполнения в отдельном процессе/треде, то юзай это.
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor
Хотя, если тебе достаточно просто задачу запустить, то можно простыми тредами/процессами обойтись без асинхронщины.
Так проще phpMyAdmin тогда. Мне надо возможности конечным пользователям порезать: не давать удалять записи, давать редактировать только отдельные поля. Я доверяю их намерениям, я не доверяю их рукам.
Кто знает как сделать эту хуйню на питоне, какие библиотеки лучше (именно для тех которые точками помечены), в задании дана ток platform
if any((a==b, a==c, a==d))
Ну я бы админку джанго заюзал потому что много очень с фреймворком работал и мне всякие эти ограничения быстро красиво приделать и добавления - изи. По сути это мне дало бы красивые формочки, модельки и пространство для остальной логики, которой можно достаточно накастомить. А так да, наверняка это не лучший выбор, погугли crm всякие, пожет тебе что то такое нужно.
Хуй знает, я компы со сопроцессором с 1994 года не видел. Но о процессоре он инфу даёт точно.
Начиная то-ли с пентиума, то-ли с 486 сопроцессор это просто часть процессора, а не внешний чип.
Но при этом набор команд остался тот же.
Я так понимаю они не то что стали встроенными, они размазались по современным наборам расширений. То есть даже логически/виртуально этого блока не осталось.
Сегодня под сопроцессорами в зависимости от ситуации могут понимать GPU, TPU и прочие DSP. Но вряд ли в задании об этом речь. Скорее всего методичка из 1994.
>>52314
>>52277
Этот код очень странный и не смотрится корректным.
Если ты пытаешься запускать обработчик не из главного треда, ты должен создавать event loop явно, через
loop = asyncio.new_event_loop()
потому что по-умолчанию asyncio предполагает, что event loop будет создан в главном треде.
Поэтому надо делать скорее что-то вроде
def do_async():
____async def coro():
________код
____loop = asyncio.new_event_loop()
____loop.run_until_complete(coro())
Также ты должен помнить, что операции по работе с циклом обработки сообщений в основном не thread safe и поэтому там надо работать с этим очень вдумчиво и аккуратно. Если ты пытаешься из других тредов что-то пихать в тред с event loop
ХЗ что там в задании имели в виду. Я бы предположил, что надо показать набор инструкций, который поддерживает данный процессор.
Короче, котик, попробую может сегодня-завтра запилить пример, как это делать. Хотя может другие сделают.
Тут весь сок не в том, чтобы запустить цикл, а в том, как его кормить задачами. Надо сверяться с доками и смотреть код, но там в основном все операции потокоопасные. Поэтому ты не можешь делать loop.create_task() из другого треда.
Представь, что ты в одном треде делаешь loop.create_task, когда этот луп в другом треде исполняется. И в этот момент тред переключается на тот, в котором луп. Или на другой, из которого ты тоже захочешь луп чем-то накормить.
Там мютексы под это дело нигде не предусмотрены, лупу из-за этого может стать очень плохо, с ним мягко надо.
Я бы предложил типовой паттерн, что ты заводишь в треде с лупом очередь, обычную, queue.Queue(), она потокобезопасная, в отличии от asyncio.Queue(), которая потокоопасная. И в неё суёшь корутину. А в треде с лупом ты уже берёшь данные из очереди и делаешь loop.create(task(coro))
asyncio.run сам же под капотом создает loop и кидает в него корутину
Когда хуй сосешь, есть ли разница, дорабатываешь ты потом языком по стволу или нет?
надо у твоего бати спросить
Когда делаешь x=1 то присваивается сильнее, может и 2 стать. А x = 1 это строго по стандарту.
Ты же знаешь что в пайтоне отступы заменяют скобки? Иди читать Кнута, пока не сделаешь ~50% от материала его книг, к питону даже не прикосайся.
А ты?
>>52277
Стало интересно, запилил какой-то пример
https://ideone.com/aMwASt
штука довольно практичная может быть, если надо работать одновременно с оконным приложением tkinter/qt и asyncio event loop. Там с комментариями.
Через очереди пожалуй сложно, потому что если мы делаем queue.Queue(), то при q.get() мы блокируем тред и луп в том числе. А если делать какие-то опросы через каждые сколько-то миллисекунд, то это адски кривой колхоз из Индии.
Использовать базовые примитивы asyncio мы не можем, поскольку они не потокобезопасные, как не можем использовать ни asyncio queue.put_nowait(), ни loop.create_task - в смысле мы не можем вызывать из из другого треда, чем соответствующий event loop.
Но специально для этого в asyncio есть функция
loop.call_soon_threadsafe,
которая безопасно помещает коллбэк в луп другого треда, а вэтом коллбэке уже можно добавить в цикл какую-нибудь корутину.
Судя по всему других способов более-менее разумных и нет.
Вместо
self._loop.call_soon_threadsafe(lambda: self._loop.create_task(coro))
можно делать
self._loop.call_soon_threadsafe(self._loop.create_task, coro)
Передача аргументов не в коллбеке отдельно
Есть объект asyncio.Condition, его можно проверять в том таске а не эвейтить Event напрямую
Что нужно сделать я сразу то понял, но маялся с тем как это реализовать, итог - вышло все через жопу, но сделано, потратил час, стыдновато.
Your program should get two parameters from command line:
- string of size N^2, that describes square matrix of characters N*N;
- string that describes given word.
The first string is converting to matrix using the following rule. String "QWEASDZXC" forms the matrix:
['Q','W','E',
'A','S','D',
'Z','X','C']
Your program should print to the console the sequence of cells those build the given word.
Every next character of word can be placed just in the neighbor cell: on the top, on the bottom, on the left or on the right from the cell with previous character.
E.g. if it is given matrix "QLGNAEKIRLRNGEAE" and word "KING", then sequence of cells will be [1,2]->[1,3]->[0,3]->[0,2] After solving the task test it carefully with different examples.
Хз, почему у тебя час на это ушел. Просто больше практики нужно.
>Представь, что ты в одном треде делаешь loop.create_task, когда этот луп в другом треде исполняется
А в чем проблема? Питоновские треды же не выполняются параллельно
>А в чем проблема? Питоновские треды же не выполняются параллельно
Треды выполняются конкурентно, их для этого придумывали. Переключение с треда на тред может произойти в любой момент времени. Если это произойдёт в момент, когда ты работаешь с общими данными для нескольких потоков, у тебя могут быть большие проблемы.
Классический пример:
https://ideone.com/iDVS1x
уж совсем примитив, но
> expected: 2000000, calculated: 1639497
Очень дикое расхождение. Конечно, всё очень зависит конкретных операций, что в критических участках находятся.
А, я думал, что сам луп распидорасит от такого надругательства, с разделяемыми ресурсами понятно
Ничего не понятно, но вообще тебе наверное надо делать очередь задач на обработку, при этом у тебя есть пул исполнителей этих задач. Они берут задачи из очереди и исполняют. А в очередь ты кладёшь задания.
Вот есть события на сегодня - x y z. Их я спарсил в 00:00. Для них я записываю время их начала, например, 13:00 14:15 17:30 и линк на страницу с информацией о событии. Следовательно для первого события мне нужно сгенерировать таск, который стартанет в 13:00 и который на протяжении 5 часов, каждую минуту будет считывать информацию об этом событии на его странице, а потом умрет. И так для всех событий. Событий может быть 0-n.
Это ты наколеночный крон костыляешь. Если очень хочешь повторить уже сделанное, то смотри, как сделано в кроне и копируй. Если нет, то используй системный.
А еще возможность компиляции, а не то что сейчас костыли какие-то с numba и cython.
Короче питон это пример того, как изначальное говно взлетает под мощным пиаром мегакорпорации и подхватывается миллионами безмозглых хомячков.
Я прошел донести тебе что
1. Твоя язык говно ( отсюда можно сделать вывод, что лучше перейти на что-то другое, например С# )
2.
>подхватывается миллионами безмозглых хомячков.
Стоит задуматься, кто ты в этой пищевой цепочке.
Всем похуй.
Ну как минимум, тебе не похуй, раз твой пукан взорвался от моих слов истины.
>Короче питон это пример того, как изначальное говно взлетает под мощным пиаром мегакорпорации и подхватывается миллионами безмозглых хомячков.
Што? Какая корпорация стоит за питоном?
Ебать ты Алёша. Пишет на языке и не знает, кто его создал, и где он работал.
То что он там работал еще не значит, что язык продвигали. Это вообще его сайд проект был, в отличии от какого нибудь Пайка, который целеноправленно пилит ГО и гугл ему за это деньги платит.
Цитата из википедии:
>From 2005 to December 2012, he worked at Google, where he spent half of his time developing the Python language.
Как раз таки он там сидел и целенаправленно пилил питон.
Или ты думаешь питон внезапно стал такой популярный потому, что язык сам по себе хороший? Существует великое множество языков которые намного лучше питона во всех планах, однако они почему-то не взлетают так. Догадываешься почему?$$$?
>Как раз таки он там сидел и целенаправленно пилил питон.
Это сайд проект, гугл выделяет время на личные разработки, если они помогают компании. Основная работа у него была другая, в отличии от Пайка
>Или ты думаешь питон внезапно стал такой популярный потому, что язык сам по себе хороший?
Потому что простейший вкат, хеллоу вордл можно написать через 5 минут после знакомства с языком
Потому что наукоблядям и журналистам нравится простой синтаксис.
Гугол никогда не продвигал питон. Они никак не поддерживали его своими сервисами, например. Они не продвигали в открытый код какое-либо значимое количество систем на питоне - меньше, чем на других языках.
То есть это просто какой-то небольшой вклад в опенсорс, но он идёт по десяткам направлений, но это совсем не то, что Go или системы вроде кубернетиса.
Дело не в простейшем вкате, а в том, что на нём в принципе очень приятно писать.
Я, например, когда начал писать на питоне, уже имел серьёзный опыт на C++ и PHP, ещё с кучей языков шапочно знаком бы, с JS, Java, Perl, и ещё какой-то шлак.
И после питона были языки, JS вот серьёзно, и во что-то смотреть приходилось типа Ruby и Go. Но ничто вот настолько не вставляло, как питон.
И таких как я масса.
Поддерживают и разрабатывают серьёзные вещи ведь совсем не вчерашние вкатуны. Это очень серьёзный народ.
Да в гугле раньше можно было тратить 1 день в неделю на развитие своего проекта с учетом того, что он может принести прибыль. Этот хуеплет там по официальным данным тратил 50% своего рабочем времени на развитие питона, ты думаешь гугл такая корпорация альтруистов, что платили ему зарплату за то, чтобы тут развивал свой проект? Ясен хуй у гугла был свой интерес в этом. Но потом видимо что-то пошло не так ( видимо не договорились ) и он уволился оттуда, но в это время в развитие питона было вбухано уже немало денег, но т.к. проект под открытой лицензией аля BSD то и гугл никак не мог претендовать на приклеивание своего логотипа к языку. Вот и все.
>Потому что простейший вкат, хеллоу вордл можно написать через 5 минут после знакомства с языком
Вкат не проще, чем в любом другом языке с динамической типизацией. Хелоу ворлд можно на любом языке научиться писать за 5 минут, другое дело потом тратить кучу времени на знакомство со стандартной библиотекой и остальными фичами\костылями языка.
>>53034
Ты просто сложные проекты на пиптоне видимо не нюхал, после такого ты бы тоже так же как и я стал бы его ненавидеть, потому что этот язык кроме как писать хелоу ворды и какие-то наброски на коленках ни для чего не годится. В конечном итоге вся эта мазьня на питоне переписывается на С++ или что-то такое, где все предназначено для прода.
>Perl
Вот взять тот же перл, бля да у перла куча ахуенных фишек, которые питону и не снились. Жаль только перл умер.
>В конечном итоге вся эта мазьня на питоне переписывается на С++ или что-то такое, где все предназначено для прода
Шкила, ты где прод на плюсах видел последний раз? Только алгоритмически сложные задачи на них переписывают
Школьник-теоретик вот как раз тут ты. Я уже 13 лет на С\С++ серверные и не только приложухи пишу. Давай расскажи мне по подробнее, что там только на С++ переписывают в твоем 10Б?
Шизик, ты думаешь С++ используется только в HFT? Ебать у тебя искаженное восприятие мира. Хотя хуле тут, если обезьянка сидит в своем узконаправленном мире модных фреймворков, то откуда ей знать, что большая прикладного часть софта в мире написана на С\С++.
Ну приведи пример, где продукты изначально написанные на питоне переписываются на плюсах. Прост тут изначально постановка задачи такая, что никто в здравом уме не будет начинать писать на питоне, если требуется перфоманс сишки
Если занимаешься полгода, то распарсить этот руглиш и закодить dfs -- вполне нормально, даже если ушел час.
За примером далеко ходить не надо. Я работаю в сфере Computer Vision, дата саентисты пишут свои прототипы на питухоне, которые в конечном итоге надо переписывать на С++, потому что в этой области всегда требуется максимальная производительность. Когда я туда пришел там был большой проект написанный на питоне, который все это делал но очень медленно, без возможности ни вертикального, ни горизонтального масштабирования. И что в итоге? Проект был успешно переписан на С++ и сейчас легко масштабируется на сотни машин, в кучей GPU и CPU ядер.
Окей другой пример, вася пупкин написал клевое веб приложение на питоне. И вдруг его приложение взлетело до небес, появились миллионы посетителей в сутки, ну прям настоящий хайлод. Конечно у Васи возникнут проблемы и со скоростью работы и с масштабированием, поэтому будучи благоразумным человеком Вася примет верное решение нанять людей и переписать свою питонопарашу на нормальный язык\языки предназначенные для этого, чтобы в дальнейшем не возникало проблем.
Кстати еще один замечательный пример, когда-то давно цукерберг написал свою парашу фб на пыхе, и не принял верного решения в самом начале переписать пока еще не разросшийся проект на что-то более адекватное. В итоге фейсбук наелись говна придумывая компиляторы похапе языка. Но в конечном итоге все равно все было переписано на С++\Java\etc давным давно
Просто погугли сколько библиотек для Питона написано на крестах или С и не позорься.
Так пистон для других задач, вкатыш. Питон для того чтобы быстро и удобно что-то написать чтобы оно как-то работало а не писать хуйлоад и прочую залупу.
Еблан не окончивший хотя бы минимальный вуз, ты вообще вкурсе что программы = алгоритмы + структуры данных?
Блять, что за хуйню ты вообще высираешь? Ты вообще имеешь хотя бы представление как выглядит программа? Судя по твоим шизойдным высерам - нет.
С
А это не про плюсы было, а про то кто и зачем написал V8 для js.
С чего ты взял? Сомневаюсь что инста с ее посещаемостью работает на какой-то динамической параше.
>>53088
Я про это и говорю, алексей. Питон годится только для накалякания чего либо на коленке не больше. Но какой смысл было высирать столько библиотек на изначальна хуевый язык, если максимальная его профпригодность равна программе написанной на каленке?
Да, я не пригорел, просто чувствую твой уровень подготовки, судя по твоим нелепым высерам и он равен типичному питонабыдлу вообще не разбирающегося хотя бы в минимальной архитектуре ПО. И не понимаю, зачем ты пытаешься со мной спорить. Это все равно что муравей будет доказывать богу что он не прав в чем-то, нелепо выглядит.
НАЧИНАЕТЕ ПИСАТЬ ПРОЕКТ НА НОРМАЛЬНОМ ЯЗЫКЕ, ВЫ ЖЕ НЕ БЫДЛЫ КАКИЕ-ТО
@
ТО ЧТО МОЖНО БЫЛО СДЕЛАТЬ ЗА МЕСЯЦ НА ПИТОНЕ ВЫ ДЕЛАЕТЕ ЗА 4 МЕСЯЦА НА ПЛЮСАХ
@
КОНКУРЕНТЫ УЖЕ ВЫПУСТИЛИ АЛЬТЕРНАТИВНУ И ДЕЛАЮТ ФИЧИ КАЖДЫЙ РЕЛИЗ
@
ВЫКАКИВАЕТЕ НА РЫНОК СВОЙ ПРОДУКТ
@
ЖИДКО ПУКНУВ ПРОЕКТ ЗАКРЫВАЮТ ПОТОМУ ЧТО НИШУ УЖЕ ЗАНЯЛИ
А вообще, с чего это ты взял, что полезный продукт == хайлоад? Есть много отраслей, где требуется куча бизнес-логики для ограниченного круга людей и никто не срет 300кк rps
>>53102
Ебать ты жиробубель
>Сомневаюсь что инста с ее посещаемостью работает на какой-то динамической параше.
https://stackshare.io/instagram/instagram
https://www.8bitmen.com/instagram-architecture-how-does-it-store-search-billions-of-images/
Из статической непараши там только жава, и на ней там явно не весь бэк написан.
>А вообще, с чего это ты взял, что полезный продукт == хайлоад?
Я такое не утверждал.
>куча бизнес-логики для ограниченного круга людей
Ты имеешь ввиду Enterprise и его единственного царя джунглей - Java?
>>53106
Ну что я могу сказать:
1. Всегда вызывала отторжение любая продукция сделанная цукербергом как и он сам.
2. Интаграм постоянно тормозит и лагает, теперь ясно почему.
3. Даже если убрать предвзятость, то единственная задача инстаграмма - показать фото\видео, то есть передать пользователю ссылку на cdn где это хранится, возможно с ахуеевшимми миллиардами фейсбука, им не впадлу платить за медленность питона. Возможно там еще куча легаси кода который не так просто искоренить и поэтому им проще платить больше денег за сервера, чем переписывать все на другой язык. Но то что использования питона в таком проекте - это неразумно - это факт.
>НАЧИНАЕТЕ ПИСАТЬ ПРОЕКТ НА НОРМАЛЬНОМ ЯЗЫКЕ, ВЫ ЖЕ НЕ БЫДЛЫ КАКИЕ-ТО
>@
>ТО ЧТО МОЖНО БЫЛО СДЕЛАТЬ ЗА МЕСЯЦ НА ПИТОНЕ ВЫ ДЕЛАЕТЕ ЗА 4 МЕСЯЦА НА ПЛЮСАХ
>@
>КОНКУРЕНТЫ УЖЕ ВЫПУСТИЛИ АЛЬТЕРНАТИВНУ И ДЕЛАЮТ ФИЧИ КАЖДЫЙ РЕЛИЗ
>@
>ВЫКАКИВАЕТЕ НА РЫНОК СВОЙ ПРОДУКТ
>@
>ЖИДКО ПУКНУВ ПРОЕКТ ЗАКРЫВАЮТ ПОТОМУ ЧТО НИШУ УЖЕ ЗАНЯЛИ
Лол, так никто не говорит, начинать сразу по хардкору, как я помню еще во времена когда я увлекался геймдевом, на местном форуме были чуваки которые сказали, ПОШЛИ ВСЕ НАХУЙ С ВАШИМИ ДВИЖКАМИ МЫ БУДЕМ ПИЛИТЬ СВОЙ С НУЛЯ, в итоге они 4 года пилили какие-то зачатки игры, и к тому времени когда они выкатили первую демку графика и все их технологии уже безнадежно устарели.
Нет, просто ко всему надо подходить с умом, и продумывать перспективы.
К тому же, даже если писать на сразу на С++, хотя я к такому не агитирую, на с++ есть куча библиотек используя которые можно быстренько все сделать.
>Но то что использования питона в таком проекте - это неразумно - это факт.
Получается, разрабы реддита, кворы, пинтереста и ещё кучи проектов с нормальной такой посещяемостью, где под капотом также джанга, либо миллиардеры, либо неразумные.
>Окей другой пример, вася пупкин написал клевое веб приложение на питоне. И вдруг его приложение взлетело до небес, появились миллионы посетителей в сутки, ну прям настоящий хайлод. Конечно у Васи возникнут проблемы и со скоростью работы и с масштабированием, поэтому будучи благоразумным человеком Вася примет верное решение нанять людей и переписать свою питонопарашу на нормальный язык\языки предназначенные для этого, чтобы в дальнейшем не возникало проблем.
Это ошибочное мнение, что продукт обязательно дорастет до такого состояние, когда переписывание кода станет выгоднее, чем обслуживание железа. Питон прекрасно живет на средних проектах и где добавить новую фичу гораздо приоритетнее, чем снизить стоимость сервера на условные несколько тысяч долларов и поменять штат на плюсовиков, которые эту самую выгоду сожрут за ЗП побольше. Использование языков диктуется бизнесом, а не абстрактным ну язык говно же
Все откатимся на няшную и будем оптимизировать все до усрачки, собственно распространения "медленных" языков связано с тем, что железо подешевело настолько, что процессоры можно ведрами покупать.
Получается так, если они это все используют.
Но опять же, смотря где и как, может у них джанго отвечает вообще за какую-то малонагруженную часть, либо просто пробрасывает запросы дальше. Просто все это гигантские проекты состоят из сотен микросервисов, которые написаны на различных языках.
>>53123
Может в вебе это так и работает, но вот в CV где от скорости работы твоего ПО зависит будут ли у тебя заказчики или нет, так уже не пройдет. И опять же мы говорим о сферических стартапах в вакууме, компании уже имеющие опыт разработки ПО, вряд ли будут начинать новые свои проекты не с основных технологий использующихся в компании.
> компании уже имеющие опыт разработки ПО, вряд ли будут начинать новые свои проекты не с основных технологий использующихся в компании.
Меня в ВТБ и МТС приглашали пилить сервисы на питоне. Бюджет у продукта под патронажем крупной компании ничем не отличается от бюджета стартапа, везде деньги экономят.
Тут очень много нюансов, например, да может они хотят сделать все по быренькому и задешево и им похуй как это будет работать медленно или быстро, главное чтоб как-то работало. Вообще парадигма разработки "как-то" у нас очень развита, главное чтоб было как-то похуй, что криво, похуй что медленно, похуй что потом никто не разберется в сорцах, главное чтобы было "как-то" и чем ближе компания к гос структурам тем больше там эта парадигма развита, потому что бюджет выделяют, а видимость работы создать надо вот и делают тяп ляп ля галочки. Но да ладно это экскурс.
Другой аспект, то что во-первых, средняя обезьяна на питоне берет намного меньше денег среднего разработчика на Java/Scala/Go/C++ и т.д. во-вторых, разработчика на питон найти намного проще, чем на чем-то другом потому что вкатышей пруд пруди готовых работать на любых условиях, в-третьих может у них в департаменте который ответсвенный на новый проект нету просто адекватных людей способных собрать хорошую команду и единственный человек хоть как-то понимающий в програмировании это сис-админ эникейщик знающий маломальски питон, который будет набирать народ в команду. Плюс им может быть так же похуй на проект, и они не заморачиваются над его качеством.
В общем резюмируя, вообще всю суть сегодняшнего треда. На питоне пишут не потому что он пиздатый язык и пиздатая технология и на нем все так ахуенно получается. Да на питоне можно быстро что-то нахуярить это факт спасибо куче библиотек на все виды деятельности. Получится ли это всрато? В конечном итоге с ростом проекта да. Будет ли это тяжело поддерживать в дальнейшем и внедрять новый функционал? Да. Получится ли это медленно? Да. Будет ли стоит разработка дешевле на начальном этапе? Да. Легко ли будет найти разработчика? Да.
И если у компании или стартапа есть средства и возможности перекрыть все недостатки питона то да, окей, это может быть выгодно с точки зрения бизнеса.
Но нормально технически подкованный менеджер, вряд ли стал бы начинать новый проект с какой-либо перспективой роста на питоне. Гораздо лучше Java/Go/C++ да что угодно, в зависимости от отаросли, лишь бы не пришлось перепиливать это все в конечном итоге.
Тут очень много нюансов, например, да может они хотят сделать все по быренькому и задешево и им похуй как это будет работать медленно или быстро, главное чтоб как-то работало. Вообще парадигма разработки "как-то" у нас очень развита, главное чтоб было как-то похуй, что криво, похуй что медленно, похуй что потом никто не разберется в сорцах, главное чтобы было "как-то" и чем ближе компания к гос структурам тем больше там эта парадигма развита, потому что бюджет выделяют, а видимость работы создать надо вот и делают тяп ляп ля галочки. Но да ладно это экскурс.
Другой аспект, то что во-первых, средняя обезьяна на питоне берет намного меньше денег среднего разработчика на Java/Scala/Go/C++ и т.д. во-вторых, разработчика на питон найти намного проще, чем на чем-то другом потому что вкатышей пруд пруди готовых работать на любых условиях, в-третьих может у них в департаменте который ответсвенный на новый проект нету просто адекватных людей способных собрать хорошую команду и единственный человек хоть как-то понимающий в програмировании это сис-админ эникейщик знающий маломальски питон, который будет набирать народ в команду. Плюс им может быть так же похуй на проект, и они не заморачиваются над его качеством.
В общем резюмируя, вообще всю суть сегодняшнего треда. На питоне пишут не потому что он пиздатый язык и пиздатая технология и на нем все так ахуенно получается. Да на питоне можно быстро что-то нахуярить это факт спасибо куче библиотек на все виды деятельности. Получится ли это всрато? В конечном итоге с ростом проекта да. Будет ли это тяжело поддерживать в дальнейшем и внедрять новый функционал? Да. Получится ли это медленно? Да. Будет ли стоит разработка дешевле на начальном этапе? Да. Легко ли будет найти разработчика? Да.
И если у компании или стартапа есть средства и возможности перекрыть все недостатки питона то да, окей, это может быть выгодно с точки зрения бизнеса.
Но нормально технически подкованный менеджер, вряд ли стал бы начинать новый проект с какой-либо перспективой роста на питоне. Гораздо лучше Java/Go/C++ да что угодно, в зависимости от отаросли, лишь бы не пришлось перепиливать это все в конечном итоге.
Лол, а ты думаешь, что на плюсах пишут потому что это дохуя пиздатый язык, а не потому что это оптимальная числодробилка даже с проблемой поддерживаемости и всратой инфраструктурой где даже пакетного менеджера не завезли?
Сколько ты сам проектов от начала до конца завершил, что бы знать как нужно собирать команду и как может развиваться продукт, если ты занимаешься только написанием числодробилок?
Во-первых, выкинь из головы идею плюсы - это "числодробилка", это далеко не единственный плюс плюсов.
Во-вторых, на плюсах пишут потому что это самый быстрый язык из доступных + у которого богатый функционал + где ты не платишь за то, что не используешь + то что на плюсах ты можешь написать, что угодно + любая либа представляющая собой какой-либо апи к железу имеет интерфейс только на С\С++.
3. о какой "проблеме поддерживаемости" ты говоришь? Плюсы компилируются в нативный байт код процессора, под какую архитектуру у тебя есть компилятор под такую это и будет работать.
4. пакетные менеджеры есть и не один, тот же vcpkg например. Но я ими если честно никогда не пользовался, т.к. всю жизнь пишу программы под линукс, где пакетным менеджером служит команда apt install libname-dev.
5. Я разработчик, а не менеджер, а работал я в разных командах и имею представление о всей этой внутренней кухне.
6. Ты чего к плюсам доебался? Я же не только за плюсы говорю. Плюсы не всегда оптимальный выбор, и даже я иногда плююсь от них и думаю как бы это было проще написать на С# или Java, где есть все из коробки, правда java тоже та еще монструозная параша.
>Во-первых, выкинь из головы идею плюсы - это "числодробилка", это далеко не единственный плюс плюсов.
Я говорил конкретно про тебя.
>3. о какой "проблеме поддерживаемости" ты говоришь? Плюсы компилируются в нативный байт код процессора, под какую архитектуру у тебя есть компилятор под такую это и будет работать.
Это когда на разработку функционала тратится дохуя времени, потому что ты не можешь обмазаться нормальными абстракциями. В плюсах требуется гораздо больше действий на написание той же функциональности и соответственно с ее поддержкой. Начиная от работы со строками, которая стала мемом и заканчивая ручным управлением памятью.
>4. пакетные менеджеры есть и не один, тот же vcpkg например. Но я ими если честно никогда не пользовался, т.к. всю жизнь пишу программы под линукс, где пакетным менеджером служит команда apt install libname-dev.
Лул, как же охуенно иметь общую среду для приложения и операционной системы разработчика. Расскажешь как две версии одной либы на одном компьютере установить?
>5. Я разработчик, а не менеджер, а работал я в разных командах и имею представление о всей этой внутренней кухне.
С чего ты взял что имеешь представление? Ты бюджеты считал или персонал нанимал? Может знаешь во сколька вся команда разработки обходилась или сколько резюме проходило через лидов?
>Я говорил конкретно про тебя.
?
>Это когда на разработку функционала тратится дохуя времени, потому что ты не можешь обмазаться нормальными абстракциями. В плюсах требуется гораздо больше действий на написание той же функциональности и соответственно с ее поддержкой. Начиная от работы со строками, которая стала мемом и заканчивая ручным управлением памятью.
Это зависит от того, используешь ли ты какие-то фреймворки или либы заточенные под это.
Вот возьмем например кодирование\декодирование видео. Ты же не будешь писать свой парсер контейнера, потом имплементацию декодера\энкодера для конкретного кодека и т.д? Ты возьмешь уже готовенький ffmpeg и нахуяришь быстренько на нем. Либо просто opencv. И поверь в случае с opencv вообще никакой разницы в коде не будет между с++ и питоном, т.к. все методы и там и там зеркальные.
>Начиная от работы со строками, которая стала мемом
Это что там такого сложного? И что за мемы такие? Типа каждый разработчик на с++ должен написать свою имплементацию std::string? лол, этот мем уже лет 15 как потерял актуальность, еще в с++ 98 со строками стандартной библиотеки все было нормально, на крайняк всегда был boost где есть все алгоритмы какие хочешь.
>заканчивая ручным управлением памятью.
std::shared_ptr/std::unique_ptr - лол с появлением с++11 никто уже не выделяет память через new в сырые указатели и тем более через malloc. Да и до с++ 11 был boost shared_ptr который все адекватные люди юзали.
>Лул, как же охуенно иметь общую среду для приложения и операционной системы разработчика. Расскажешь как две версии одной либы на одном компьютере установить?
Лол, либо компилируешь и инсталируешь с нужным --prefix либо просто бинарники уже готовые копируешь куда надо и юзаешь оттуда. В чем проблема?
>С чего ты взял что имеешь представление? Ты бюджеты считал или персонал нанимал? Может знаешь во сколька вся команда разработки обходилась или сколько резюме проходило через лидов?
Лол, я начиная с первой работы собеседовал новых людей с лидами. Бюджеты не считал но примерно знал, во сколько что обходится. Да я и сейчас сам себе лид, в одном стартапе по найму, так что всякие расходы на сервера, железо и прочее я сам рассчитываю и уже обговариваю с непосредственным начальством.
>Я говорил конкретно про тебя.
?
>Это когда на разработку функционала тратится дохуя времени, потому что ты не можешь обмазаться нормальными абстракциями. В плюсах требуется гораздо больше действий на написание той же функциональности и соответственно с ее поддержкой. Начиная от работы со строками, которая стала мемом и заканчивая ручным управлением памятью.
Это зависит от того, используешь ли ты какие-то фреймворки или либы заточенные под это.
Вот возьмем например кодирование\декодирование видео. Ты же не будешь писать свой парсер контейнера, потом имплементацию декодера\энкодера для конкретного кодека и т.д? Ты возьмешь уже готовенький ffmpeg и нахуяришь быстренько на нем. Либо просто opencv. И поверь в случае с opencv вообще никакой разницы в коде не будет между с++ и питоном, т.к. все методы и там и там зеркальные.
>Начиная от работы со строками, которая стала мемом
Это что там такого сложного? И что за мемы такие? Типа каждый разработчик на с++ должен написать свою имплементацию std::string? лол, этот мем уже лет 15 как потерял актуальность, еще в с++ 98 со строками стандартной библиотеки все было нормально, на крайняк всегда был boost где есть все алгоритмы какие хочешь.
>заканчивая ручным управлением памятью.
std::shared_ptr/std::unique_ptr - лол с появлением с++11 никто уже не выделяет память через new в сырые указатели и тем более через malloc. Да и до с++ 11 был boost shared_ptr который все адекватные люди юзали.
>Лул, как же охуенно иметь общую среду для приложения и операционной системы разработчика. Расскажешь как две версии одной либы на одном компьютере установить?
Лол, либо компилируешь и инсталируешь с нужным --prefix либо просто бинарники уже готовые копируешь куда надо и юзаешь оттуда. В чем проблема?
>С чего ты взял что имеешь представление? Ты бюджеты считал или персонал нанимал? Может знаешь во сколька вся команда разработки обходилась или сколько резюме проходило через лидов?
Лол, я начиная с первой работы собеседовал новых людей с лидами. Бюджеты не считал но примерно знал, во сколько что обходится. Да я и сейчас сам себе лид, в одном стартапе по найму, так что всякие расходы на сервера, железо и прочее я сам рассчитываю и уже обговариваю с непосредственным начальством.
>главное чтоб как-то работало.
"Как-то" работать будет на плюсах, потому что сделать хорошо там сложно. А на языках высокого уровня будет работать хорошо, если ты нормально пишешь. Стабильно, чётко и корректно, а это главное.
На питоне байтоёбские вещи не очень пишут, никто не будет, конечно, реализовывать код перепаковки картинки на питоне. Для этого используют внешние библиотеки, специально оптимизированные.
Серьёзные сервисы всё равно на одном сервере не пускают, там несколько серверов для разных задач. Такая история, что из-за нехватки производительности сервис упирается в потолок, бывает очень редко. Точнее бывает, но из-за производительности БД, очередей и т.п., что с языком программирования не очень связано.
Для бизнеса имеет значение хватает ли ресурсов для работы или нет. И какова стоимость ресурсов в расчёте на одного клиента, отношение расхода на ресурсы к поступлениям от клиента.
Реальность в том, что производительность языков программирования не является узким местом в большинстве задач. А вот скорость разработки, возможность поддержки, качество кода - являются.
То, что ты описал применимо только к вебмакакингу.
>"Как-то" работать будет на плюсах, потому что сделать хорошо там сложно. А на языках высокого уровня будет работать хорошо, если ты нормально пишешь. Стабильно, чётко и корректно, а это главное.
Конечно, ведь средняя обезьяна пришедшая из питона лучше не сможет сделать в силу отсутствия знаний, скилов и интеллекта, на то она и обезьяна. Но зачем обезьяне доверять гранату, когда это можно доверить компетентным людям которые умеют с этим хорошо обращаться?
И С++, к твоему сведению, является языком высокого уровня.
К тому же никто же не заставляет писать на С++, ну если не вышел умом пиши на golang хотя бы или java/C#.
В общем, тут все зависит от жадности инвестора, платишь мало денек - получаешь команду даунов на питоне которые делают хуево, платишь хорошо получаешь хорошую команду со стеком С++\Java которые делают хорошо, любой сервис.
>К тому же никто же не заставляет писать на С++, ну если не вышел умом пиши на golang хотя бы или java/C#.
Ты хотел сказать на Rust
Ты тот шизик, что ходит по всем темам и твердит "динамо дрисня". Уйди. Не хочется на тебя время тратить.
>golang
> Я только сегодня понял, что почти никто толком-то и не понимает, зачем вообще Go нужен. Если коротко, то Go нужен для того, чтобы проектировать robust software. Я не знаю, как правильно перевести это слово на русский, но это скорее всего что-то вроде «надежный». Так вот, Go сделали, потому что гуглу нужен был инструмент для написания надежного кода. На самом деле не сколько гуглу, сколько Робу Пайку, который последние две декады, как минумум, одержим идеей сделать сишку с каналами и зелеными потоками. Так получилось, что Роб Пайк попал в нормальную компашку с другими штрихами из Bell Labs, крутейшим Russ Cox, Фицпатриком и т.д. Этим ребятам несложно было убедить гугл, что им нужен новый язык и вобщем-то, бабосики они на него выбили.
> Так, это было небольшое лирическое отступление, давайте вернемся к теме. Да, зачем же все-таки гуглу был нужен новый язык? Ну, тут все понятно, давайте послушаем слова самого Роба Пайка:
> Фишка в том, что наши программисты гуглеры, а не ученые. Это обычно молодые, только выпустившиеся пацаны, которые возможно выучили Java, возможно даже C/C++ и может быть Python. Они не в состоянии понимать пробздетый язык, но мы все равно хотим, чтобы они делали хороший софт. Таким образом, мы даем им легкопонимаемый язык, к которому они быстро привыкнут.
> А теперь давайте попытаемся понять, что же он имел ввиду. Если грубо говоря, то он сказал, что в гугле работают не самые умные ребята («не способные понимать крутой язык»), так что они придумали такой язык, который просто невозможно не понять. Это на самом деле очень круто для менеджмента. Посудите: можно нанять 100 посредственных программистов, дать им в руки Go и эта армия обезьян будет генерить вам много «неплохого» и очень даже поддерживаемого кода! Go это фантастический инструмент для менеджмента, лучше не придумать: моментально загоняем всех программистов в рамки go-fmt (никто не сможет пропихнуть свой стиль форматирования), забираем у них любые абстракции сложнее интерфейса и получается такой конвеер кода, в котором developer is just another brick in the wall. По-моему, очень круто! Ну, программистам скорее всего такой расклад не очень понравится — мало кто любит быть винтиком в системе.
>golang
> Я только сегодня понял, что почти никто толком-то и не понимает, зачем вообще Go нужен. Если коротко, то Go нужен для того, чтобы проектировать robust software. Я не знаю, как правильно перевести это слово на русский, но это скорее всего что-то вроде «надежный». Так вот, Go сделали, потому что гуглу нужен был инструмент для написания надежного кода. На самом деле не сколько гуглу, сколько Робу Пайку, который последние две декады, как минумум, одержим идеей сделать сишку с каналами и зелеными потоками. Так получилось, что Роб Пайк попал в нормальную компашку с другими штрихами из Bell Labs, крутейшим Russ Cox, Фицпатриком и т.д. Этим ребятам несложно было убедить гугл, что им нужен новый язык и вобщем-то, бабосики они на него выбили.
> Так, это было небольшое лирическое отступление, давайте вернемся к теме. Да, зачем же все-таки гуглу был нужен новый язык? Ну, тут все понятно, давайте послушаем слова самого Роба Пайка:
> Фишка в том, что наши программисты гуглеры, а не ученые. Это обычно молодые, только выпустившиеся пацаны, которые возможно выучили Java, возможно даже C/C++ и может быть Python. Они не в состоянии понимать пробздетый язык, но мы все равно хотим, чтобы они делали хороший софт. Таким образом, мы даем им легкопонимаемый язык, к которому они быстро привыкнут.
> А теперь давайте попытаемся понять, что же он имел ввиду. Если грубо говоря, то он сказал, что в гугле работают не самые умные ребята («не способные понимать крутой язык»), так что они придумали такой язык, который просто невозможно не понять. Это на самом деле очень круто для менеджмента. Посудите: можно нанять 100 посредственных программистов, дать им в руки Go и эта армия обезьян будет генерить вам много «неплохого» и очень даже поддерживаемого кода! Go это фантастический инструмент для менеджмента, лучше не придумать: моментально загоняем всех программистов в рамки go-fmt (никто не сможет пропихнуть свой стиль форматирования), забираем у них любые абстракции сложнее интерфейса и получается такой конвеер кода, в котором developer is just another brick in the wall. По-моему, очень круто! Ну, программистам скорее всего такой расклад не очень понравится — мало кто любит быть винтиком в системе.
>В общем, тут все зависит от жадности инвестора, платишь мало денек - получаешь команду даунов на питоне которые делают хуево, платишь хорошо получаешь хорошую команду со стеком С++\Java которые делают хорошо, любой сервис.
Плюсовики и джависты стоят дешевле чем разработчик на питоне, никто просто не хочет в говне валятся
https://lvivity.com/top-highly-paid-programming-languages
Вот именно, абсолютно макакенский язык, в котором еще можно выстрелить себе в ногу
Баш это сраное говно, потолок которого однострочники. Катись в перл - это индустриальность си плюс мощь лиспа. Но он умер.
Еблан, нуб, вкатыш, у баша своя ниша, он не говно, он хорошо выполняет свои задачи для которых предназначен. Перл - это вообще другая стихия. Надо быть полным ебланом, чтобы сравнивать баш и перл.
+
Это как сравнивать отсос и давание в жопу
Никогда не понимал типов готовых сосать лишь бы их не ебали. Отсос - унизительно, поэтому в случае чего настоящий мужик будет гордо стоять раком и примет в жопу хуй, даже не пискнув ни разу. Такие дела
Шарпер, вернись в свой тред.
>>53317
Раскудахтались-то. Я вам говорю, что баш это сраное говно, в котором приходится пачкать руки, потому что так сложилось исторически. На перле можно заменить простыню баша в пару строчек с вертухи, потому что он делался в том числе для этого.
Найдите мне кого-то, кто скажет, что баш это охуенный язык для скриптов. Это и не язык вовсе, а игрушечная автоматизация.
Но ничего, зумерье продавит какой-то клоунскрипт и будете радостно писать на нем, как это вышло с системд, а баш превратится в легаси заглушку, где ему самое место.
>>53321
И не собирался. Ойти-сантехник для комуникации говн, велика птица.
Кто-нибудь использует её?
Где про неё можно почитать и потренироваться с ней?
Инб4 документация
А что делает код снизу?
Бля, точно, ахаахах
Пробовал Jupyter, но чет прямо совсем не понравилось по ощущениям.
Я не собираюсь прогать в команде, не собираюсь выкладывать код на гитхаб, хочу просто для себя экспериментировать и изучать, чтобы было удобно. Что анон может посоветовать в моей ситуации?
vscode
Такие баловальщики сидят как раз в жупитере. Мне он тоже не особо понятен, но реально популярен.
В детстве делал табами, потом 4 пробела, потом два, сейчас один.
Но я и не лезу в ваши галеры, понятно дело.
Нахуя тогда делать один пробел, если можно сделать один таб? Самый ебанутый вариант у тебя.
>Например я переопределяю функцию print()
А нахуя тебе ее переопределять?)
Создай новую бля, присвой ей свой идентификатор
С одним пробелом на экране больше всего места.
Таб это управляющий символ, он служит для создания простейших таблиц. Как раз на ассемблере я табами и отступал, ведь исходник там это по сути таблица.
Есть даже понятие tsv по аналогии c csv
у меня не было доступа к куску кода в котором вызывалась буилтин функция, я ее переопределил и когда тот кусок кода вызывал типо билтин функцию, то он вызывал мою функцию.
Типа того.
Переопределять функции билтин либы в принципе не есть гуд. Используй partial.
Ровно как и называть аргументы в методах/функциях таким образом
Искать через регулярку, определять позиции начала конца, перегонять в datetime и возвращть позицию найденного значения как-то громоздко. Есть ли альтернативы?
re.finditer и сверяй по ходу.
Тебе не питон нужен, а фронтэнд Джаваскрипт+цсс + хтмл. 3 месяца если будешь сидеть по 10 часов в день. Пишешь сайт идешь на собеседование
Да, полезная штука. Спасибо.
Падажжи, то есть ты целиком нахуячил новую функцию и назвал ее print? Или все же переопределил его, расширив - как именно тогда?
А если формат даты американский/японский? А если не через точку? А если месяц записан буквами?
Бампну вопрос ещё раз и завтра засяду хуярить на flask-wtf / flask-sqlalchemy если других предложений не будет.
Ты почему-то ищешь, к чему бы доебаться, но с какими-то надуманными аргументами. Откуда мне знать в каком формате у того анона даты в тексте? Он спрашивает, как это вообще сделать - с регулярками или без.
А ты сделал себе отбеливание?
Или есть другие решения для запуска простеньких скриптов на Андроид?
Вот это попробуй. У меня с сайтами, защищёнными CloudFlare, работало.
https://github.com/ultrafunkamsterdam/undetected-chromedriver
Ещё можешь скопировать параметры запроса, делаемого твоим хромом, и скормить их requests. Будет работать до поры до времени
https://github.com/ultrafunkamsterdam/undetected-chromedriver/blob/1e363b18be7ea96f77695ac8ae0e0b6118c4432b/undetected_chromedriver/patcher.py#L142
Как работает этот ебанутый итератор и зачем? И почему io.open, а не просто?
короче, я переопределил буилтин функцию, какой-то кусок кода ее вызвал и получилось, что вызвалась моя функция, я внутри своей функции вызвал настоящую буилтин функцию, добавил к ее возврату, то что мне нужно и вернул в ту функцию которая вызвала мою функцию.
Разобрался, это просто бездумно скопипащенный кусок.
Лениво вкатываюсь. Даже без цели, а так, голову занять и что то прикладное при случае накидать. Не в этом дело. Накидал простенькую программу (из укуса питона да) типа адресной книги с добавлением, удалением, изменением. Сохранить в файл загрузить. Вот и весь функционал. Решил прикрутить ui. Начал смотреть в сторону QtPy. И даже прикрутил. Доволен до жопы. Интересно, но заебла одна штука.
Пишу в PyCharm. И эта сволочь, когда я начал пытаться в интерфейс, перестала выкатывать ошибки в свою консольку. Окно софтины открывается работает, а когда пытаюсь жать на отрабатываемую в данный момент кнопочку или ещё что - подвисает и вылетает с каким то одним и тем же эрроокодом в консоли. Пытался Его гуглить - пишут это типа проблема IDE, она ошибки иногда не показывает.
Приходится искать мой файл, запускать в голом питоне и смотреть ошибки там.
Ну это же полная хуйня, можно это пофиксить?
А ещё эта поебень на три страницы кода собирается в .exe файл в 35 мегабайт, лол.
1 пик как сейчас
2 как хотелось бы
Заранее спасибо! Очень долго с проблемой сижу, даже в исходники пытался лезть...
>А ещё эта поебень на три страницы кода собирается в .exe файл в 35 мегабайт, лол.
А как ты хотел лол, питон вообще для этого не совсем подходит, он же не компилируется.
Даже если бы и компилировался, всё равно эти тулкиты надо носить с собой, это не нативный гуй.
Покажи конфиг Фара. Хочется посмотреть как работают профи.
понятно что все, но для чего еще питон используется?
телеграм ботов делать можешь, соцсеточку можешь
Сделал, но теперь проблема, что вызываю после присваивания self.declared_filters, там показывает мой новый фильтр. Но он не отображается в форме, его просто нет. Те которые объявлены как атрибуты класса, есть.
Сделай при ajax запросе проверку, есть такой id или тред утонул, если нет, возвращай массив без него.
Фух, сделал. Вот решение, если кому-то в будущем понадобиться.
Решение простое, но именно в этой библиотеке не очевидное.
Всем спасибо.
Я думал над этим, но меня смущает ситуация, когда сайт закончится на 3-ей странице если пользователь последний раз обновлял нулевую несколько часов назад переключившись на что-нибудь другое, а потом вернувшись к борде.
Да и пускай, это лучше чем он увидит тред, зайдет в него, а он уже удален.
Ну тут тоже проблема в том, что борда быстро кончится, если на нулевую давно не заходили и часть тредов утонуло. Да и потенциально этот пет расчитан на максимальный перформанс и мне кажется, что выборка из базы по конкретным айдишкам будет быстрее чем расчет по дате.
Когда ты скролишь двач, то треды автоматически подгружаются когда ты доходишь до конца страницы, я делаю свою пет-борду и хочу аналог сделать
>>55303
Подгружаешь при заходе на /board_name список айдишников тредов в виде массива, первые скажем 20 из них грузятся и отдаются клиенту. Когда клиент долистал до конца, отправляешь запрос и подгружаешь остальные 20 тредов по их айдишникам (если какие-то из них сдохли за это время то ничего не возвращаешь клиенту вместо того чтобы падать или кидать невалидный урл и идешь дальше)
Очевидно же
Так уже писал выше что так можно сделать, но тут проблема в том, что борда быстро кончится, если нулевую давно не обновляли, а занимались чем то другим.
Подскажите, пожалуйста, как лучше всего ускорить выполнение моей функции: https://dumpz.org/cDxQKp5s7cm8 в генераторе первая строка съехала, блэт
Суть: пишу микросервис на фласке, суть которого получать на вход большой список данных и ходить с ними в десяток других сервисов, агрегируя необходимую информацию, в результате формировать огромный csv файл и отправлять в респонсе. Проблема в том, что некоторые сервисы возвращают огромное количество данных и, соответственно, требуют много времени на получение ответа от них вплоть до 3-5 секунд. Собственно, обработка списка из 100 строк может занять до 5 минут времени, что достаточно долго, учитывая что в идеале за это время хотелось бы обрабатывать в десять-двадцать раз больше информации.
Вопрос - какими способами можно ускорить данный процесс?
Первая мысль - наладить трединг или мультипроцессинг с каким-нибудь producer-consumer, но я не могу пока понять, как лучше сделать это внутри моего генератора.
async await уровня /b
Дано задание - отфильтровать из кортежа на входе только строки и вывести их с нумерацией.
На вход например дают:
('Бананы', [1, 2], ('Stepik',), 'Яблоки', '', 'Макароны', 5, True)
На выход ожидается:
1) Бананы
2) Яблоки
3) Макароны
Пытаюсь все сделать через одно списочное выражение (а не 2, как уже сделал). Но как в списочное выражение засунуть итератор? Чтобы каждому новому элементу присваивалось вот это 1,2,3
result = [str(итератор) + ") " + i for i in args if type(i) == str and len(i) > 0]
Я слишком много хочу от Питона?
Спасибо.
Через компрехеншен пиши: так в сто раз короче и читабельнее. Мап/фильтр + лямбда пишут только джуны и свитчеры с жявы.
Что такое компрехеншен? Списочное выражение?
А почему не джанго?
Если на синхронном фреймворке писать, то тебе надо или отправлять задание через что-нибудь вроде celery, либо использовать треды.
Смотри про concurrent.futures.ThreadPoolExecutor
https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor
причём там даже пример приведён очень близкий к тому, что тебе надо.
Но я бы иначе реализовал, вот так примерно:
https://ideone.com/NFT5Ud
Как жить на синхронном фреймворке и лазать в БД?
А как раньше весь интернет работал, до появления моды на асинхронщину? По снегу ходили десять километров запрос в базу послать, а как же.
>Как жить на синхронном фреймворке и лазать в БД?
В чём проблема? Берешь и лезешь. В это время твой процесс с синхронном фреймворком ждёт, а другие запросы обслуживают другие инстансы.
Естественно запускается много инстансов. Если ты круды пилишь, то главный затык не в том, что инстансы долго ждут ответ, а в том, что медленные запросы могут просто завесить сервер БД. То есть у тебя тупо БД нагрузку не потянет, и никакие треды и асинхронщина не спасут.
Асинхронщина становится необходимой, когда ты продолжительные запросы начинаешь обрабатывать, вебсокеты в первую очередь. Хотя тредами тоже можно решить.
Так, что невозможно работать с постоянными соединениями в блокирующем режиме, кроме совсем примитивных сценариев.
Хм, че-то я не задумывался над этим раньше. Погонял вебсокеты в fastapi, но это очевидный асинхронный фремворк, еще ради эксперимента ебошил их в nodejs но вся жс-среда асинхронна по свой сути и основана на ивентах и коллбеках. А как же тогда юзать вебсокеты в джанго или фласке? Неужели их там нет?
Есть свои костыльные реализации на тех же тредах
В жопаскрипте с npm было проще и понятнее. У меня стоит несколько интерпретаторов (2.7, 3.7 и 3.8) как мне создать venv с конкретным питоном - 3.7 ? Потому что по дефолту создается с 3.8
Не говоря уже о том что у меня в глобальном интерпретаторе затесалось несколько "левых" пакетов типо alembic которые заботливо перелезают в новую venv когда ее создаю, как создать "чистую" среду?
Linux Ubuntu
Базовый встроенный венв использует системный интерпретатор. Чтобы кастомный выбрать тебе понадобится полноценный virtualenv
https://virtualenv.pypa.io/en/latest/cli_interface.html#section-discovery
https://askubuntu.com/questions/1173422/how-to-change-virtualenv-interpreter
просто создаёшь окружение командой
python3.8 -m venv ~/virtualenvs/py38
Можешь путь к конкретному питону глобально прописать
/usr/bin/python3.8 -m venv ~/virtualenvs/py38
Ну ХЗ, разбираться надо, у меня на убунтах это работает. И на которой сейчас сижу, и на других я точно так же всегда ставил, причём без какой-либо специальной настройки.
Мне кажется ты в какой-то момент что-то у себя в системе просто сломал.
Сейчас ради интереса попробую в убунте под докером с нуля питон поставить и проделать
Сосач ку. Я смотрю курс мфти. А где брать примеры задач для самостоятельного решения? Подкиньте ресурсов
https://stepik.org/course/58852/info
https://stepik.org/course/68343/info
Вообще предлагаю эти курсы в шапку добавить. Они хорошие и бесплатные.
Спасибо!
Промоутеры Степика, хороший заход, но нет, не пойдёт так.
Вы эти курсы бесплатно открываете, чтобы потом толкать за деньги платные. Это банальная реклама. Причём надо зарегистрироваться, чтобы эти курсы посмотреть.
Хотя весь этот материал в плане знаний доступен бесплатно, без регисртации и смс в массе разных вариантов.
Не спорю, что со временем будут добавляться новые платные курсы от автора этих курсов (они уже у него есть) и на платформе вообще.
Но конкретно эти два курса - бесплатные. И могут тебя протащить с нуля до анонимных функций и работы с файлами.
Покажи мне еще бесплатный курс, где в тексте дается теория, а следом по 200+ задачек на курс.
Учебники - устарели, потому что нужно не только неокортекс абстракциями грузить, но и в спинной мозг загружать привычку делать отступы 4 пробелами, писать int(input()) и прочие подобные базовые вещи.
Видосики - для тупых зумерков, которые будут с экрана по буковке код копировать.
Вот какое дело. Это анон-доска, тут анон-демократия.
А у вас платформа такая, что надо сначала зарегистрироваться, чтобы курс посмотреть, вся активность естественно собирается, и т.п.
То есть противоречит духу анон-сообщества.
У "нас". Я сам этот курс начал летом, и если бы не этот курс, то меня бы здесь не было.
В своем высокомерии вы так досидитесь в своей усмановской клоаке до того, что здесь новичков не будет и будут сидеть только олды, пока и тем не надоест этот подментованный форум (аноны, ага).
Обновления шапки где? Собирались де тредов 5-10 назад. Вот и добавьте в шапку норм курсы с автопроверкой. Хватит уже нубов мучать толстыми томами или курсами на инглише (который не все на слух могут воспринимать).
И я сильно сомневаюсь, что ты сидишь через браузер с отключенным js, пуская трафик через цепочку дедиков в далеких странах и тщательно подбираешь слова, чтобы тебя нельзя было вычислить через анализ манеры общения. А если это делаешь ты, то так не делает > 90% населения треда. Не строй себе иллюзий, "анон".
Сап. Подскажите книгу, по питону продвинутого уровня. А то лутца прочитал уже давно. Уже работаю разрабом. И датаклассы и тайпхинты успел выучить. Но только потому что увидел их в работе и загуглил. А сколько ещё вещей, который я не видел и не изучил? Например не умею дэбажить и профилировать. Плохо понимаю что умеют pip и tox. Не знаю как внутри там под капотом работает питон. Да и вообще мало ли что я ещё не знаю. Знает кто-нибудь углубленную книгу по питону?
Fluent python
Для питона очень большой перевес вкатунских книг, серьзных мало, надо собирать по крупицам по всяким статейкам, выступлениям, видяшкам.
Для тех, кто умеет программировать на других языках и хочет про питон больше узнать, очень полезна Intermediate Python, тоненькая книжка именно про особую специфику питона.
Продвинутую книжку хотелось бы иметь, но вряд ли их много.
Каждую продвинутую тему надо описывать многословно, и таких тем много.
На самом деле официальный туториал весьма хорош и там про всё есть.
Сложнее, когда надо в сторону идти и смотреть сторонние пакеты, вот этого там нет.
Например pytest, это внешняя система и надо изучать отдельно.
Датаклассы это лишь минимальная часть от технологии, если серьёзно лезть, надо attrs/cattr и pydantic, две известные системы независимые.
Всякие sqlanchemy и связанные вещи, тоже большая очень тема.
Свейгарт Э. - Программирование для детей
А может в треде соберём годноту про крупицам?
Тогда как вы объясните пикрил?
repr накинул обратного слэша. Значит interactive echo это не равнозначно repr?
действительно
enumerate начинает с нуля, если не указать арг start=1. Мы вам перезвоним.
Но вообще короче этот как раз тот кейс когда для читабельности лучше луп сделать.
Цикл с аппендами медленнее, и громоздче.
Просто вы не умеете готовить компрехеншны и распаковку.
filtered_data = (entry for entry in args if isinstance(entry, str))
result = [*enumerate(filtered_data, 1)]
У меня функция обращается к ссылке и скачивает пак видосиков, мне надо чтоб она это делала автоматически в определенное время суток заданное мной, как это сделать?
- Бесконечный луп с проверкой времени
- Запустить в нужное время с sleep(3600 * 24)
- cron
- Какая-нибудь библиотеканейм, которая работает по тому же принципу
Выбирай о хошь
Получаю в скрипте с запроса жсон, в нём содержится поле с кириллицей, которое при выводе становится нечитабельным набором символов. При попытке стандартного энкод-декода из цп1251 в ютф8 вылезает ошибка "utf-8' codec can't decode byte "0xd4" invalid continuation byte".
Скрипт крутится в кубере, на линуксовом контейнере (настраивал его не я).
Как правильно вывести строку с русеком при данной ситуации?
Шизоид, таблетки. Усредненные оценки по множественным ранам хороши тем, что сглаживают случайности. Это БАЗА всей экспериментальной науки. Лурк моар, как говорится.
Так вот, усредненные показывают что таки да, компрехеншен быстрее, но очень маргинально. И это отлично бьется с теорией, потому что две эти разные функции порождают почти одинаковый байткод.
Выводы как обычно: шизойды экономят на спичках, засирая код идиотскими трехэтажными компрехеншенами. Более опытные питонюги временами выбирают циклы исходя из конкретного кейса и их код чиатется намного лучше. И ничем не уступает по скорости (это если вообще отвлечься от того, что оптимизировать питон это да вы вообще блядь отбитые)
>И это отлично бьется с теорией
Так ты не теоретизированиями занимайся. А на практику посмотри
>почти одинаковый байткод
Так одинаковый или почти одинаковый?
Кстати я вас наебал, вызывать %timeit надо так:
In [54]: %timeit q = kek1()
1.2 s ± 25.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [55]: %timeit q = kek2()
818 ms ± 130 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Практика такова, что я ваши компрехеншены отбриваю на ревью и вы бугуртите...
Конечно, пока нет большой вложенности.
Если код небольшой, нужны компрехеншены. Если большой, то лучше раскрывать в цикл.
И дело в читаемости в первую очередь, а не в экономии наносекунд на итерацию цикла.
>Практика такова, что я ваши компрехеншены отбриваю на ревью и вы бугуртите...
Такое возможно, если ревьювер не умеет писать на питоне, а из тех, кто "за две недели синтаксис проглядел и может работать".
>присвоения лишней переменной
Ну вот да, когда мы приходим к таким оптимизациям, кажется пора менять питон на что-то batya approved вроде крестов.
Это не оптимизация ради оптимизации, это просто лишние переменные, что вредно для читаемости.
С точки зрения анализа кода код сильно разный, в одном случае по итогу у тебя есть переменная x, в другом случае её нет. Из-за этого и разница в производительности.
Потом в любом случае полезно думать о том, во что вливается твой код. И не делать лишний раз тормоза, когда их можно не делать, причём без вреда для поддерживаемости кода.
Прилетает ехидный StopIteration,
Вы забыли добавить kek = object(); next(iterator, kek), мы вам перезвоним.
>трехэтажными компрехеншенами
В примере самый обычный компрехеншн с фильтром из одного условия, который в любом учебнике есть. Призыва использовать их всегда не было, а только показано, как исправить другой код. Где мои два оставшихся этажа?
>>56614
Разница в 50%. Да, очень маргинально отличается. Когда дорастешь до обработок каких-нибудь таблиц на пару миллионов значений в фоновых тасочках какого-нибудь селери, вспомнишь про то, как писать эффективный код и выкинешь змею нет, не выкинешь, скажут пм и клиент
Переписка с шизами, считаюших таковыми всех вокруг, кроме себя, окончена.
>>56803
Распаковка работает с любым итерируемым объектом, в том числе с кастомными генераторами, источниками данных и т.д.
>>56805
Откуда он прилетает, если в том посте даже кода нет, а только указание на нужный метод? Хорошо наверное воображать то, чего не существует, и спорить с ним.
Алсо, на практике в подавляющем числе случаев код взятия первого элемента не создает видимость наличия этого элемента, как предложил ты, а передает в default что-то вроде None или статического маркера, если нон возможен как значение в генераторе, так что твой код тоже ни о чем.
а какие ты скрипты писал для работы?
как предложил ты, а передает в default что-то вроде None или статического маркера, если нон возможен как значение в генераторе, так что твой код тоже ни о чем.
Читай задание и не пукай.
>Алсо, на практике в подавляющем числе случаев код взятия первого элемента не создает видимость наличия этого элемента,
Что там first в джанге возвращает, ммм?
> Когда дорастешь до обработок каких-нибудь таблиц на пару миллионов значений
Ох щас бы крутить табличные данные в голом питоне. Ты понимаешь, что ты отбитый наглухо?
>Что там first в джанге возвращает, ммм?
None он возврщает шиз, ничем не отличается от next([T], None), возвращаемое значение в любом случае Optional[T] и его требуется проверить на None
А так ты просто читаешь код жопой. object() как раз чаще всего и используется как статический маркер.
Кароче, есть набор функций, которые по чуть чуть юзаешь везде. В один момент перенес их в модуль utils. Теперь когда ты изменяешь функцию get_zalupa пересобираются библиотеки, которые используют модуль utils, но которым функция get_zalupa не нужна, но которые используют функцию get_jopa из того же модуля. Модули, которые используют get_zalupa и get_jopa являются пересекающимися множествами.
Это означает говнокод, тут либо дефолт который можно использовать дальше по коду либо None. Все остальное выглядит как полный треш за который обоссут на ревью.
А не похуй ли?
Нипомогло. Обошелся [0] в конце
> дефолт который можно использовать дальше
Его положили в переменную kek, значит можно. Попущен.
Представь, что у тебя ci/cd настроен так, что пуш в мастер для модуля создает новую версию пакета и заливает ее в твой pypi/на сервер. При этом проверяются все либы, которые зависимы от исходной и так же пересобираются, пока везде не будет самая новая версия твоего модуля.
мимо
Ты буйный школьник какой-то.
Решение дали. Я, кстати, не знал, что вот next() такое умеет. Правда им реально не пользуюсь.
Этот параметр нужен как раз для таких целей.
Использовать так object это какая-то лютая дикость. Приведи пример, чтобы в каком-нибудь реальном проекте для каких-то подобных целей object использовался.
<Более того, не понятно как вообще это можно потом использовать, ну будет у тебя kek типа object. Что ты с этим будешь делать?
Если не хочется None, то тогда делают Ellipsis (троеточие)
result = next(gen(), ...)
if result is Ellipsis:
____pass
Это альтернатива None, поскольку None всё-таки может штатным образом возвращаться.
>Использовать так object это какая-то лютая дикость. Приведи пример, чтобы в каком-нибудь реальном проекте для каких-то подобных целей object использовался.
Бля, чел...
https://github.com/python/cpython/blob/main/Lib/functools.py#L527
В стандартной либе полно треш кода
Особенно забавно:
cache_get = cache.get # bound method to lookup a key or return None
cache_len = cache.__len__ # get cache size without calling len()
На самом деле это имеет смысл. Вынесенные методы работают быстрее, так как не приходится парсить объект на его наличие
Тоже думаю, что тут оптимизационное байтоёбство. Кеш всё-таки должен быть быстрым и это разумно.
>>> def foo1():
... return cache.get('aaa', None)
...
>>> def foo2():
... return cache_get('aaa', None)
...
>>> dis.dis(foo1)
0 LOAD_GLOBAL 0 (cache)
2 LOAD_ATTR 1 (get)
4 LOAD_CONST 1 ('aaa')
6 LOAD_CONST 0 (None)
8 CALL_FUNCTION 2
10 RETURN_VALUE
>>> dis.dis(foo2)
0 LOAD_GLOBAL 0 (cache_get)
2 LOAD_CONST 1 ('aaa')
4 LOAD_CONST 0 (None)
6 CALL_FUNCTION 2
8 RETURN_VALUE
Надо тестировать, насколько разница велика. Но при учёте, что ты пишешь системную библиотеку, которой часто пользуются, то почему нет?
Думал что подобное должны были оптимизировать для встроенных типов, как например разворачивание числовых выражений в константу.
Там кстати объект используется как дефолт в случае если не задан размер, дальше по коду идет link = cache_get(key); if link is not None:
Нет так просто с этим. Ты можешь захотеть создать свой класс, унаследованный от словаря, и переопределить в нём нужные методы.
Если делать такие оптимизации, то придётся городить что-то очень сложное.
Ну и в принципе есть такое, что язык плохо оптимизирован. Просто его изначально создавали без такого прицела. Там много чего можно было бы оптимизировать, если сделать специальные особые типы с ограниченными возможностями. Например, те же словари, но без возможности наследования от них.
У питона очень тупой итрепретатор, к сожалению, хотя при генерации байт-кода уже можно было бы сделать оптимизации. Вроде за производительность планировали взяться в следующих релизах. Охуел, когда узнал, что даже вызов функции в питоне это тяжелая операция.
Ну там ниже идет вроде манкипатч try:
from _functools import _lru_cache_wrapper
except ImportError:
pass
Это вроде как сишная реализация которая перекрывает то что было выше
Правильно, потому что если размер задан, то в кэше лежат уже не сами значения, а кортежи в которых помимо значений есть еще и указатели на позицию в кольцевом буфере.
Поэтому, просто None означает что мы ничего такого в кэш не клали.
https://github.com/python/cpython/blob/main/Modules/_functoolsmodule.c
Вот что в реале будет юзаться.
В плане байтоёбства я вот что не понимаю
строки 542-547
def wrapper(args, kwds):
____# No caching -- just a statistics update
____nonlocal misses
____misses += 1
____result = user_function(args, kwds)
____return result
На кой хрен тут создаётся переменная result? Почему нельзя сразу сделать
return user_function(args, *kwds)
(звёзды слетят, ну все поймут)
Это обходится в две лишние ненужные операции в байткоде.
Один хуй ниже патчат код сишной либой лол.
>2 LOAD_ATTR 1 (get)
The LOAD_ATTR instruction now uses new “per opcode cache” mechanism. It is about 36% faster now for regular attributes and 44% faster for slots. (Contributed by Pablo Galindo and Yury Selivanov in bpo-42093 and Guido van Rossum in bpo-42927, based on ideas implemented originally in PyPy and MicroPython.)
В 3.10 начали оптимизировать это
Привет, анон. Так вышло, что надо переходить по изъебистой ссылке в питоне, urllib и requests выкидывают похожие ошибки
ProtocolError: ('Connection aborted.', OSError(0, 'Error'))
Типа того, в гугле 0 инфы по делу, может кто знает как решить ? или посоветуйте либу, не эти 2 хуйни, которая может подключиться по прокси (http , socks5 ), сделать куда-то запрос без лишней ебли головы
requests пиздец хуйня, отвратительно работает подключение по HTTP прокси. Вместо того, чтобы выкинуть ошибку, считает прокси валидными при заведомо плохих данных. Пиздец, открыл их гитхаб, не только у меня проблемы с ними. А альтернативу б найти
Какой в питоне есть годный способ сделать несколько попыток повторения при какой-то ошибке? Я обычно делаю рекурсивные вызовы со счетчиком, но это как-то не очень.
Как создать ссылку для получения файлов в бесконечном цикле? При обращении к ссылке файлы должны автоматически сохраняться в указанную директорию.
Напиши свой retry декоратор
Пиши, хули.
Вот допустим во вьюшке у меня представление
def advertisement_spec(request, args, *kwargs):
return HttpResponse(и пошел текст)
в урле
path("todo/", views.advertisement_spec, name='advertisement_spec')
Что мне сделать то нужно? Я плохо понял что от меня требуется.
Пользуюсь фласком, вот функция:
@app.route('/upload',methods = ['GET','POST'])
def upload_file():
file = request.files
return jsonify()
Сам файл приходит с постмана, но хули дальше делать не знаю, через open не сохранялся.
>ожидают предопределение списка
Наверное чо-то типо получения списка из базы?
>оборачивание его в теги нумерованного списка
Достаёшь из контекста и оборачиваешься в <ol><li>{item}</li></ol>
Полученную строку суёшь в Response.
А по факту хуйня какая-то, а не задача
короче мне просто создать html и дать путь к нему, чтоб не хранить текст во вьюшке?
>Достаёшь из контекста
Обосрался тут. Не из контекста, а из списка, конечно
И построение строки будет что-то типо:
"<ol>" + "".join([f'<li>{item}</li>' for item in items]) + "</ol>"
Не проверял, работает ли вообще
Ты нормальный? Речь о составе команды, при чем тут криворукость? Даже если лично я навелосипежу эту обработку на крестах-жабах, никто в здравом уме не будет это принимать, т.к. понадобится нанимать отдельного спеца на какой-нибудь кривой непостоянный график для поддержки этого решения, когда весь проект и, соответственно, команда для него - змеевеки.
Дык я не знаю, чо вы там изучить успели уже. По нормальному если делать - надо создать context и туда передать свой список значений, а потом во темплейте уже подставлять через тэги типо
<ol>
{% for item in items %}
<li>{{ item}}</li>
{% endfor %}
</ol>
Я тебя понял. Спасибо.
Передавать retry_count в kwargs пока тот не дойдёт до библиотечной функции, которая этот параметр поддерживает. Если нет возможности, то пиши свой велосипед с удобным тебе логгингом, проверкой результата и хэндлинга эксепшенов
В этом году ЕГЭ сделали полностью компьютерным, так что можно было абсолютно все задания решать с помощью компьютера, но некоторые всё же быстрее на листочке решить.
Из тех, что решаются с помощью программы, были задания на решение уравнения с несколькими неизвестными и параметрам, задания на написание программы с рекурсией, программы для перевода в другие системы исчисления, обработка массивов с числами, обработка текстовых файлов, нахождение промежуточного значения переменной, две задачи прикладного содержания.
Если интересно, можешь в Гугле набрать "решу ЕГЭ информатика" и посмотреть типовой тест
>Если интересно, можешь в Гугле набрать "решу ЕГЭ информатика" и посмотреть типовой тест
Загуглил, чуть иначе. Вот такой вариант нашёл, пробный онлайн-тест:
https://inf-ege.sdamgia.ru/test?id=9195205
Что-то там такой конкретный литкод, я не ожидал.
Попробую ради интереса чуть порежать, пока не надоест.
О боже блять, ну что за еб твою мать. Запустил фастапи, попытался создать соединение через вебсокет, постоянно высирается ошибка 403:
('127.0.0.1', 49434) - "WebSocket /ws" 403
Делаю как в примерах, все равно та же хуйня. Думал распространенная рпоблема, но нихера подобного. Что это блять?
pip install websockets
Я должен передавать список в папрметрах функции_2 или можно обращаться к списку как к аргументу функции_2? Есть какие-то рекомендации или это фломастеры на вкус и цвет?
Просто вызываешь одну функцию внутри тела другой функции. Можешь конечно и как аргумент при вызове перекидывать.
Как засунуть глобальную переменную в input callback'a?
Вопрос по фласку ip выводится через request.remote_addr, а как дату вывести? Причем желательно именно дату без времени в часах и минутах.
Я могу просто в главном Panel'е через dc.DrawBitmap() нарисовать, но тогда у меня не будет никакого объекта с координатами и размером, чтобы клик хендлер повесить. Если же я пытаюсь использовать хоть StaticBitmap, хоть Panel — сразу же чёрные углы появляются.
Неужели это такой охуительно продвинутый дизайн, что не сделали нормальным методом? Я с ткинтера-то ушёл, потому что на стаке сказали, что в wxpython'е прозрачности имплементированы нормально. А в итоге соврали, падлы, та же хуйня без примитивных фич.
Я даже не против иметь два "объекта": один для отрисовки и второй для нажатия. Но как мне тогда сделать полностью прозрачный объект, который будет лишь для захвата клика мыши?
Ну как обычно, часами бьёшься, а как спросишь — тут же решение нашёл.
Хотя, вроде вот разобрался — нужно унаследовать от StaticBitmap'а и в EVT_PAINT хендлере не делать dc.Clear(), и там же dc.DrawBitmap().
Пилю джанго проект. Внезапно одна приложуха начала выплевывать страницу как текст html Ни ошибок ничего. Код самой приложухи не менялся. Что делать? куда смотреть? Гугл не помог.
С заголовками все норм. Но дело было действительно в контейнт тайпе. Кто то передал словарь контекст в рендер дважды, как раз на позицию контент тайпа. Убрал лишний словарь все заработало.
Ебаный рот этого fasapi блять...
Сука битый час уже ебусь с ошибкой рендеринга темплейта jinja. Когда юзаю там url_for то эта мразь высираетм не NoMatchFound то есть не находит файла который я там ему указала. Абсолютно не ясно блять, хули ему не так, отладить - тоже
У меня открывается она в виде изображения
subprocess.call('diff -qr ' + folder1 + ' ' + folder2 + '> file.txt', shell=True) не создает файл. Возможно проебал listdir или что-то еще.
Лучше в телегу, @nevershi, за помощь могу чуть отблагодарить.
Алгоритмический язык - язык, который используется для Кумира (программка для изучения программирования в средней школе). А про Бейсик не знаю, не думаю, что ещё в принципе в каких-либо школах изучают
Я вызывал ffmpeg так (аргументы списком). По другому не работало. Дальше не
разбирался.
subprocess.call(['ffmpeg', '-i', src_path+i.name,"-hide_banner",'-y', "-vf", "scale=h=480:w=854",'-crf', '27',dst_path+re.sub(".mp3|.mp4|.mkv|.wmv|.flac",".mp4",i.name)])
Но у меня и твой вариант работает.
>>58296
4 раза перечитал пока понял. Python way в данном случае сделать кортеж args и словарь kwargs аргументов функции, заполнить их в произвольном порядке, произвольным способом, и в конце вызвать один раз функцию с этим словарем в качестве аргумента используя операции распаковки func (args, *kwargs).
https://realpython.com/python-kwargs-and-args/
Как правильно хранить все инстансы конкретного класса?
У меня есть набор объектов моего класса Session. У каждой Session есть свой уникальный id, хочу метод типо get_session(id) который по этому уникальному айдишнику достанет конкретную сессию
Берешь дикт, делаешь ключ-айдишку и значение-инстанс, можешь под это дело создать класс SessionStorage и реализовать метод get_session
https://ideone.com/WWNNVv
Выдает один объект на неиспользуемые вызовы, а потом его же дает на первом следующем используемом, лол.
Это оптимизация конкретно вм cpython? Есть где почитать про такие штуки?
Это не один объект, это разные объекты размещенные в одной и той же части памяти, просто у тебя при отсутствии присваивания lst тут же уничтожается и при следующих вызовах питом переиспользует эту память
Хмм, похоже на то. https://ideone.com/atK3oC
На как он так постоянно попадает в тот же адрес, если даже последовательно созданные могут очень отличатся?
Считай что у питона в этот момент есть набор ячеек с выделенной памятью, которую еще не освободили и размера которой хватает, что бы закинуть туда твой lst
Как открыть видос используя фласк в новой вкладке браузера? Файл хранится у меня, при переходе по ссылке должен воспроизводится, вроде как надо юзать return send_file(тут чета написать надо), но хз что.
Звучит довольно просто, надо только хатетепе-метод дернуть.
Пример вот:
tasks = ['Установить python', 'Установить django', 'Запустить сервер', 'Порадоваться результату']
new_tasks = ['<li>' + task + '</li>' for task in tasks]
....
return HttpResponse(tasks_str)
Но я плохо понимаю суть происходящего, сейчас у меня вьюшка возвращает
HttpResponce('<ul>'
'<li>'Раз'<li>'
'<li>'Два'<li>'
'<ul>' ) и т.д
Я честно сам не знаю что за переменная это, это в примере так, и мне нужно в advertisement_spec вернуть HttpResponse со строкой, состоящей из элементов списка, обёрнутых (элементов) в теги, препод еще говорит что у меня просто строка и в реальном проекте пользователь будет попунктно вводить строки,я не понимаю о чем речь идет, а моя вьюшка вот
from django.shortcuts import render
from django.http import HttpResponse
def advertisement_list(request, args, kwargs):
return render(request, 'advertisement/advertisement_list.html', {})
def advertisement_spec(request, args, kwargs):
return HttpResponse('<ul>'
'<li>Товар 1</li>'
'<li>Товар 2</li>'
'<li>Товар 3</li>'
'<li>Товар 4</li>'
'<li>Товар 5</li>'
'</ul>')
>>59107
Чо-то ты нахуевертил тут. Зачем тебе два метода вообще?
А по факту вот чо надо тебе сделать. Беру примеры из >>59083
return render(request, 'advertisement/advertisement_list.html', {tasks=tasks})
Внутри advertisement_list.html юзаешь темплейт тэги.
<ul>
{% for task in tasks %}
<li>{{ task }}</li>
{% endfor %}
</ul>
Там первый для главной страницы и второй для /блабла. Это неправильно? Вроде работает
Что вообще делают темплейт теги и чем отличаются от html ?
Спасибо огромное что отозвался и помог, вечером буду пробовать.
И что значит {'tasks': tasks} в конце render ? Я всегда в конце ставил {} и знал лишь то, что это все дело возьмет мой html и вернет.
>Там первый для главной страницы и второй для /блабла. Это неправильно? Вроде работает
Я не знаю, что для тебя "правильно". Если тебе просто html отобразить без проброса данных, то сойдёт
>Что вообще делают темплейт теги и чем отличаются от html ?
Ну смари. Вот видишь этот словарик "{'tasks': tasks}" загадочный? Це есть context. В этом контексте ты передаёшь данные, которые прокидываются в твой файл, указанный на один параметр раньше. То есть в данном случае в "advertisement/advertisement_list.html".
Внутри html-ки ты можешь брать данные из контекста при помощи языка шаблонов Джанги. Как что там работает расписывать не буду - доки в помощь, там нет ничего сложного.
Да, я. Хех. Ну у меня туговато пока идет, плохо понимаю. Почитаю, спасибо.
Бот или площадку для профсоюзов. Сейчас эта хрень нарастает, и среди айтишников тоже.
Пиши то что интересно тебе и не бойся сложности.
ВТФ?
21:47:45.123: [project] git -c credential.helper= -c core.quotepath=false -c log.showSignature=false push --progress --porcelain 123 refs/heads/master:master
error: failed to push some refs to 'https://адрес.гит
hint: Updates were rejected because the remote contains work that you do
To https://адрес.гит
!refs/heads/master:refs/heads/master[rejected] (fetch first)
Done
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Подозревал что дело в CORS. Все так и оказалось. Он блять localhost и 127.0.0.1 считает разными хостами блять
Ну вот че это захуйня? Что за еб вашу мать?
убил 4 часа на эту хуйню
"object.__new__() takes exactly one argument" но ведь блин в примере было именно так...
У меня есть некий объект-словарь, я посылаю запрос на получение некого элемента из этого словаря, значение которого превышает 100. Если мы смотрим в словарь и на данный момент не видим такого элемента то "засыпаем" и ждем его появления, как только он появляется, отдаем его. Подозреваю тут асинхронку нужно ебошить, но вот как именно?
Я когда-то такую штуку делал, но тут элемент ты получишь не сразу, а когда эвент луп отпустит, может у тебя адаптировать получится под твои нужды
https://ideone.com/qdAILK
Код вроде
tg = Bot(token=token)
tg.send_message(user_id, f'test')
не работает т.к. обычно он вызывается через await а await неполучается указать вне декораторных оберток.
Скинь чатик, хочу в сокетах разобраться, как это работает.
Можно добавить хук в методы изменяющие словарь, хук будет проверять появилось ли значение соответствующее условию. Если появилось, то хук вызывает коллбек.
>обычно он вызывается через await а await неполучается указать вне декораторных оберток
неполучается указать вне декораторных оберток.
А ты подумай почему
Легко сказать, неочевидно реализовать
Что значит "проверяет"? Оно в бесконечном цикле там сидит, проверяет, засыпает на секунду и снова проверяет?
бот это же примитивная срань по шаблону, не?
Не владею aiogram, то если ты хочешь вызвать корутину из синхронного кода, то есть то, что надо через await запускать, тебе надо запустить эту корутину в виде задачи
asyncio.create_task(tg.send_message(user_id, 'test'))
Так запустится, но результат корутины ты получить без await в любом случае не сможешь.
Вот у меня есть данные которые я с сервака хочу передать паре клиентов, что на нем сейчас сидят, как это сделать блин? Все работает в формате реквест-респонс, я не могу просто и без задней мысли с сервака послать реквест клиенту на сайте. Вроде как есть выход - long polling: клиент просто посылает запрос и ждет ответа скажем 30 секунд, если ничего не происходит то снова шлет запрос и ждет. Вроде неплохо звучит но как это бля делать? Что во фласке что в фастапи или еще где реквесты обрабатываются особыми функциями-хендлерами и как же мне блин заставить конкретный хендлер отправить данные конкретному клиенту?
Вообще говоря неплохая тема, как бы еще таймаут поставить чтобы в случае его превышения бросался эксепшн / возвращался None, а то иногла ждать до обсера - не лучшая идея
>Я когда-то такую штуку делал
Очевидно недавно, код завязан на специфику версии 3.9, которой меньше года.
Как минимум явная ошибка в await_elem, там ты перезаписываешь future в словаре _await_task, не проверяя, есть ли там что-нибудь. При этом делаешь pop оттуда, когда достаёшь элемент. Очевидно может быть коллизия.
Честно говоря что-то странное, вообще ты какие-то именованные каналы или именованные события переизобретаешь.
Здесь надо тебе прописать ТЗ корректно, тест-кейсы.
Что должно происходить, если ты сначала положишь элемент больше 100, а потом уберёшь его? И после этого будешь слушать?
Насколько большой словарь? Тут просто вопросы оптимизации могут быть.
Вообще такая идея может быть. Ты создаёшь свой класс-словарь. В нём есть множество (set) ключей, значения словаря по которым больше 100. И делаем asyncio.Event(), событие, которое срабатывает, если есть элемент такой.
Вот, в __setitem__ ты смотришь, какое значение. Если значение больше 100, помещаешь ключ в множество. Если меньше, делаешь discart ключа из множества.
После этого смотришь на размер множества и меняешь статус Event() по необходимости.
__delitem__ тоже надо скорректировать.
>тест-кейсы
Конкретно принципиален такой тесткейс
my_dict[]
... пока в нём нет больших значений, но в другой задаче кто-то уже что-то ждёт
my_dict['key'] = 444
my_dict['key'] = 10
Вот тут синхронный код, без await. Ты записал большое значение, и тут же перезаписываешь его маленьким. Как должен вести себя словарь в этом случае?
Ну чел... Это примерно как спрашивать, в чём разница между процессом и процессором.
Лутц это реликт из конца нулевых. Про асинхронку он ничего не рассказывал - ничего удивительного
В основном два телеграм бота (акция халявный бигмак в макдаке - авторег аккаунтов, парсер транспорта москвы по бортовым и гос номерам) и по мелочи парсеры, автоотправка форм (разработка типо бомбера обратных звонков с разных сайтов), раньше делал говно сайты на пыхапе и верстал хуевый дизайн.
Хз насколько тут это считается норм для новичка, но тупо тестировал возможности питона и пытался крутиться, заработать пассивно пару соток в день (пока профита нет, кроме опыта)
то есть асинкио это физическое устройство а целери это код?
Блять, это и есть long polling? Без рофлов?
ебануться нахуй
Даже если мы заменим эту ебень на асинхронки и asyncio.sleep все равно херня выходит
Реализация long polling будет очень сильно зависеть от фреймворка и от задачи.
Вот у тебя есть хендлер, обрабатывающий соединение. Оно должно запускаться или в виде asyncio-задачи, или в виде отдельного треда.
Хендлер не отвечает сразу, а подписывается на какую-то очередь или канал, из которого с таймаутом ждёт сообщение. Если пришло сообщение, отправляет его, если не пришло, отправляет сообщение "ничего пока нет, call again".
>>61090
>>60007
Короче вот что-то вроде демки на aiohttp
https://ideone.com/j44YCk
Запускаешь, набираешь
http://localhost:8040/long_polling/
это запрос
За 15 секунд, если очередь пуста, соединение будет закрыто с сообщением соответствующим.
Если же ты в это время или заранее вызовешь
http://localhost:8040/msg/hello/
то тогда сервер ответит сообщением.
Это иллюстрация идеи.
С фласком будет сложнее, там нужно треды создавать.
И отдельный вопрос, как это поддерживать, когда ты за вебсервером стоишь.
Основная идея вот такая -> https://ideone.com/NJKSxV
>Оно в бесконечном цикле там сидит, проверяет, засыпает на секунду и снова проверяет?
Нет. Чтобы изменить словарь, надо вызвать один из его методов изменяющих этот самый словарь. Вот в этих методах и прописывай дополнительное поведение. В остальное время там нечего проверять.
>>60007
>без задней мысли с сервака послать реквест клиенту
Вебсокет
>как же заставить конкретный хендлер отправить данные конкретному клиенту
У клиента должен быть идентификатор. При получении запроса хендлер проверяет есть ли данные для клиента с этим идентификатором
К примеру у нас есть роль модератора, который может удалять посты, редактировать посты, банить пользователей. Но одному пользователю я хочу дать возможно тоже банить людей, но при этом не давать другие права модератора. А еще одному позволю только удалять посты. И т.д. Я не хочу создавать тысячу ролей на все возможные сочетания прав, а просто хочу как-то 1-2 кликами давать права на конкретные действия в конкретных view. Как такое обычно осуществляется? Извиняюсь за косноязычность.
Создаёшь 2 модели: Role и Permission. Связь Many-to-Many
По сути всё, что тебе надо будет сделать - создать роли, в которых будут прописаны права на действия. Потом уже эти роли раздавать нужным пользователям.
Но это будет работать в том случае, если у тебя в принципе права у пользователей похожи. Если же у тебя принцип такой, что один пользователь может чо-то добавить, другой чо-то удалить, а третий отредактировать, при этом второй может посмотреть записи таблицы, а первый нет, то лучше напрямую с Permission работать без создания ролей
Привет анонычи, реквестирую литературу или курсы по асинхронщине в питоне для веба , всякие aiohttp и тп, везде по чуть-чуть я и сам нашел. Но наверное же есть материал, где львиная часть посвящена именно этой теме?
пс , ролик из ОП-поста уровень хеллоуворлда, мне такое не надо
Спасибо, гляну.
Вообще цель такая, научится создавать асинхронные микросервисы , пс, классическая джанга используется, хочется большего.
Такой же есть реквест. Из советов бы выделил асинхронный фреймворк fastapi. Есть отдельный канал на youtube русскоязычный. В зарубежном сегменте тоже можно нагуглить отдельные плейлисты или скачать целые курсы с пиратской бухты. Еще есть такой проект вида написать чат в реальном времени на django channels и сокетах, тоже популярные и полезный вариант жоско познакомится с асинхронностью.
скорее всего нужно пройти какой-нибудь курс, который последовательно познакомит с основными концепциями и типами задач. На этой базе уже будет полегче решать. Но есть много людей, которым алгосы не даются. Лично знаю ебейшего парня, который зарабатывает 10к зеленых, но при этом не умеет в алгоритмы, он не прошел собес в uber с легкой задачкой на нахождение анаграмм.
да, if name in some_dict ищет совпадения в ключах.
Ну, вот я, например, решал задачу про maximum subarray problem. Долго мучился и в итоге высрал кривое решение O(n^2). Потом прочитал про Kadane's algorithm и понял, что это ужасно просто. Но неужели до него можно быстро дойти, никогда с ним до этого не сталкиваясь? Или эти задачки (даже простые) основаны на том, что ты просто задрочил все эти алгоритмы?
> решал задачу про maximum subarray problem
Это задачи из класса "динамическое программирование". Они или методами ДП решаются, или схожими идеями для простых случаев.
На литкоде таких довольно много.
Про себя не скажу, что владею хорошо этими техниками, для меня это сложные задачи. Когда не easy и когда надо хорошее решение.
Но на самом деле там довольно небольшой набор приёмов, как решать, идей, как свести сложные задачи к простым, разных трюков. Если ими владеть, что-то придумать, что-то изучить в темах про ДП, то можно довольно легко научиться решать. Мне так кажется по опыту с другими темами.
Попробуй в литкоде выбирать по классам задач. Там есть и на другие темы.
Ищу "Партнера по отчетности".
Вкатываюсь в питон, я в самом начале. И я пропащий прокрастинатор и хикка. Пытаюсь начинать не первый раз уже. Так вот на сайте ютуб прочитал такую тему, что де надо тренера найти, который будет тебя пинать. Это может быть друг или родственник или тренер за много бабок. Но тык как я хикка-нет-друзей, думаю найти себе собрата где-то тут.
Тоже кто сильно ленится, наверно в начале пути, чтоб пинать друг друга. Отчитываться о проделанной работе. Или ВДРУГ есть такой великодушный и терпеливый человек, который хочет попинать просто так.
Что-то вроде:
Сколько часов сегодня занимался, а хули так мало, твои оправдания?
А чё ты делаешь? Почему на двачах сидишь?!
-
Контакты: тг @M10875
27 лвл если что
то видео с ютуба youtube.com/watch?v=RkOJmw15nb4
Найди конфу по Питону в тг и там общайся.
В бизач иди
Сайт который показывает курс валют из нескольких источников с возможностью выгружать csv с историей изменения курса. Потом настрой locust и начинай гонять нагрузку
Да это жоска, я конечно могу ошибаться, но Django Channels это как бы вставки в джанговый код , мне б полностью асинхронщину делать, мне кажется, подход с DJ(Django Channels) сработает в проектах джанги, где требуется что-то ускорить или добавить такие вещи как чат, а если я хочу быструю рест или того лучше графовую апишку, то наверное надо писать что-то сразу на асинхронщие
Не, тут все нормально, я тоже не дошел самостоятельно до такого решения. Задачку ты выбрал хорошую, на собеседованиях может встретиться. Её еще можно решить используя частичные суммы. С помощью частичных сумм можно найти, например, все подмассивы с заданной суммой. Посмотри как-нибудь.
Насчет литкода. Я бы не стал там решать задачи. Лично я смотрю в основном на geeksforgeeks, там можно удобно по темам искать. Также просто гуглю задачу и смотрю на разных сайтах решения + нахожу похожие. Еще на medium куча классных лонгридов на темы алгоритмов.
Из последнего понравилось: Best Time To Buy & Sell Stocks On Leetcode — The Ultimate Guide.
Отдельно советую решить все задачи на sliding window
lst = [1, 3, 4]
dic = {"odin": 1, "dva": 2, "tri": 3, "chetire": 4, "pyat": 5}
result = []
# нужно получить result == ["odin", "tri", "chetire"]
Никак не могу допереть, как это сделать.
Будет на каждом витке создаваться сет, хуевасто.
Да и по смыслу задачи там не должно быть дупов.
А это что бы быстрее, только сет в отдельную переменную надо вынести
Блин, у меня очень туго с list comprehension, никогда их не понимал.
А как мне вывести, если в lst есть какой-то элемент, которого нет в dict? Например 7. Т.е.:
lst = [1, 3, 4, 7]
dic = {"odin": 1, "dva": 2, "tri": 3, "chetire": 4, "pyat": 5}
print([k for k, v in dic.items() if v in lst])
#['odin', 'tri', 'chetire']
print(???)
#7
Вот поясните.
>Сгруппированные по функциональности наборы страниц и логики или что?
Да, вот есть у тебя форум на сайте, делаешь из него отдельное приложение, есть профиль пользователя - еще одно приложение, каталог товаров - так же
Гуглил, там вообще какая-то ебля пиздос. Это реально надо че-то там пыхтеть? Или как-то просто можно решить вопрос? Или мб просто сделать чтоб модуль2 был внутри модуля1 и типа норм?
Типо вот этого:
for i, j in (range(10), range(-10, -1, -1))
Только в моем случае он не поймет меня и ошибку бросит
Через zip
Отправь реквестом напрямую запрос через API.
Есть задача сделать форму с multiplechoicefield что бы чойсы брались из базы. Но по какой то причине форма не меняется при повторных вызовах. Т.е. один раз в дебаге в конструктор заходит, а при последующих уже не заходит. Похоже кешируется. Как бы мне побороть такое ее поведение? Кто знает?
Большинство из этого нихуя не сложные вопросы, а самая что ни на есть база.
> mro, итераторы/генераторы и mutable defaults
Есть в любой не не совсем нубской книге.
> корутины, async/await
Есть книга от орайлей про asyncio, я пока не читал, но вроде годная.
Метаклассы есть у того же лутца и ещё в некоторых книгах видел, сам пока не вникал.
>asyncio
Это же либа для имплементации корутин на генераторах, которая до async/await появилась. А async/await как раз её заменила.
Да база, но не для новичков. Фундамент из самых кишок питона. Как раз то что надо чтобы подняться с элементарного уровня до продвинутого. Мне скорее не объяснение надо, а список топиков, которые я ещё сам не нашёл. В какой-нибудь книге может в списке глав эти темы есть и тогда хочется взглянуть на соседние главы.
>Как раз то что надо чтобы подняться с элементарного уровня до продвинутого.
Тут я конечно загнул, но смысл надеюсь передал.
Вот видел задачку написать функцию декоратор на подобии lru_cache, но можно упрощённую. И тут у новичка, который знает и про mutable defaults и про monkey patching и декораторы без проблем пишет всё равно случается тупик от непонимания как в декораторе хранить состояние кэша между вызовами функции. Очевидное решение сделать класс-декоратор, но требуется функция и чтобы её сделать нужно как раз вспомнить mutable defaults или monkey patching и догадаться применить один из этих методов. Поверхностное изучение этих тем на уровне простой осведомлённости о существовании таких вещей в питоне не достаточно чтобы решить задачу даже с учётом того, что вещи эти базовые.
> Это же либа для имплементации корутин на генераторах, которая до async/await появилась
Нет, это именно базовая либа для асинхронщины, просто async/await позже внесли в синтаксис языка, это считай обвязка для них.
https://docs.python.org/3/library/asyncio.html
А так глянь книги от steven f lott, шарящий чел.
Понимаю что малость нетипичный для питона процесс но все же - я в тайпингах использую интерфейсы а не сам класс, потому что так меньше связность и меньше возможностей наткнуться на циклический импорт
Вместо:
def get_user(self, id: str) -> User
Пишу:
def get_user(self, id: str) -> IUser
Как в таком случае правильно наследоваться от базового класса?
Есть вот у меня BaseModel, класс User надо пронаследовать от него а также и от IUser чтобы обозначить интерфейс.
Косяк вот в чем: на предыдущем месте работы у нас не было никаких юнит-тестов) Вот вообще, я был фуллстек макакой и тестил попросту проверяя функционал, запустив локальный сервер. Сейчас меняю работку и в новой конторе мног овнимания уделено покрытию код тестами, а мне стремно признаться в моих пробелах тут, меня ж обоссут. Что это такое и с чем едят?
И как с запросами быть? Отправлять фейковый запрос? А что если в нем обязательны куки? Что если таких запросов несколько от нескольких разных клиентов но все должны быть проверены вместе?
Мокай кабан кабаныча
я не понимаю, зачем нужны кавычки и f в этой строчке:
full_name = f"{user_info['first']} {user_info['last']}"
почему нельзя просто
full_name = {user_info['first']} {user_info['last']}
ну я уже пробовал, так не работает, но всё равно я не понимаю
помогите нубу
>full_name = f"{user_info['first']} {user_info['last']}"
>почему нельзя просто
>full_name = {user_info['first']} {user_info['last']}
В первом случае у тебя по итогу строка, во втором случае словарь. Точнее в этом случае вообще ошибка синтаксиса, но мог бы быть словарь.
Ну, потому что это не валидное синтаксическое выражение? Ты забыл кстати скобочки убрть, они относятся к форматированию строки. А так у тебя просто два раза индексация словарей. Это как две переменные подряд написать: x x. Бессмыслица.
А форматирование у тебя вставляет переменные (значения ключей словаря) в строку и тогда их можно отобразить так, чтобы они рядом находились.
Фейковых запросов не надо. Для начала покрой ту часть логики, которая работает без веба. Пиши данные в таблицки и смотри что они записываются и нужные связи проставляются. Дергай функции, которые должны инициировать запись в бд и проверяй что она такая какая и предполагалась. У джанги есть тестовый клиент и тестовая бд. Можно даже запросы посылать вида TestClient.get('localhost:8000/huy/pizda?page=1')
А вообще можешь в репозиториях гитхаба посомтреть. Там много проектов с примерами.
Сейчас отображаю вот так:
await message.answer('Text', reply_markup=keyboard_start)
Но вот текст вообще не нужен
поставь пробел.
А какие у тебя знания?
В душе не ебу про докер, все делаю по статейкам, но у меня все проекты в докерах.
Около 60, только начал
Не ссы. Почитай о языке, о инструментах что они юзают. Сходи, послушай что спрашивают. Может и пройдешь. Не знаешь - да и хуй с ними. Не думай, что тебя там обоссут и засмеют. Если так и будет, вставай и уходи.
Это копия, сохраненная 1 февраля 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.