Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы: https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации https://dumpz.org/ - можно постить листинги, не требует регистрации https://pastebin.com/ - для листингов, регистрация не обязательна https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться
Вопросы-ответы: — А стоит ли читать Лутца, том номер N? Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.
— Стоит ли читать %книга_нейм%, если там питон версии 2.х? Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х
— А что ещё можно читать? Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html
— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом? Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4
— А как учить джангу? Нахожу только книги по джанге 1.х У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.
— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
— Как можно без лишней возни ускорить программу на питоне 1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь. 2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником. Исходник: https://dumpz.org/bASGKD8cCFDf
Смотрите, есть у меня какой-то объект, который нужен в нескольких функциях, там, реквестс или подключение дб. Очевидно, можно в глобальном скоупе их создать и пользоваться, но ровные пасаны делают if __main__ main() и не засирают его. Остается или завернуть в ооп или пробрасывать его в все функции через параметры, что несколько тупо. Может ещё какой-то способ годный есть?
>>2124471 Это адски грязный код, слёту вообще не скажу, сработает ли, но в любом случае грязный.
Использовать глобальные переменные и синглтоны это дурной тон, антипаттерн, надо иметь обоснование, чтобы вот его использовать. Хотя этим пользуются. Слёту модули logging и asyncio вот на этом завязаны.
Но лучше всё-таки параметры передавать явно.
Набор переменных и данных, от которых зависит работа твоих функций, называется контекст.
В питоне даже начиная с версии 3.7 появился модуль contextvars для поддержки контекстов, хотя он больше нужен для того, чтобы разные задачи можно было исполнять в разных контекстах.
Никогда не используй просто глобальные переменные. Если ты всё-таки по смыслу хочешь иметь глобальные переменные, делай через синглтоны.
То есть если своё решение пилить, то ты делаешь функцию условно get_context(), которая возвращает тебе словарь с переменными, нужными для работы. Лучше сразу делать get_context(name), чтобы именованный контекст был и можно было несколько разных глобальных словарей использовать.
А функция get_context уже работает с глобальным словарём.
Так ты создаёшь прослойку, которая тебе добавляет гибкости, позволяет контролировать поведение, решает часть проблем глобальных переменных. Но всё равно это антипаттерн.
>>2124501 Тут один или два анона с похожими вопросами? Или больше?
Паттерн if __name__ == '__main__': нужен для другого, чтобы можно было как запускать код, так и импортировать оттуда что-то без исполнения кода модуля.
Глобальные переменные зло.
Чтобы рекомендовать решения, надо на задачу глянуть.
>>2125142 Это не декоратор, а контекст менеджер. И вопрос не о том, нужно использовать тот самый объект в разных функциях, не делая его глобальным. Ну нормально же описано.
Есть таблица mysql, которую читаю в пандас, где в полях записаны json строки типо пикрил. Надо extract'ить некоторые поля наружу. Сделал сейчас через df.apply(lambda row: foo(row), axis=1), где в функции через json.loads и проверок, что нужные поля есть, возвращаю данные для новых столбцов. Есть ли какое-то решение получше?
В прошлом треде не ответили, спрошу здесь. Есть парсер, который должен запускаться 3 раза в день. Сам парсинг может происходить несколько часов. Как это лучше запускать несколько раз в день - запускать скрипт кроном или как-то внутри скрипта засыпать на 8 часов между загрузкой страниц? Хотелось бы сделать все в коде, то есть чтобы скрипт был запущен постоянно, но пока не понятно как именно.
>>2125131 Десятка хорошая и удобная система, с кучей доработок, ssh в комплекте, возможностью линукс-докер запускать, если у тебя не home, и др.
Насчёт зондов всё зумерские байки. Точнее зонды и всякий сбор информации всегда был, в XP уже был, смешно слушать про то, что семёрка такая чистая, а десятка вся нашпигованая. Не создавай просто учётную запись от майкрософта, хоть винда очень-очень просит, это не обязательно, отключи всю телеметрию, и будет у тебя зондов не больше, чем у семёрки.
На самом деле гугол о тебе собирает намного больше информации.
>>2125525 Я в основном сижу на линуксе, но есть компы с виндой.
Линукс не для всех задач годится.
Всё, что связано с обработкой медиа контента, там плохо - фото, видео, звук. Софт только под винду или мак, и даже wine не всегда спасает.
Энтерпрайз софт может быть завязан на винду очень сильно, и хрен там без танцев с бубнами поднимешь под wine. Портов на линукс, естественно, в принципе нет.
Аноны, вот для миграций в при использовании Алхимии есть Алембик, при использовании ДжангоОРМ есть своя система миграций. А есть ли система миграций для обычных ЖСОН схем? К примеру храню я данные в файлике, в виде ЖСОНа, потом решил обновить схему(добавить\удалить поля, сменить тип хранящихся данных и т.п.), как мне накатить обновления на эту схему(конечно, можно каждый раз писать мигратор под конкретную схему, но это не универсально)? Задача относительно не сложная, думаю, что кем-то решенная, но готовых либ найти не удалось. Возможно, мудрый анон подскажет?
Как понять что ты делаешь шаги вперед, а не стоишь на месте?
Я учу питон уже пол года, вот мой гитхаб -https://github.com/leirons, если кому-то не трудно за пару соток чекнуть мои проекты, дать какую-то полезную инфу, то скиньте свой тг, я вам отпишу.
Проблема в том что я вроде делаю онли легкие проекты, из пет проектов это бот для изучения английского, я там обосрался с глобалами, нужно исправлять и форум как этот, почти доделал, вроде. И я смотрю на тех кто занимается этим ну от года до трех и они прям ебашат, когда я пишу одну легкую дефолт хуйню и я вроде что-то знаю, но это что-то настолько мало по сравнению с другими людьми, хотя у меня все свободное время уходит только на программирование,инглиш,математику, но почему я не чувствую никакого развития, а только шаги на месте, это настараживает.
>>2126178 Заканчивай форум и иди на собес. Только доделай его чтобы прям без багов и чтобы работали ровно те фичи, которые хотел реализовать изначально (а то пилить можно бесконечно).
Комментирование коммитов конечно у тебя...
"Ну и параша получилась" "Попытка в html и css №2" "some changes" "Пуш"
Я не говорю даже про культуру и русский язык (лучше уже сейчас пиши все на инглише). Вот забудешь ты про этот проект на год или два, а потом захочешь вернуться к нему. Эти коммиты и их оформление тебе никак не поможет (разве что по ассоциативной памяти).
Ну и собственно в readme тоже лучше распиши побольше. Что, как, откуда, куда, какой стек технологий.
"Много чего изменил, добавил Celery, лень крч писать" - чел, ты травишь? Пиши на английском и описывай все изменения. Хотя бы кратко. Тебе мозгов хватило написать форум, залить его на Гитхаб, а комменты как у дотера.
>>2126178 Привет от Селери Версии хуйово указал Попытка в докстрингу?
Репы\проекты выглядят уныло. Почисти свой акк от говна. Открой для себя прекрасный мир isort, black, autoflake. Текст комитов выглядит очень плохо. Тексты коментов не обнаружены. > os.chdir(f'C:/Users/Chokeup/PycharmProjects\pythonProject2/EnglishLearningHelper Не торт. Структура проектов отсутствует. Работы с нормальной БД не увидел(невнимательно смотрел может), только СКЛайт.
Если бы такой товарищ пришел на собес, с такими репами, наверное, взял бы на начинающего ждуна(или совсем не взял).
>>2124447 Так в чем вопрос то? Делаешь функции нужные тебе, создаешь отдельно файлики\классы в которых описываешь реквестс\коннект к БД, затем импортируешь нужную тебе логику из этих файликов\классов в твои функции и юзаешь
>>2126417 Как в шелле делаешь, так же и определяй. Для venv-a я бы запустил pip -V и сравнил с собственной папкой, и со стандартным системным. Если выдаёт системное, то ошибка, если какой-то другой рандомный венв, то предупреждение. Как проверить конду, я не знаю, к сожалению.
>>2124389 (OP) Тут есть те кто tkinter знает хорошо? Короче есть два поля, в одном надо чтоб после ввода при нажатии кнопки, введенное передавалось сразу в другое поле.
Спасибо обоим, да согласен, абсолютные пути это шлак, да и насчет комментариев и оформления тоже согласен, но это пипец как задолбует описывать каждый коммит.
>>2126582 Можно сразу синхронизировать содержимое нескольких экземпляров Entry через общее значение textvariable (entry1, entry2 в примере ниже). Если надо обновить содержимое по нажатию кнопки, то через Entry.delete/Entry.insert (button_ok + entry3 там же).
>>2126697 Тестов нет, пустые файлы, переменные окружения и файлы бд прям в коде, привыкай писать английские комментарии и убрать лексикон из коммитов и коротко описывать сделанное, структуры проекта вообще нет. >from .models import * За такое по рукам бить надо >return HttpResponse("Соси хуй забаненый пидорас") Мы вам перезвоним >C:/Users/Chokeup/PycharmProjects/pythonProject39/Forum/board/info.log Мы вам перезвоним[2] Научись использовать .gitignore Очевидные комментарии удали, старайся писать так, чтоб они вообще не нужны были Воспользуйся форматтером кода. У тебя пиздец какой-то
Тебе над стилистикой сильно поработать надо. В код особо не вникал, там склонить надо и запустить, а у тебя прям жесткая привязка
>>2126239 Реквест\конект создавай заранее, потом просто бери инстанс который содержит в себе конект и юзай. Если хочешь что-то сделать, посмотри как делают другие - как реализован конект к чему либо в aiohtt(server), flask.
>>2124389 (OP) Аноны, помогите. Опрашиваю в своей программе dns А как сделать определенный exit code при ошибке, которая не попадает в exception, т.е. что-то непредвиденное? Ну при exception легко поставить sys.exit(4) А вот когда событие в exception не попадает, отрабатывает дефолтный код возврата для интерпретатора python, когда выполнение кода завершается ошибкой (по дефолту = 1)
Вот представь, что я думаю о том, чтобы с тобой работать, и хочу глянуть, как ты пишешь.
Я захожу на гитхаб, и сразу вижу все эти "пуш", "лень писать". Я заглядываю в код, и вижу "соси хуй пидорас". Всё, я после этого в принципе не хочу ничего общего иметь.
С глобальными путями всё хуже, ты привязываешься к путям в Windows, хотя стандарт индустрии это линукс, и при этом путь завязан на каталог пользователя. Вот это совсем-совсем плохо.
Если ты завязываешься на глобальные пути вида /opt/my_app/data это ещё более-менее, ты закладываешься, что в контейнерах запускаешь, что можешь там нужную структуру создать. Но пользователь в винде это уже совсем не то.
Зачем у тебя вкомиччены лог-файлы? При этом есть другие файлы с комментарием "some changes", которые пустые?
Русские комментарии, помимо того, что принято пытаться в английский, тоже ни разу не понятны. Что такое "объект обсуждения"? Я понимаю, когда делают русские комментарии потому, что не хватает хорошего английского для лаконичного и точного описания. Но тут вообще хуже, чем без описания.
Как отправить документ через telethon с именем вместо 'document'? Через сохранение/загрузку файла всё работает, а если: virtual_workbook = BytesIO() virtual_workbook.name = 'test.xlsx' wb.save(virtual_workbook) bot.send_document(user_id, virtual_workbook.getvalue()) Нет.
Захотел сделать на питоне собственную систему анализа рабочей активности. Типа таймтрекер, но полностью под моим контролем без облаков. Для начала, хочу просто записывать какое окно приложения активно, вводятся ли туда данные, вожу ли я по нему мышкой.
С чего начать? есть ли полный опенсорц?
Полнота и удобство интерфейс вторичны. Мне бы просто собрать.
>>2126770 Ты показал простой кусок кода на 20 строк, а я говорю про проекты, в которых коментарий - редкое явление. Я то переписывать не буду, т.к. пишу коментарии и документацию, по ним можно понять что и как работает, быстро и просто. Поэтому и топлю за них.
>>2126957 Так плохо заведомо, тебе надо или создавать соединение явно и сохранять в переменную внутри модуля, или реализовывать синглтон, когда соединение создаётся при первом вызове фунции вроде get_connection()
Неявное создание соединения просто при импорте модуля ОЧЕНЬ плохой стиль. Так никогда не делают.
>>2127011 >>2126957 Но вообще, держать глобальное соединение в принципе плохо. Скорее принято делать через контекстные менеджены, вроде with make_connection() as conn: ____здесь ты делаешь, что надо, вызываешь функции нужные и др. ____ты даже можешь глобально хранить conn, хотя это плохо.
глобальные переменные это зло, для таких вещей, как соединения, это абсолютное зло.
Ты, как разработчик, должен предусматривать ситуации, когда соединение обрывается. В контекстном менеджере это очень легко грамотно обработать. В случае глобальных переменных намного хуже.
>>2127019 > Ты, как разработчик, должен предусматривать ситуации, когда соединение обрывается Либы умеют в реконект. > держать глобальное соединение в принципе плохо И при каждом запросе к серверу\скрипту заново конектиться к БД?
Такой подход прокатит если скрипт запускается раз в пару минут, а если это что-то должно быстро конектиться и отвечать\записывать данные - не подойдет подход с контекстным менеджером и новым конектом.
>>2127019 >Ряяя зло яскозал >Ты делаешь то что я скажу, а если ты сделаешь вот так я тебя выебу в сраку и отпизжу хуем в рот. Ты из какой канавы попал вайти? Можешь нейтрально излагать, заебал уже , доминатор мамкин.
Большим наставником себя мнишь или что? Это просто блять код. Он тупой и простой, в айти все просто, нахуй ты усложняешь? Просто напиши как есть без своего очень важного экспертного мнения хорошо это или "совсем-совсем плохо".
>>2127228 >. Он тупой и простой, в айти все просто, нахуй ты усложняешь? Использовать глобальные переменные это тоже самое, что отобрать игрушку у ребёнка. Вроде бы просто, но нехорошо. И пройдёт время, и тебе это припомнят.
А есть такое для змейки? Мне прост лень читать толстые книжки или тыкать кучу ссылок в офф доке. Я уже давно прогаю на других языках, просто быстренько ознакомится что тут в питоне и как и поехать
>>2127798 Хотел бы сделать подобное и потестить на предмет трафика. А видосы где хранить? Опыта мало. Покупать готовое - жаба давит, на вордпрессе. Могу вот на питоне запилить для себя чисто на тест. Потом можно как-то развернуть будет. Я так понимаю тут все просто. Вебморда и плеер, так? Я только не знаю как заливать-транслировать видосы, фильмы.
>>2127825 > А видосы где хранить? Опыта мало > Покупать готовое - жаба давит То есть ты и сделать не можешь и купить не можешь. Может тогда другим чем займись? + дело это не выгодное, за трафик будешь платить хулиард, с фильмов получать - нихуя.
>>2127830 Ну это будет типо пет проекта все же. Ну и вдруг что-то получится. Сам джанго прост как палка. А вот с видосами - хз. Слышал что-то про видеобалансеры. Но вообще такое пилят на вордпрессе. Насчет платного трафа, ну есть доры как варик. Попробу протолкнуть. Но тут главное сделать конеш.
>>2127833 Что ты за этот ворпдресс вцепился? Он тут вообще никаким боком. Может там есть какие-то готвоые плагины для этого, но там для любой хуйни плагины есть.
>>2127833 >Сам джанго прост как палка. Однако вопросы странные задаёшь. Значит с этой палкой не разобрался.
И вообще классика, хочу сделать крутую фенечку, хелп, ничего не умею, не знаю и денег нет.
ps: полноценный кинотеатр это сложная штука. В простом варианте для себя ты можешь тупо вставлять обычные видео, корректно закодированные, в тег <video>. И будет работать.
>>2128705 Хз, проверю. Так то жалко будет если все бабки утекут индусу. Жаль что банан не предоставляет обверток сам, как коинмаркет или же гекокоин, чтобы юзать апи на петухоне.
Как заматчить вот такое? ><Element br at 0x185b162da80> ><Element br at 0x185b162dac0> Вот так не получается d[y] = re.sub(r'<Element br .+\n<Element br .+\n', r'\n', d[y])
>>2128915 Ничего не понятно, что у тебя за условине, зачем \n >>> ss = "<Element br at 0x185b162da80>" >>> res = re.match(r"^<Element br at (?P<addr>0x[0-9a-f]+)>$", ss) >>> res.group('addr') '0x185b162da80'
Привет, а как у вас в пайтоне принято работать с базами данных? Наверняка же есть какая-то популярная ORM, чтобы можно было к классу добавить аннотации полей и просто сохранить его потом.
Науглил SQLAlchemy, она норм? Или есть что-то лучше?
>>2126184 > Заканчивай форум и иди на собес Реклама скиллбоксов 10 лет из каждой щели, итоги. Вот после таких охуительных советов потом люди не могут понять почему они в айти вкатиться не могут. > Только доделай его чтобы прям без багов и чтобы работали ровно те фичи, которые хотел реализовать изначально Ну то есть через годик где-то? >>2126178 Заходишь на мдн, ищешь там гайд по джанге. Делаешь тоже самое, но не сайт библиотеки, а там магазин питсы или там тот же форум. Потом гуглишь мега гайд по фласку на хабре, опять таки делаешь не прям как в гайде, а что-то околосвое, чтобы такое же, но чуть-чуть другое. Проходишь все этапы вплоть до развертывания под докер. Дальше придумываешь еще один свой проект, делаешь полностью сам. Как осилишь -- вот тогда можешь идти на собес. В айти, в отличии от других сфер, чтобы вкатиться ждуном нужно не быть лучше всех остальных соискателей, а быть на достаточном для ждуна уровне. И пока ты этого уровня не достиг, то можешь хоть 20 раз на собесы сходить, хоть 30, но тебя не возьмут(офк есть шанс около 1%, что у челов сдадут нервы и они возьмут кого смогут, но удачи на такое рассчитывать).
Сидел проектировал на своей джанге, как вдруг пишет приятель, мол нужен скрипт там один на питончике. Ну ок, все бы ничего, но ему надо на винду и еще желательно с ОКОШЕЧКОМ ПРИЛОЖЕНИЯ, запускать что-то из терминала он не в состоянии, будет меня доебывать лишний раз.
Все бы ничего, но я не пользуюсь виндой вообще.
Сама логика скрипта реализована. Формат выхода данных сейчас просто в консоль, сделал мвп так сказать, нужно эту хуйню посадить на GUI и как-то запаковать в exe файл, чтобы приятель нажал 1 кнопочку и все.
Как мне это сделать безболезненно для меня? Ставить виндоус не хочу
>>2129330 Заюзай ткинтер искаробочный, а он пусть поставит себе бидон с бидон.орг, уж должно хватить мозгов. Без шинды вряд ли получится сделать шиндовый бандл.
>>2129338 бидон то он поставил, но ему подавай окошечко с кнопочкой в exe
>>2129338 Там скрипт обновляется каждые 5 минут, вряд ли подойдет. Я думал насчет онлайн компиляторов , чтоб он туда код вставил и все. Но мб есть какой-то упаковщик, вот мол тебе виртуальное окружение, вот .py файлы , запакуй это и все ?
>>2129340 PyInstaller не работает нормально с линукса на винду.
>>2124389 (OP) Всем привет Мне внезапно стало нужно общаться со сторонним api (рассылка смс через мтс) Есть книжка от МТС с примерами запросов в xml с описанием разных функций.
А как можно собрать минимальный питоновский скрипт для подключения апи (там токен), отправки запроса и получения ответа (хочу писать ответы в лог)? Питон практически не держал в руках. Я думаю, для restapi должен быть какой-то универсальный скриптец, где все предусмотрено?
>>2129348 Ну да, его внутри винды внезапно собирать надо. Ну у тебя видимо по религиозным причинам харам на установку винды, так что проси друга поставить докер для винды и скидывай ему упакованное приложение >>2129364 requests+logging
>>2129369 >requests+logging Я вроде не спрашивал названия либ (или что это блять, модули? похуй вообще). Мне нужен пример скрипта, где уже все есть для отправки запроса и получения ответа.
>>2126178 Сразу скажу, что я не вникал глубоко в твой код, а лишь пробежал по поверхностям. Смотрел только в репу с ботом для телеги.
1) Самое главное - где твой .gitignore? У тебя весь проект, судя по коммитам, был засран всяким ненужным шлаком. Найди в инете или напиши сам список файлов, которые гит будет игнорить. А вообще при создании репы гитхаб тебе сам предлагает гитигнор добавить. Галочку тыкнуть не забудь просто. 2) Настрой git config нормально. Иначе у тебя в коммитах то один пользователь, то другой. 3) is_user_created у тебя делает не то, что подразумевается. Он не только проверяет, есть ли пользователь, но и создаёт его зачем-то, если его нет. Причём, как я понимаю, функция неправильно у тебя работает. 4) Удали весь закомментированный код. Если тебе когда-то он понадобится, достанешь его из гита. 5) Весь хардкод тоже убери из репы. И айдишник своего акка в телеге тоже. 6) Базу данных тоже в репозитории не хранят. Удали её. (Вот тут тебе бы gitignore пригодился) 7) За глобалы знаешь чо пацаны со двора с твоими руками сделают? Особенно за res, res1, res2. Это вообще пиздец. 8) Лови нужный тебе эксепшн, а не всё, что падает. 9) Я правильно понял, что у тебя все "изученные" слова хранятся в оперативке? И, скажем, если ты перезапустишь бота, то всё к хуям упадёт? Хуёвое решение, скажем так. 10) Дебажные принты тоже удаляй после дебага
Всё, что перечислили аноны выше, тоже сюда относится, так что повторяться не буду.
>>2129376 > Я вроде не спрашивал названия либ Ох нихуя себе, у нас тут Мистер Крутой > Мне нужен пример скрипта А никто за тебя тестовое на ждуна делать не будет
>>2129402 Я не понимаю, почему ты и другие аноны так к коммитам прицепились? Это проблема, да, но она не решаема, когда у парня эндпоинт называется ThemeSerializerv и при этом он обращается к ThemeSerializer. У чела нету понимания что он вообще делает и зачем, соответственно, когда он что-то меняет, то он не понимает что поменялось и почему. И пока чел не поймет что он вообще мать его делает, то и написать что-либо в коммите он не сможет.
>>2129422 > А ты у нас Мистер Тупой, раз отвечаешь не на тот вопрос, который задавался? Если бы ты хоть немного себе представлял что такое токен и запрос к апи, то понял бы, что это и есть "универсальный скриптец" > Тут большинство вопросов примерно такого же уровня, так что за весь тред не говори Да, но остальные вкатуны не строят из себя супер профессионалов кода и не пишут дерзкие выпуки
>>2129414 Да я не то, чтобы именно конкретно за коммиты цеплялся. Просто указал на то, что заметил за 5-10 минут пролистывания файлов и репозитория в целом. А "лицо репозитория" - это коммиты. Ну а в том, что в коде пиздец творится - это да. Я просто не знаю, какой ему тут совет дать, кроме "Пиши нормально".
>>2129427 >Если бы ты хоть немного себе представлял что такое токен и запрос к апи, то понял бы, что это и есть "универсальный скриптец" Я представляю, т.к. видел реализацию на пошике. Это не отменяет того, что проще найти эти готовые 6-7 строк, чем рожать самому.
>Да, но остальные вкатуны не строят из себя супер профессионалов кода Это твои фантазии, я ни разу не сказал, что я супер профессионал кода. Более того, я сказал, что питон практически в руках не держал. Если в чем-то не уверен - перечитай.
>>2129431 > Я представляю, т.к. видел реализацию на пошике Я не ебу что такое "пошик", но в любом случае ты не имеешь об этом никакого представления. Я просто намекну, что у токенов есть десятки стандартов и сотни велосипедных, а http методов основных только семь штук. И это не беря в расчет рест vs рестлесс шизов, которые тебе будут то 200 на ошибку возвращать, то 400. > Это не отменяет того, что проще найти эти готовые 6-7 строк, чем рожать самому Ну так иди читай доку, что ты блять собрался рожать, полоумный? Тебе надо только документацию транслировать в переменные, которые ты либе скармливать будешь.
>>2129455 > Ты предлагаешь путь фуллстека Нет > надо до приличного уровня освоить все скиллы, очень разнообразные Это какие? Сетку на бутстрапе накидать со стандартной темой? Ничего, лишним не будет, тем более, что займет от силы неделю по 1-2 часа в день. Зато будет не абстрактные json'ы перекидывать, а с вполне конкретной целью. > При этом так ты хрен к некоторым технологиям притронешься Это к каким? Ты можешь конкретнее? Что это за "ты освоишь все скиллы, но некоторые не освоишь"? > на небольших проектах они не нужны Я сам вкатывался буквально так же и в проекте для автоматизации предприятия на 50к+ рыл с командой в 10 человек я ничего кардинально нового, кроме специализированных либ, которые вообще нет смысла ждуну изучатькафка, прометеус, сентри, етц не встретил
Котаны, тред не читал, нужен совет по алгоритмам. Нужно нагенерить NFT картинок с имеющимися вероятностями получения определенного количества предметов на картинке. Есть список словарей для обозначения предметов, которые могут попасться у картинки. В словарях - ключ-название предмета и вероятность получения, например 0.5, у каждого ключа уникальная. И есть другой словарь, в котором хранится значение для вероятности получения определенного количества атрибутов у генерируемого предмета- например 0 предметов- вероятность 25%, 1 предмет -50, 2 предмета -25. В конце должен получить ограниченную выборку, которая подходит по вероятности как для распределения по количетсву предметов, например 10.000 штук. Сейчас я делаю полный список всех возможных комбинаций предметов, потом умножаю единицу (1.0), присвоенную каждой сгененрированной комбиницаии на все вероятности- отдельных предметов из списка словарей + еще умножаю на вероятность для определенного количества предметов. Тогда получаю правильный список вероятностей и выборки и из нее дергаю по нужному количеству предметы, и вроде бы всё хорошо. Но, когда количество общихвариантов начинает зашкаливать за 4кк это уже занимает по часу для генерации словаря возможных комбинаций. Вопрос знатокам- можно ли как-то выбрать случайным образом список подоходящий по двум спискам вероятностей не генерируя полный список комбинаций + чтобы он соответсовал заданным вероятностям? Или сократить время. Сейчас с мультипоточностью я еще не знаком, может пора? Ну и да, с алгоритмами тоже не очень, как видите. Пинайте сильно, решение нужно.
>>2129447 >но в любом случае ты не имеешь об этом никакого представления И? Ты к чему так высираешься? Я и не говорил, что имею.
>Ну так иди читай доку, что ты блять собрался рожать, полоумный? Тебе надо только документацию транслировать в переменные, которые ты либе скармливать будешь. Шел пятый пост, но ты продолжаешь строчить нерелевантную и несуразную хуйню, споря с соломенным чучелом.
Вопросы по функции next (да и наверное по всем итераторам). Есть строка кода типа object = next(object for object in objects_list if object.name == 'vlad'). Я понимаю что эта функция делает, возвращает object из листа object у которого поле name равно 'vlad'. Но как это читать? Почему мы пишем object for object in objects_list. Зачем нам использовать конструкцию x for x? Второй object говорит о том, как мы обращаемся к каждому конкретному элементу на итерации, а первый object?
>>2129551 result = [x for x in range(10)] это то же самое что result = [] for x in range(10): __result.append(x) Т.е. слева результат. В твоем случае это ленивое генераторное выражение, поэтому нужен next, чтобы заставлять его собственно генерировать.
>>2129522 многопоточность или оптимизации подобного рода тебе не нужны.
Не очень понятна твоя задача. Во-первых, часть алгоритмов реализовано в модуле random, там можно делать выборку по весам, например.
Но главное комбинации. Вот у тебя есть список словарей предметов. Допустим три словаря, в одном 10 предметов, в другом 100, в третьем 1000.
У тебя может быть ситуация, что из одного словаря будет выбрано два предмета? Вероятность, что в выборке будет предмет из первого словаря равна вероятности того, что в выборке будет предмет из третьего словаря, или же в 100 раз ниже?
Вообще тебе надо в несколько этапов делать, чтобы избежать комбинаторного взрыва. Первое, ты определяешь, предметы из каких словарей будут в выборке, с поправкой по весам, для этого есть готовые решения в модуле random. Вторым этапом ты определяешь сами предметы в конкретных выборках, и третье, ты добавляешь атрибуты для этих предметов. Всё вместе будет работать за доли миллисекунды.
Для 10к предметов ну может быть несколько секунд, если не автоматизировать. Но думаю, что скорее тоже доли секунды.
Всем привет, скажите зачем нужно тестировать ORM? Популярный питонист на ютубе делает вот такие тесты. Неужели данные могут где-то поломаться, просто от создания?
>>2129628 Могу предположить только, что проверка свойств, обязательное поле, валидное и т.д. А вообще это не имеет смысла, если у тебя не йоба класс со множеством внешних зависимостей.
Вопрос по argparse. Я пишу утилитку в которой хочу реализовать два разных интерфейса: "нубский" с ответами на наводящие вопросы если не передавать аргументы и "быстрый" с передачей аргументов при запуске. Собственно как мне сделать так, чтобы обязательные аргументы требовало ТОЛЬКО если был передан хоть один аргумент.
Господа, как через питон создать большую и относитнльно сложную таблицу в elsx, работаю в openpyxl ну и в целом все получается, но как это сделать лучше, а то всю таблицу хардкорить в питон со всеми стилями это ппц
>>2129693 Gino то еще говнище, соглашусь. А чем peewee не нравится? Мне вспоминается только отсутствие нормального инструмента для миграций, по типу alembic.
>>2124389 (OP) Парни, есть 3 события которые представлены строками, допустим: "REDIRECT", "ERROR", "RETRY"
Когда встречается какое-то из событий то нужно выполнить определенную функцию (довольно обширную). Очевидно это стоило бы сделать через if-elif-elif но смотрится это так себе. Как реально крутые пацаны бы это намутили?
>>2129593 спасибо. Я вроде сделал через разбиение на два этапа- первый для всех фи что обязательно должны входить, второй- для фич которые необязательны. Потом просто склеил нужное количество, с поправками на вероятности во втором, но всё заработало. До этого там, как писал, перемножал оба множества друг на друга, получался этот взрыв несчетный. Там комбинаций было 4кк от 100 предметов а на деплое у клиента- 146кк, за день не посчитало, пришлось изобретать.
пишет \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Traceback (most recent call last): File "D:\Python\test.py", line 4, in <module> mgr = owm.weather_manager() AttributeError: 'OWM25' object has no attribute 'weather_manager' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
>>2129818 >А чем peewee не нравится У меня он постоянно пытался создать хулиард конектов к БД(в то прекрасное время я не юзал ПгБаунсер для пет проектов) и они быстро заканчивались.
Объясните пожалуйста чем кардинально отличаются джанго, фласк и построенные на джанго cms? Например, на фласке и фастапи лучше сделан роутинг, удобней, по видосам разработка идет быстрее. Онлайн шоп можно сваять на фласке за час.
>>2130135 > Объясните пожалуйста чем кардинально отличаются джанго, фласк и построенные на джанго cms? cms это cms, джанго и фласк почти ничем не отличаются. Просто джанго это такой комбайн, который все везет с собой, а фласк позволяет выбирать что конкретно тебе нужно. Так что джанго стабильнее и удобнее, а фласк более легковесный. > Например, на фласке и фастапи лучше сделан роутинг Эмм, чего? > Онлайн шоп можно сваять на фласке за час Ну если весь онлайн шоп это просто вывалить на пользователя описания из бд, то да. По времени на джангеи фласке одинаково займет
Сап. Есть задача: Вы создаете игру! Игрок пытается выстрелить в объект и может попасть (hit) или промахнуться (miss) .
В начале, игрок имеет 100 очков, попадание прибавляет 10 очков к результату игрока, а промах отнимает 20 очков.
Ваша программа должна принять результат 4 действий в качестве входных данных ("hit" or "miss"), затем рассчитать и вывести оставшиеся очки игрока.
Пример Входных Данных hit hit miss hit
Пример Выходных Данных 110
Объяснение: 3 попадания (hit) добавляют 30 очков, один промах (miss) отнимает 20, в результате чего общее количество очков составит 110. Используйте цикл while, чтобы принимать входные данные во время каждой итерации и рассчитывать результат.
#эта программа не засчитывает первые входные данные, с следующие засчитывает x=100 c=1 a=input() while c<4: if a=="hit": x+=10 elif a=="miss": x=x-20 a=input() c +=1 print(x)
Добрый день, у меня нетбук 2010 года с атомом 330 и 2 гб оперативы, пайчарм грузится по 5 минут, есть ли возможность поставить что-то менее серьезное и легковесное под виндоус 7 или дебиан бейзд системы, что бы оно показывало промпты вызова функций из модулей как пайчарм? Сублайм 3 не хочет этого делать для меня.
>>2130342 А то что собрался там заводить? Можешь попробовать в онлайн IDE работать, 2 гига все равно маловато будет, так как для подсказок нужно анализировать твой код
>>2130353 выбора нет. Вижуал код меньше жрет оперативки - это правда, но все еще долго обрабатывает запросы к консоли, хотя если судить по ютубу все серьезные джанго дяди пользуются либо им либо блокнотиком. Железо в целом еще рабочее для мелких задач, как я уже говорил сублайм (технически хоть и не иде), в целом работает нормально к сожалению я пока не на таком уровне, что бы помнить все наизусть. Спасибо за предложение.
>>2130359 про 2 гига это верно, заводить собрался сначала что-то на фласке и джанго, все для обучения, так что держать должно. но для дженерал пурпоуз тестов итд действительно колаб подходит как вот этот гражданин написал >>2130345
>>2130379 Для обучения лучше с базовым синтаксисом разберись в совершенстве. Джанго с фласком успеется разобрать, там все просто, но вот если что-то в духе x = [i2 for i in range(10)] или там for i in range(10): yield i с написанием собственных декораторов будет смущать, то это уже конечная и придется все равно идти учить базовый синтаксис
>>2130342 >у меня нетбук 2010 года Чувак, а как, по-твоему, в 2010 году работали? А в 2000?
ВС код нормально более-менее должен работать. Можно работать вообще в виме.
>>2130366 >сожалению я пока не на таком уровне, что бы помнить все наизусть Ты НИКОГДА не будешь на хорошем уровне, если будешь полагаться на IDE. Ты приучаешься к тому, чтобы не помнить и понимать, а смотреть подсказки.
Для новичков вообще IDE это зло страшное. Пиши в самом обычном редакторе с подсветкой синтаксиса и поддержкой базового форматирования, параметры функций смотри в документации.
>>2130412 Это называется лист компрехеншн. Используется чуть более, чем повсеместно. Ускоряет нехило так создание списка. Генераторы в самом простом случае уберегут от создания лишних глобальных переменных и опять же ускорят код. Без декораторов вообще охереешь с тем же фласком и джангой работать, те же мидлвари, на которых вполне может держаться 90% всех метрик и вся авторизация, по сути те же декораторы. Вот с этим всем и нужно работать. >>2130430 > Ты НИКОГДА не будешь на хорошем уровне, если будешь полагаться на IDE Ты скозал? > Ты приучаешься к тому, чтобы не помнить и понимать, а смотреть подсказки Что дадут выученные наизусть методы какого-нибудь класса из либы Васяна? Да даже из той же джанги? > Для новичков вообще IDE это зло страшное Все верно, только не из-за подсказок, которые как раз таки очень полезны. А потому что тот же пукчарм ебаный комбайн, в котором разобраться нормально та еще задача и для новичка абсолютно ненужная к тому же.
>>2130434 >Что дадут выученные наизусть методы какого-нибудь класса из либы Васяна? Да даже из той же джанги? Ты просто открываешь документацию и смотрешь, что делает эта функция. Заодно какие-то детали, про аналоги и много чего ещё.
>>2130434 Спасибо за подробное объяснение. С декораторами/враперами у меня проблем не возникает. Тогда останусь на виндоус 7 + сублайм3. Жаль конечно, хотелось бы хотя бы туду лист как в пайчарме.
>>2130452 Товарищ, или оставайся на своём железе и учить аскетичной технике, вообще без IDE можно, или поищи себе на авито комп за 10-15 тысяч, но уже относительно приличный, на i3-i7, относительно старый, и чтобы 8 гб поставить. Лучше при этом линукс.
Для освоения базы питона железо не нужно. Но вот сопутствующего очень даже нужно, особенно под виндой.
>>2130457 Домашний пк у меня не вызывает таких проблем, мне нужно таскать с собой на работу ноут и учится в перерывах. К сожалению, все портативные машины в ценовом сегменте 10-15 тысяч либо с пассивным охлаждением и выдают почти такие же результаты, либо в таком раздербаненом состоянии, что лучше даже не смотреть в их сторону. Так что там сразу ценник вырастает как минимум до 20ки и то не факт. У меня был изначально такой план, но оказалось, что в голове у меня до санкционные цены. Что касается линукса, я пробовал кучу разных дистрибутивов, которые заявляют, что они легковесные итд, всякие лубунты, зорины итд, все сразу вгоняют проц этого ноута в 70 градусов и чуть ли не заставляют его скрипеть когда начинаешь делать хоть что-то серьезнее открытия терминала. Собственно поэтому я и вернулся к win7, у него производительность и нагрузка оказалась гораздо ниже(проц выходит за пределы 50с только если буквально заблокировать радиатор). Если у тебя есть какие-то конкретные рекомендации, я буду очень признателен.
>>2130481 Я не знаю, почему ты такой несчастный, но я себе как-то брал ноут на авито на уровне 6тр., 11.5 дюймов, с целероном, а не атомом, 4гб, куда я ставил убунту и она могла работать по 5+ часов от батареи.
Хочешь придумывать оправдания и искать головную боль - придумывай. Твоё дело.
>>2130481 >>2130490 Иначе, от чего меня подрывает. Ты пишешь, что купил рухлять, которая и в 2010 была low-end, который не стоило покупать, добавлять память не хочешь, держишь на нём современную жручую винду, и спрашиваешь, как туда поставить современную излишне прожорливую IDE?
И куда тебя посылать после этого? Или что рекомендовать тебе выпить? Или как использовать стену? Ну ты понял.
Возможностей купить более адекватный комп масса.
Если у тебя плохое железо, это не беда, потому что 20 лет назад железо было совсем-совсем другим, о 2 гб и мечтать нельзя было, люди учились программировать очень даже. Просто тебе надо учиться, а не ставить последнюю IDE, надеясь, что она вместо тебя думать будет, и ты от неё думать научишься.
Поставь себе линукс, запускай консоль, вим, и там хоть на 512Мб можно работать. А уж на 1гб вообще зашибись.
>>2130448 > Ты просто открываешь документацию и смотрешь, что делает эта функция Это придется делать в любом случае лол. Как это вообще блять связано с подсказками? Сюда же тайпхинты, которые значительно помогают с разработкой, особенно новичкам, у которых половина ошибок это попытки взять ключ у списка или обратиться к методу get_user_id у строки. > Заодно какие-то детали, про аналоги и много чего ещё Еще раз -- как чтение документации связано с подсказками? Более того, я часто о каких-то аналогах функций/методов узнавал только из подсказок, так как название похожее
>>2130516 > особенно новичкам, у которых половина ошибок это попытки взять ключ у списка или обратиться к методу get_user_id у строки. Вот именно поэтому новичкам не нужно, чтобы были подсказки.
Потому что когда нет подсказок, ты тренируешь память и внимательность, учишься думать, что делает твой код. А с подсказками становишься как макака.
>>2130342 вим+костыли. если шинда то поудаляй все говно из автозагрузки, в свойства системы выставь максимальную производительность, но вообще конечно 2гб оперативки даже для 7ки мало.
>>2130516 >Еще раз -- как чтение документации связано с подсказками? Более того, я часто о каких-то аналогах функций/методов узнавал только из подсказок, так как название похожее Обычно в документации у тебя на одной странице много чего, не только про одну функцию-метод. Там более подробно, ты можешь листать вверх-вниз. Там ссылки, по которым можно ходить, как на другие примитивы, так и на аналогичные функции.
Если ты активно лазаешь в документацию по какому-то модулю или классу, но нормально отвлечься и всю страницу прочитать. С IDE такого желания не возникает.
>>2130529 > Вот именно поэтому новичкам не нужно, чтобы были подсказки. Чтобы программировать было как можно больнее? > Потому что когда нет подсказок, ты тренируешь память и внимательность, учишься думать, что делает твой код А знаешь что еще тренирует "память и внимательность"? Слежение за регистрами процессора. Все программирование это про упрощение и абстрагирование, ты же хочешь просто добавить работы и боли молодым, за которую они нихуя не получат. >>2130535 > Обычно в документации у тебя на одной странице много чего, не только про одну функцию-метод. Там более подробно, ты можешь листать вверх-вниз. Там ссылки, по которым можно ходить, как на другие примитивы, так и на аналогичные функции. > Обычно Ахахахахаха бля братан, я не хочу тебя расстраивать, но документация обычно выглядит как-то так(см пик 1, 2). И понять что такое TopicPartition можно только зайдя в исходники. А понять что за topic передавать нужно -- можно только на опыте. И это еще считается образцовой документацией в сравнении с тем, что есть. Вполне может быть так, что документация сделана в лучших традициях гугла, докера и прочих пидорасов. И по итогу твоей документацией станут ишью на гитхабе и стаковерфлоу.
>>2130582 Потому что ты принтишь пустой тюпл а не тот в который добавляешь фу. Дальше ты перезаписываешь а тюплом х в котором уже есть фу и поэтому он принтится. Ты рили танкист что ли? В 2х соснах запутался.
>>2130551 >ты же хочешь просто добавить работы и боли молодым, Я хочу, чтобы молодые чему-то научились. Или может не хочу, но для их блага надо чему-то научиться.
Если ты закладываешься на подсказки, на то, что всё можно найти в гугле или на стековерфлод, ты НИКОГДА не наработаешь приличный уровень. Вот такой, чтобы ты сам мог давать рекомендации на стеке, когда других ответов нет.
Самое идеальное обучение, когда ты с какой-то библиотекой, модулем или технологией разбираешься, это писать код с нуля. Вот ты разобрался с этим, понял, потом берёшь чистый файл и с нуля пишешь код, без подсказок, без заглядывания в доки. Думаешь над ним. Потом через какое-то время ты делаешь что-то подобное, не заглядывая в старые решения и документацию, если не сдашься.
Через несколько таких итераций ты будешь очень хорошо владеть предметом и легко писать код, без всяких IDE, и будешь понимать, что он делает.
>>2130613 >Это я про обучение, освоение новых технологий. Что-то методы из 60x Вот когда сам, без справочника будешь понимать и помнить все формулы сопромата..
>>2130616 Эти методы очень хорошо работают сейчас. В 60-е ты не мог не учиться, а сейчас можешь.
Это как решать интегралы. Тебе надо запомнить какие-нибудь 10 интегралов базовых, на основе них считать более сложные. Если же ты будешь в маткаде интегралы считать, сам ты их решать никогда не научишься.
>>2130600 > Помощь от IDE в этом случае будет более содержательной? ctrl+левый клик => смотришь исходники А вообще я не понимаю при чем здесь блять подсказки от IDE и документация? Пиздец, тайпхинты и синтаксический анализатор челу насрали в шаровары и запретили читать документацию. >>2130613 > Я хочу, чтобы молодые чему-то научились Как зазубривание методов очередной Васянской либы НАУЧИТ тебя чему-то? > Если ты закладываешься на подсказки, на то, что всё можно найти в гугле или на стековерфлод, ты НИКОГДА не наработаешь приличный уровень Кажется, я начинаю понимать твою проблему. Ты не знаешь зачем нужны подсказки, да? Они нужны не для того, чтобы по ним блять изучать что-то. Они нужны, чтобы передавать правильный тип данных и не охуевать от 8 часов поиска проблемы, когда совершенно левый сервис выплевывает 400 респонс что он ждал строку. а не число. Они нужны для того, чтобы не писать по 50 раз на дню get_user_name_by_id. > Самое идеальное обучение, когда ты с какой-то библиотекой, модулем или технологией разбираешься, это писать код с нуля > Вот ты разобрался с этим, понял, потом берёшь чистый файл и с нуля пишешь код, без подсказок, без заглядывания в доки. > Думаешь над ним. Потом через какое-то время ты делаешь что-то подобное, не заглядывая в старые решения и документацию, если не сдашься. Сочувствую твоему работодателю. У них разумист на программисте тратит оплачиваемое время на всякую хуйню вместо работы. Интересно, сколько десятков тысяч рублей в месяц ты выжираешь своими охуительными подходами к ознакомлению с новыми либами? К написанию нового проекта на новом стеке спустя год приступаешь? Или быстрее укладываешься?
>>2130633 Я тебе уже несколько раз сказал, что это нужно на этапе обучения, а не коммерческой разработки. Или может ты предлагаешь без обучения в серьёзную разработку лезть.
>>2130633 >Кажется, я начинаю понимать твою проблему. Ты не знаешь зачем нужны подсказки, да? Они нужны не для того, чтобы по ним блять изучать что-то. Они нужны, чтобы передавать правильный тип данных и не охуевать от 8 часов поиска проблемы, Попробуй почитать про mypy. Этот пакет отловит всё это и много больше. Не благодари.
>>2130633 > У них разумист на программисте тратит оплачиваемое время на всякую хуйню вместо работы. Работодатель тратит по итогу на порядок больше из-за поспешных решений, когда начинают лепить что-то, не понимая, что делают, инструмент, с которым работают, и т.п. Ну то есть это, конечно, самая обычная история в реальности, но так быть не должно и происходит именно от этого.
>>2130633 Меня как-то на собесе на etl разраба в пыньков завалили за то, что я забыл, чем в sql отличается оконная функция RANK() от DENSE_RANK(). Такие же обмудни собесили, параллельно смотря в монитор.
>>2130654 >завалили за то В 99% случает отказывают за другое, чем думают. Ты налажал в какой-нибудь самой базе и не заметил, а думаешь, что за что-то сложное тебя завернули.
Либо тупо мог чем-нибудь ещё не понравится, а уж повод найти можно.
>>2130657 Я глянул, я с этим не работаю и поэтому ответ не знаю.
Но по описанию смотрится как довольно базовая вещь, и если ты идёшь на специальность, где требуется хороший SQL уровень, где ты на этом собаку должен съесть, то вполне разумное требование.
>>2130650 > Я тебе уже несколько раз сказал, что это нужно на этапе обучения, а не коммерческой разработки А это разные вещи, да? Не бывает же такого, что новый проект на новом стеке, который ты видишь первый раз в жизни. Как и не бывает такого, что внешнее апи спустя 2 года стало depricated и нужно переписывать на новое/переезжать на другой сервис. > Попробуй почитать про mypy. Этот пакет отловит всё это и много больше. Не благодари. Нипонял, это как? Это же подсказки! Нужно ебаться самому с нуля и никуда не подсматривать > Работодатель тратит по итогу на порядок больше из-за поспешных решений Ну куда там работодателю с требованием бизнеса, можно годик подождать, пока ты раздуплишься, код с нуля попишешь, выучишь все методы, запомнишь все тонкости. А там глядишь уже конкуренты займут нишу и ничего не понадобится. > когда начинают лепить что-то, не понимая, что делают, инструмент, с которым работают, и т.п. Блять, опять менеджеры ебаные чета пукают про дедлайны и требования заказчика, которому нужно было вчера. Пусть подождут, я у Васянской либы методы учу, вот когда выучу, пусть тогда и приходят. > Ну то есть это, конечно, самая обычная история в реальности, но так быть не должно и происходит именно от этого Нет, именно так быть и должно. Лучше чтобы сегодня работало хоть как-то, чем через год и без багов. Будет падать -- будем рестартить. Много жрет -- докупим серверов. Заказчику нужно здесь и сейчас, чтобы начать получать прибыль. А если будут проблемы, то он к тебе же и придет за доработками и фиксами. По итогу и у тебя денег горы, и у твоего заказчика. Все довольны. А конкуренты, которые через год только первую приватную бету выкатят без багов уже никому не будут нужны, ровно вместе с горе-разрабами, которые этот год учили все методы в super_liba_by_vasyan. Странно, что тебе такие простые и очевидные вещи не объяснили
>>2130654 >RANK() от DENSE_RANK() В общем день прожит не зря, что-то новое узнал, чувствую себя мошенником тот анон, что за обучение на white board
Я этих штук не знал, и реализовывал этот функционал когда-то в коде. Хотя можно было сделать на уровне SQL. Стыдно.
Но это потому, что я не знаю SQL, хотя работал с ним на практике довольно плотно.
Типичная иллюстрация некомпетентности в реальной работе.
А всё потому, что я не потратил достаточно времени, чтобы учить SQL целенаправленно, по книгам, с решением задач, за что надо пару месяцев потратить. Чисто на обучение. Зато после этого и какой-то реальной практики можно честно писать себе "знание SQL" и это не будет мошенничеством.
К питону близкий пример. Можно написать код вида arr = get_some_array() index = 0 while index < len(arr): ____foo(index, arr[index]) ____index += 1
или
arr = get_some_array() for index in range(len(arr)): ____foo(index, arr[index])
оба варианта работают, можно, конечно, сказать, что такого?
Но это не программирование на питоне, и если ты пишешь "хорошее знание питона", то как бы странно. Если интервьювер попросит переписать с enumerate и ты не сможешь, то конечно сразу пошлют как мошенника. Потому что ты может быть программист крутой и смышлёный чел, то с языком не разобрался.
Пиздец вкатуны пожар устроили, юзать иде или не юзать. Если мне на работе скажут использовать пучарм вместо моего вс кода или вима, т.к. лицензию купили, я просто помахаю головой и забью. Или наоборот, запретят использовать пучарм, т.к. он разлагает мышление и это не тру, то я нахуй пошлю. Как мне удобно, так и пишу.
>>2130704 >А это разные вещи, да? Не бывает же такого, что новый проект на новом стеке, который ты видишь первый раз в жизни. Бывает. При плохой организации бывает. И у меня бывало. Это очень печально для проекта, когда вот так происходит, там неизбежно будет говно в коде и архитектуре. Я с этим сталкивался и исключений не видел.
Вещи абсолютно разные. Сначала ты учишься, только потом работаешь.
>Нипонял, это как? Это же подсказки! Ты должен уметь видеть ошибки без них. И плохо, когда у тебя инструмент отлавливает ошибку, когда ты её сам не видишь. Но как коммерческий инструмент, это работает.
>Ну куда там работодателю с требованием бизнеса, можно годик подождать, пока ты раздуплишься, код с нуля попишешь, выучишь все методы, запомнишь все тонкости. Более правильно нанять человека, который с этим уже реально работал и в этом понимает. Иначе ты слепишь что-нибудь, что потом невозможно будет поддерживать и дорабатывать, можно только переписать, убив кучу времени. Реальная история, повсеместная. И я выливал код, который был ужасным из-за непонимания, и я работал с чужим кодом, с которым сложно было сделать, потому что разработчик не понимал, как делать грамотно. Это обычная история. Но это плохо.
>Блять, опять менеджеры ебаные чета пукают про дедлайны и требования заказчика, которому нужно было вчера. В этом есть что-то хорошее и правильное?
>А если будут проблемы, то он к тебе же и придет за доработками и фиксами. "У меня нет времени". Потому что мелкая переделка, за которую много не заплатят, требует радикального рефакторинга, потому что сделано всё ужасно из-за некомпетентности исполнителя (меня).
>>2130710 >В общем день прожит не зря, что-то новое узнал, чувствую себя мошенником тот анон, что за обучение на white board >Я этих штук не знал, и реализовывал этот функционал когда-то в коде. Хотя можно было сделать на уровне SQL. Стыдно. >Но это потому, что я не знаю SQL, хотя работал с ним на практике довольно плотно. А IDE бы тебе по RANK предложил и RANK(), и DENSE_RANK().
>>2130704 >которые этот год учили все методы в super_liba_by_vasyan За год можно 10 васянских либ написать, не то что выучить методы.
Не знаю откуда у тебя такие сложности.
Вообще, вполне очевидно что ты пишешь код только ради денег и соответственно писать код качественно тебе не выгодно. Сам себе вредить не будешь, вот и остаётся верить что так надо.
Тот чел видимо идейный и пишет чтобы решить задачу наилучшим образом. По факту он ее решит, выложит на гит и ты будешь ее потом юзать и нахваливать. Но никогда не признаешь что ее разработали не ради бабла.
>>2130724 > Бывает. При плохой организации бывает. И у меня бывало Новые проекты бывают только при плохой организации? Я тебя услышал > Ты должен уметь видеть ошибки без них. И плохо, когда у тебя инструмент отлавливает ошибку, когда ты её сам не видишь. Покажи хоть одного человека, который не ошибался. Если каким-то образом пруфанешь, что у тебя всегда с первого раза все тесты проходит код, то скину 10к на карту. > Более правильно нанять человека, который с этим уже реально работал и в этом понимает Ага, я уже представил, как у тебя в компании решили подключить интеграцию с какими-нибудь гуглтаблицами и запилить для этого отдельный сервис на фастапи и ваша хрюша потом два года ищет человека, который не просто мидл, но еще и работал с этим стеком. Потом еще месяц онбоардинг и можно наконец-то приступать. > Иначе ты слепишь что-нибудь, что потом невозможно будет поддерживать и дорабатывать, можно только переписать, убив кучу времени Эмм, нет. Программирование это не знание всех методов в библиотеке. Это блять вообще самая незначительная часть кодинга, которая только отвлекает от самого программирования. И которую умные дяди постарались упростить до минимума, добавив тайпхинты, докстринги и подсказки. > И я выливал код, который был ужасным из-за непонимания, и я работал с чужим кодом, с которым сложно было сделать, потому что разработчик не понимал, как делать грамотно И он таким был не потому что ты плохо выучил все методы библиотеки, а потому что не сумел грамотные абстракции ввести, инкапсулировать логику, архитектуру сделал хуевую. Если у тебя хуевая реализация функции do_zaebis(), потому что ты сделал свой велосипед вместо использования уже готового интерфейса в либе, то ты можешь переписать ее и не трогать остальной код. > В этом есть что-то хорошее и правильное? Конечно есть, программист решает проблемы людей, а не создает их, зазубривая методы библиотек и специально замедляя и саботируя разработку. > Потому что мелкая переделка, за которую много не заплатят, требует радикального рефакторинга, потому что сделано всё ужасно из-за некомпетентности исполнителя (меня). Ну это только потому что ты/менеджеры твой компании не умеешь общаться с людьми. Заказчику нужно сразу говорить, что можно сделать быстро и как получится или долго и на заебись. И что потом доработки будут в копеечку. Это нормально и даже более того, это то, как нужно делать. А когда клиент вернется, то попросить нормальную сумму. >>2130828 > За год можно 10 васянских либ написать, не то что выучить методы Да хоть сколько, смысл в том, чтобы разобраться в либе и начать ее использовать можно в разы быстрее, чем сидеть и учить методы. > Вообще, вполне очевидно что ты пишешь код только ради денег Вот это открытие. А ты сам как? Святым духом питаешься? Живешь в бочке? Если нет, то не понимаю что тебя удивляет. > соответственно писать код качественно тебе не выгодно Как из утверждения про то, что я работаю ради денег следует то, что код я пишу хуевый? И как зубрежка методов делает код более качественным? > Сам себе вредить не будешь, вот и остаётся верить что так надо. Чему вредить? Это уже просто поток сознания пошел > Тот чел видимо идейный Согласен > пишет чтобы решить задачу наилучшим образом Как саботаж написания кода делает решение задачи лучше? > По факту он ее решит, выложит на гит и ты будешь ее потом юзать и нахваливать Ну как выложит, тогда и поговорим > Но никогда не признаешь что ее разработали не ради бабла Ты не понимаешь отличия между работой и хобби?
>>2130221 Это гораздо удобнее, посмотреть в цепочку вывовов либы. Всегда так делаю чтобы было норм понимание что происходит в коде. Порой там бывает полный пиздец.
Ты выдумываешь аргументы, потом другие, потом их опровергаешь.
>>2130881 >Новые проекты бывают только при плохой организации? Я тебя услышал Если в проект серьёзно завязывается на какую-то технологию, причём разработчики с ней не знакомы, опыта нет, и времени на изучение нет, то это очень плохая организация разработки. И проблемы неизбежны.
>Покажи хоть одного человека, который не ошибался. Никто не говорил, что такие проверки не нужны. Особенно в коммерческой работе. Но категорически плохо, когда ты закладываешься на то, что как-нибудь сделаю, а там потом чекеры и тесты отловят ошибки. Чекер это страховка, ты должен писать так, чтобы он срабатывал минимально.
И не путай обучение и работу. В обучении очень полезно самому спотыкаться на граблях. В работе нет.
>Эмм, нет. Программирование это не знание всех методов в библиотеке. Тебе не нужно зубрить, у тебя есть документация.
Базу ты, конечно, должен знать. Не зубрить, ты просто должен её хорошо понимать и помнить без документации. База, это основные библиотеки твоего стека.
> а потому что не сумел грамотные абстракции ввести, инкапсулировать логику, архитектуру сделал хуевую. Конечно, но всё это потому, что не было достаточного учебного опыта с этими технологиями, чтобы понять, как с ними работать правильно. Это общая проблема, когда ты начинаешь что-то осваивать в боевых условиях.
>Заказчику нужно сразу говорить, что можно сделать быстро и как получится или долго и на заебись. Ты видимо не понимаешь, как устроена такая работа. У тебя часто цепочка заказчиков и посредников, напрямую тебя не допустят к заказчику, все друг с другом грызутся, хотят нагнуть, большинство принимающих решения и контролирующих разработку ничего в этом не понимает. На работу выделен бюджет и хрен ты пробьёшь больше. При этом есть план, когда хотят видеть фичи, и спокойно могут просить потом всё переделать полностью, как будто там две строчки изменить.
Но вообще не об этом речь. А о том, что везде нужны профессионалы, которые понимают, с чем работают. А следующий вопрос, как вот стать этим самым профессионалом. И вот как раз IDE и подсказки очень сильно этому мешают. Легко в обучении, тяжело в бою, перефразируя.
>>2130881 >Ну как выложит, тогда и поговорим Переобуешься сразу, чтобы выгоду не упустить. Смысл с тобой говорить? Сытый голодного не понимает. Когда перестанешь работать за еду и ночлег, тогда с тобой можно будет говорить. Сейчас у тебя даже в голове не укладывается, чтобы бывает иначе.
Хуевый код одноразовый, а значит к тебе всегда придут за добавкой. Это как Макдональдс, его можно сколько угодно жрать и все равно будешь хотеть ещё.
Ты продолжаешь настаивать на том, что запомнить два десятка методов ОЧЕНЬ сложно. Советую побольше читать.
>>2130924 > Ты выдумываешь аргументы, потом другие Именно так и работает дискуссия, да > потом их опровергаешь. Нет > проект серьёзно завязывается на какую-то технологию, причём разработчики с ней не знакомы, опыта нет, и времени на изучение нет Ты кажется так и не понял о чем я лол. Давай я тебе попробую объяснить -- изучать технологию и учить все методы это не одно и тоже. Ты подменяешь изучение чего-то зазубриванием методов и потом пытаешься доказать мне, что не изучать технологии перед использованием плохо. Да, это плохо. Как и зазубривание методов. > Но категорически плохо, когда ты закладываешься на то, что как-нибудь сделаю, а там потом чекеры и тесты отловят ошибки Так ты специально ставишь себя в условия, когда риск ошибки выше. Причем риск самой тупой и бездарной ошибки уровня опечатки. Такие ошибки даже новичкам ничего не дадут. > Тебе не нужно зубрить, у тебя есть документация Не понял, ты же выше писал обратное. Что нужно уметь написать все методы не подглядывая в документацию. И это абсурд очевидный > Базу ты, конечно, должен знать. Не зубрить, ты просто должен её хорошо понимать и помнить без документации. База, это основные библиотеки твоего стека. Не надо ничего помнить, нужно понимать какой функционал есть и представлять логику работы библиотеки или фреймворка. Все остальное находится в документации. Не надо засорять голову говном > Конечно, но всё это потому, что не было достаточного учебного опыта с этими технологиями, чтобы понять, как с ними работать правильно Да и знание наизусть даже основных методов не нужно для понимания как работать с чем-то правильно > У тебя часто цепочка заказчиков и посредников, напрямую тебя не допустят к заказчику, все друг с другом грызутся, хотят нагнуть, большинство принимающих решения и контролирующих разработку ничего в этом не понимает Не чет какая-то суперхуевая аутсорс галера у тебя была, у нас такой хуйни нету. Более того, сейчас с аутсорса перезжаем на аутстаф. > А о том, что везде нужны профессионалы, которые понимают, с чем работают Согласен > А следующий вопрос, как вот стать этим самым профессионалом. И вот как раз IDE и подсказки очень сильно этому мешают. Да как подсказки от иде помешать-то могут? Круто было бы, если бы иде могли накидать архитектуру, найти утечки памяти, оптимизировать код, грамотно инкапсулировать логику, построить отказоустойчивые очереди и прочее. Но они могут только не дать тебе опечататься во время написания кода. И уж вот это никак не делает тебя каким-то крутым спкецом
>>2131409 Так летом всегда просадки, но вообще мне кажется, что все желающие с мозгами уже вкатились, а желающие без мозгов поняли бесперспективность этого занятияили у них из-за кризиса кончились деньги на курсы лол
>>2124389 (OP) Научите мэдскильно понимать запись в строку, я как бы вроде понимаю суть что делает тот или иной кусок, но вот четко представить не могу как если бы было записано в столбик. res2.extend(x for x in res1 if x[0] not in [y[0] for y in res2]) Вот типа такого как написать классически в столбец?
>>2131429 > res2.extend(x for x in res1 if x[0] not in [y[0] for y in res2]) За такую хуйню надо по пальцам бить > Научите мэдскильно понимать запись в строку Все что идет до первого for воспринимай как окруженное list.append() внутри фора, а все что идет после считай записанным внутрь обычного for
Частая ситуация когда 2 клиента общаются и если один из них не ответил по истечение определенного таймаута (скажем 5 минут) то приходит оповещение / разговор закрывается (то есть происходит какое-то событие) Как подобное сделать на nodejs / express? Самое очевидно это сделать некую функцию через setInterval, которая будет запускаться скажем каждые 10 секунд, проходить по всем объектам чатов и находить просроченные по timestamp. Но выглядит это малость нерационально. Шо делать?
Как такое мутить на пистоне? Тут никаких setInterval и setTimeout нет
>>2131429 Учись сам с течением времени, читая чужой говнокод И просто для справки: "мэдскильная запись в строку" оббыссывается с ходу на любом кодревью, не копируй долбоебов из интернетов (например с litcode) которые выебываются написанием громадных конструкций в 1 строку
>>2131586 Да в общем и целом читаемо, просто ты всегда хочешь читать код по диагонали, цепляясь за какие-то ключевые слова и стандартные конструкции. А здесь тебе приходится останавливаться и тратить несколько десятков секунд, чтобы понять что происходит. Но проблема даже не в этом, а в том, что написать кривую хуйню проще простого, а поймать баг в 5-кратной вложенности компрехеншена это просто идите нахуй
>>2131603 Я вот тоже так думаю. Обычный код имеет нормальную глубину по горизонтали и вертикали, а эти однострочные выражения сводят глубину вертикали к 1, а горизонталь задирают довольно сильно вверх (по сложности восприятия или по концентрации синтаксиса).
>>2131586 >>2131429 >>2131580 запись максимально коротко это не только плохо читаемо но еще и хуево для повторного использования. Это же ебаное функциональное программирование. можно прям весь код захуярить вот такими кнострукциями, но блядь это во первых очень сложно для восприятия, во вторых это просто бессмысленно. вот пример в функциональном стиле, норм что ли? input() # Пропускаем количества, обойдемся без них print( *map( lambda x: x[1][0], sorted( zip( sorted( enumerate(map(int, input().split())), key=lambda x: x[1] ), sorted( enumerate(map(int, input().split())), key=lambda x: x[1], reverse=True ) ), key=lambda x: x[0][0] ) ) )
>>2131655 Уходят в отпуск и отдыхают, гуляют вечерами на улице, уезжают к бабушке на каникулы, едут домой после сессии летней. Летом везде просадки, даже в продажах. Причем не в начале лета, а ближе к концу. Я до погромирования много где работал, в том числе в продажах. Самый пик это ранняя осень и начало весны.
>>2131375 Ты не понимаешь, как происходит обучение.
Человек учится тогда, когда ошибается, думает, почему ошибся и как не ошибаться. Учится, когда напряжённо думает, как реализовать что-то.
Если ошибки сразу исправляются автоматически, то он не учится. Он приучается писать с ошибками.
Если не ты при кодировании не из головы код берёшь, а постоянными подсказками пользуешься, ты не научишься думать. Это просто невозможно. Ты приучаешься к тому, что тебе постоянно что-то подсказывают, ты не можешь думать самостоятельно.
Программирование это как владение иностранным языком. Можно со словарём и книжками по грамматике, а можно свободно из головы. Это совершенно разные уровни и возможности.
Ты предлагаешь с самого начала отказаться от того, чтобы учить слова и грамматику. Потому что при профессиональном серьёзном переводе всё равно придётся заглядывать в словари. Я говорю, что чтобы чему-то научиться, надо приложить усилия, но польза будет огромная, твой уровень и возможности другими будут.
>>2131696 Обучалка чему? Особенно порадовало объяснения на 2 урока из 14 про то, как вообще начать писать код, что такое IDE и как ее настроить, что такое виртуальное окружение и потом сразу переход к тому, как писать свой парсер, что такое квери стринги и шаблонизаторы. Боюсь представить что будет у человека в голове после этого курса. >>2131719 > Ты не понимаешь, как происходит обучение. Нет, я прекрасно понимаю, программирование несравнимо проще тензорного анализа, но даже в нем я как-то смог разобраться и обучиться почти полностью самостоятельно. > Человек учится тогда, когда ошибается, думает, почему ошибся и как не ошибаться. Учится, когда напряжённо думает, как реализовать что-то. Но опечатка это не ошибка лол > Если не ты при кодировании не из головы код берёшь, а постоянными подсказками пользуешься, ты не научишься думать Ты либо не понимаешь как устроены подсказки, либо у тебя какая-то странная фиксация на том, чтобы самому исправлять все опечатки
>>2131730 Ты приписываешь мне какие-то утверждения, и сам их опровергаешь.
>Но опечатка это не ошибка лол Опечатка не создаёт больших проблем при обучении. Отловится при первом запуске. Ты сам её можешь увидеть, если прочитаешь свой код. И при работе больших проблем не создаёт. Нужен просто удобный редактор с подсветкой синтаксиса.
Ты вообще должен хорошо понимать, что делает тот код, который ты сам написал. Чтобы уметь его читать без IDE, не наводя на каждый вызов функции мышкой, чтобы посмотреть параметры, описание и т.п.
>>2131815 Потому что args выступает как self, сам self не является зарезервированным, ты можешь туда что угодно написать, питухону похуй как будет называться твой указатель на экземпляр, просто по ПЕП8 принятно писать self (по аналогии с this в C++).
>>2131815 1) Почему ты думаешь, что self отсутствует? 2) Почему ты считаешь, что если валидный, то значит хороший? >>2131745 > Опечатка не создаёт больших проблем при обучении. Отловится при первом запуске. Ты сам её можешь увидеть, если прочитаешь свой код И почему новички должны отлавливать ее на первом запуске вместо автоматического дописывания и исправления в названиях методов? > Нужен просто удобный редактор с подсветкой синтаксиса. Подсветка синтаксиса расскажет, что ты забыл/не прожалась кнопка p в get_romethues_metrics и код работать не будет? > Ты вообще должен хорошо понимать, что делает тот код, который ты сам написал > Ты приписываешь мне какие-то утверждения, и сам их опровергаешь. Где и что я тебе приписываю? Мы обсуждаем автоматическое исправление опечаток и ты уже в десятый раз говоришь о том, что делать опечатку это самое важное в обучении и без этого никуда. > Чтобы уметь его читать без IDE, не наводя на каждый вызов функции мышкой, чтобы посмотреть параметры, описание и т.п. Нахуя?
>>2131837 >И почему новички должны отлавливать ее на первом запуске вместо автоматического дописывания и исправления в названиях методов? Очевидно потому, что они должны думать, что пишут, и читать, что пишут. А не выдавать рандом, пока не заработает.
>Подсветка синтаксиса расскажет, что ты забыл/не прожалась кнопка p в get_romethues_metrics и код работать не будет? Нет. Над тем, как работает код, ты должен думать сам, головой.
>Нахуя? Ты программист и должен понимать, что делаешь. Бездумно долбить, пока не заработает, это не программирование, это интуитивный макакинг.
В идеале ты смотришь на код и понимаешь, что происходит в каждой строчке. Что происходит с данными, насколько оптимально, какие возможны косяки и т.п. Для этого надо думать. И учиться думать.
>>2131880 > Очевидно потому, что они должны думать, что пишут, и читать, что пишут. А не выдавать рандом, пока не заработает. Так, ладно, давай ты мне на примере покажешь как это улучшает уровень ПОНИМАНИЯ кода. Вот я новичек и пишу, например, такой код resp = requests.get('google.com) html_page = resp.text soup = BeautifulSoup(html_pge, 'html.parser') print(soup) Потом я запускаю код и вижу, что опечатался. Исправляю опечатку. Где конкретно и в каком месте мои навыки выросли? Что нового я узнал? Чему научился? > В идеале ты смотришь на код и понимаешь, что происходит в каждой строчке. Что происходит с данными, насколько оптимально, какие возможны косяки и т.п. Для этого надо думать. И учиться думать. И как блять с этим связано исправление опечаток? Хватит заменять "исправление опечаток" на "понимать код". Я тебя спрашиваю как из ручной правки опечаток следует понимание кода, ты же в ответ просто заменяешь слова "исправить опечатку" на "учиться думать" и начинаешь спорить с мной, будто я говорю о том, что думать не надо.
>>2131906 >Потом я запускаю код и вижу, что опечатался. И что? Это вообще к чему относится? Кавычку на первой строке покажет подсветка синтаксиса, ты сразу видишь, что строка не закрыта. А если ты вместо 'html.parser' напишешь 'htlm.parser', тебе тоже IDE ошибку найдёт?
Читай внимательно свой код.
Как программист, ты должен в первую очередь понимать, какие параметры куда подставлять. Например можно get('google.com'), или надо get('https://google.com/') и какие могут быть нюансы из-за этого? Что будет в случае ошибок?
Вот в этом главная работа программиста.
Если ты не в состоянии прочитать код и увидеть там опечатки, то это беда. Потому что ошибки, которые не способна увидеть IDE, найти на порядки сложнее. А у тебя навык не наработан, чтобы код смотреть, ты привык, что за тебя IDE/copilot дописывают.
Реально, очень полезно писать код иногда на бумажке или в блокноте. Ты просто на другой уровень выходишь, если так можешь.
Пиздец вы долбаебы код без IDE пишете? Да вы поехавшие нахуй, еще скажите что у вас в CI не стоят линтеры и проверки типов, а рефакторинг вы вручную хуярите.
>>2131960 Они и пробелы вручную ставят. Перешёл на 3й уровень вложенности? Будь добр 12 раз пробел нажать перед каждой строчкой, а то вдруг думать перестанешь.
>>2131576 Паттерн называется watchdog. Вариантов реализации у него полно, от полных часов внутри программы, до внешнего наблюдателя. Моё личное предпочтение, это использование сигналов ос https://docs.python.org/3/library/signal.html#signal.SIGALRM но у меня и системы все позикс совместимые.
>>2131576 Тут самый первый вопрос, это как у тебя в приложении устроена конкурентность.
Два основных варианта, это многопоточность и асинхронность.
В обоих ты можешь реализовать паттерны аналогичные setInterval. Я работаю с asyncio в основном. Подход один в один.
Например в aiohttp обработчик вебсокетов, когда приходит соединение, поднимает несколько фоновых задач. Одна из задач это контроль за соединением, если ты обнаруживаешь, что нет активности давно, ты принудительно закрываешь вебсокет. Работает дубово, цикл с asyncio.sleep(несколько секунд), если зарегистрированная активность была, ок, если нет, закрываешь сокет.
Когда сети, то там всё ненадёжно, поэтому полезно иногда.
Правильнее отлавливать обрывы соединений явно, но это не всегда работает, граблей много. В старых версиях aiohttp, в 3.6, был баг, и там часто соединения могли повиснуть без каких-либо сигналов и возможности что-то узнать.
Клиентская сторона может повиснуть на логическом уровне, держать соединение, хотя реально его игнорировать.
А кстати, в какой части резюме на хх ру стоит кидать свой гит? На это вообще смотрят? На портфолио смотрят? Слышал на двощах что всем похуй на портфолио.
https://pastebin.com/4SRZq9WN Я очень сильно подозреваю что это можно как-то сократить, да ещё и так чтобы потом просто дописывать нужные параметры. Кто-нибудь может подсказать как?
>>2132258 [del (wall)[j] for i in range (WALL_LEN) for j in ["marked_as_ads","post_type","date","copy_history","post_source","comments","likes","reposts","views","is_favorite"] if j in (wall)] покормил
for wall_item in wall: ____for key in ["marked_as_ads", "post_type", "date" .....]: ________wall.pop(key, None)
pop(key, defaultValue) позволяет извлечь элемент, или default, если элемента нет. Это чтобы исключения не обрабатывать и чтобы на вхождение не проверять.
Кодить начал недавно, ссанными тряпками не бейте. Есть функция которая из нескольких списков, состоящих из целых чисел, рандомно, в зависимости от веса определенного элемента, вытягивает этот самый элемент и закидывает его в другой список, который состоит из вот таких комбинаций рандомных элементов.
Приведу пример для ясности. У нас есть три списка, из которых будет производиться выборка: list1 = [1, 2, 3, 4] list2 = [1, 2, 3, 4, 5] list3 = [1, 2, 3] Дальше происходит рандомное избрание элементов. Из list1 выбирается элемент 3 Из list2 выбирается элемент 5 Из list3 выбирается элемент 1 Следовательно в итоговом двумерном списке, назовем его listRes, будет находится элемент, состоящий из данной выборки listRes = [[3, 5, 1]]
Мне нужно сгенерировать из исходных списков в моем случае их 6 и число элементов в некоторых из них более 40 около 10к элементов в listRes. Главное условие - не должно быть никаких повторений. То есть если у нас есть элемент [1, 1, 1], то при получении в рандоме такого же элемента он должен браковаться и рандом должен начинаться опять, пока не будет получен элемент, которого ещё нет в итоговом списке. В цикле генерации у меня стоит проверка показанная на пикриле. Всё бы ничего, но после 1к элементов, перепроверка всех элементов и дальнейшая генерация рандомного значения, отличного от уже существующих, становится крайне долгой. Связываю это с рядом вещей: 1. Общее число элементов, которое постоянно увеличивается, отчего увеличивается нагрузка на перепроверку. 2. Рандом, завязанный на весе каждого определенного элемента исходных списков.
Нагенерить даже 4к элементов выходит крайне долго. Запускать генерацию на 8к я пока не решался вовсе. Прям хороших и годных способов оптимизации данного процесса не вижу, потому и пришёл за помощью сюда. Как можно улучшить мой алгоритм, но при этом сохранить все нужные условия, а именнно: 1. Элементы итогового списка не должны повторяться 2. В элементах итогового списка должно соблюдаться то же самое соответствие элементам исходных списков то есть, например, если в исходном списке list1 находятся цифры от 1 до 8, то цифры более 8, на месте первого элемента в подсписке входящем в listRes, быть не должно 3. Должно быть соответствие распределению по заданным весам то есть если в списке list1 у первого элемента вес равен 10, а у второго 8, то первый элемент должен попадаться в среднем чаще чем второй
Я подумывал просто перебрать все возможные комбинации из этих отдельных элементов исходных списков, а потом просто перемешать итоговый список, но как-то не смог реализовать это толково. В общем, аноны, надеюсь на вас. Надеюсь, что расписал более-менее понятно. Если надо, то готов пояснить подробнее за какие-то вещи, которые здесь неясны.
>>2132332 >рандомно, в зависимости от веса определенного элемента шо?
>Главное условие - не должно быть никаких повторений Делай через set (множество). Очевидно же. Только работай не с массивами а со строками. Потом в конце строки распрасишь в массивы
Анончики, есть числовой массив вида a = [1, 2, 3, 4, 5, 6] и число n, допустим равное 3-м. Я создаю n cписков в переменной соpy: copy = [[] for dummy in range(n)] Так вот, как мне копировать числа из массива 'a' по очереди в каждый из списков в cору, те 1 идет в первый список, 2 идет во второй, 3 в третий, 4 опять в первый и тд?
>>2132352 >>2132352 >шо? В посте ж писал, что >то есть если в списке list1 у первого элемента вес равен 10, а у второго 8, то первый элемент должен попадаться в среднем чаще чем второй Элементы, у которых веса побольше, должны встречаться чаще в этом множестве из 10к элементов, чем те, у которых веса поменьше реализую всё это через параметр weights в random.choices
>Делай через set (множество). Очевидно же. Только работай не с массивами а со строками. Потом в конце строки распрасишь в массивы Хороший совет, вот только как мне работать с учетом последнего пункта требований, а именно > В элементах итогового списка должно соблюдаться то же самое соответствие элементам исходных списков то есть, например, если в исходном списке list1 находятся цифры от 1 до 8, то цифры более 8, на месте первого элемента в подсписке входящем в listRes, быть не должно Set ведь, вроде как, вообще исключает повторения, а тут они допускаются среди элементов подсписков, но не допускаются совпадения подсписков целиком.
>>2132332 Для начала сделай какую-нибудь отладочную печать, сколько элементов генерится, а сколько отсеивается. Например сделай счётчик сгенерированных элементов и отсеянных и выводи их после каждого удачного случая.
Чтобы понять, в чём проблема. Рандом не может "уставать", ему всё равно, 100 элементов сделать или 100 миллионов.
Возможно, у тебя количество отсевов растёт, и под конец на каждый полученный элемент приходится условно 1000 отсеянных.
Если так, то значит ты хочешь невозможного. Потому что распределение вероятностей в полученном множестве будет не тем, которое ты хочешь. Вот условно, два множества, ['a', 'b'] и ['1','2'] вес a 0.9, b 0.1, fаналогично вес 1 0.9? вес 2 0.1 cскорее всего первым ты получишь a1, потом a2/b1, потом b2. Но всего 4 элемента максимум, и по итоговой выборке, если её оценивать, распределение весов будет 0.5 для всех элементов.
Делая отсев, ты тем самым смещаешь веса.
В общем надо сделать проверку, для начала я бы сделал отладочную печать для контроля.
Или ты хочешь невозможного, или ты где-то налажал.
>>2132368 >Возможно, у тебя количество отсевов растёт, и под конец на каждый полученный элемент приходится условно 1000 отсеянных. Так и есть, так что здесь >Если так, то значит ты хочешь невозможного ты прав.
В таком случае, наверное, логичнее будет просто перебрать все возможные комбинации из элементов исходных списков, как я уже писал в >>2132332. Другой вопрос: как это сделать?
>>2132362 Кстати, возможно тебе будет интересен другой подход для твоей задачи.
Ты делаешь векторы с исходными весами, например [1, 10]. Если выпадает какой-то элемент, то вес этого элемента уменьшаешь, скажем умножаешь на 0.9. Можно корректировать вес только в случае, когда элемент идёт на отсев.
Тогда у тебя получится естественная балансировка выборки.
Понятно, что общий вес всего вектора будет падать со временем, это не так страшно, там всё равно работа с double, хоть одна миллиардная, хоть миллиард. Но при желании иногда можно нормализовывать.
Да, идёт смещение вероятностей, но делая отсев, ты это же смещение тоже делаешь.
>>2132332 >Я подумывал просто перебрать все возможные комбинации из этих отдельных элементов исходных списков, а потом просто перемешать итоговый список, но как-то не смог реализовать это толково. Так веса потеряются.
Всё правильно тебе про сет сказали.
>>2132362 >Set ведь, вроде как, вообще исключает повторения, а тут они допускаются среди элементов подсписков, но не допускаются совпадения подсписков целиком. Так ты в сет помещаешь в сет подсписки целиком. Делаешь так: заводишь сет myset = set() получаешь свой подсписок [3, 5, 1] скукоживаешь его в строчку, например так (если уже строки, то map не нужен) sublist = '#$'.join(map(str, [3, 5, 1])) получается у тебя такая строка '3#$5#$1' запихиваешь её в сет myset.add(sublist) генерируешь сколько тебе надо (это можно оптимизировать, но выбираю простоту объяснения) while len(myset) < 8000 после чего раскукоживаешь строчки из сета в список списков list_of_sublists = [sublist.split("#$") for sublist in myset]
>>2132370 Можно сгенерировать все комбинации и отсортировать их по суммарному весу со случайной добавкой (шум). Не надо тогда заморачиваться с отсевом дубликатов.
>>2132332 Тебе нужен недетерминированный вариант генерации? Если да, то насколько недетерминированный? Если можно и детерминированный, о нахуя тебе вообще тут рандом? >>2131943 Не, соре, третий день эту хуйню я уже не хочу оюсуждать
Они что, ебанутые? Почему на питоне 3.8 этот PyOpenGL-accelerate ставился без проблем, а в 3.9 требует какую-то залупу на 4 гб, которую потом из системы нельзя удалить.
А набор с++ вместе с ide, где и opengl стоит, и ещё куча либ разных на все случаи жизни занимает намного меньше места и всё там работает как часы.
Мне нужно запускать скрипт через cron. Вверху скрипта прописано: #!/usr/bin/env python3 Так же есть виртуальное окружение на котором установлены всякие библиотеки.
sudo chmod a+x fileName.py - выдал
что я вставляю в cron: (5 звезд) cd ~/scripts/projectFolder && source venv/bin/activate && ./fileName.py && deactivate При этом просто строка: cd ~/scripts/projectFolder && source venv/bin/activate && ./fileName.py && deactivate выполняется нормально.
А сам крон перестает работать уже на моменте cd ~/scripts/projectFolder && source venv/bin/activate
Подскажите, как это исправить? Возможно верхнюю строку можно прорписать так, что бы при просто вызове ./fileName.py он запускался через питон из окружающей среды. Если да, то как ее прописать тогда?
>>2133086 Не надо ничего активировать, просто пропиши полный путь до питона, который в виртуальном окружении (звездочки) /full/path/to/venv/bin/python path/to/fileName.py
>>2133114 Спасибо. Помогло следующее: cd ~/scripts/projectFolder && ~/scripts/projectFolder/venv/bin/python ~/scripts/projectFolder /fileName.py Надо перейти вначале в папку проекта (что бы он мог локальный файлы подтягивать) а потом как ты сказал запускать.
Для чего тогда я chmod прорписывал:/ А вот про верхнюю строку, шедул или как-то так она называется может кто подсказать? Я же правильно понял, что я могу прописать там путь к интерпретатору и запускать потом без вызова python, а просто через ./someFile.py? Если да, то как ее прописывать?
>>2133242 Я уже давно зарабатываю на фрилансе и думаю легализоваться, но боюсь, что возьмут за жопу и заставят за старое плотить нолог, лол. Пока сижу. Но это через пионер, его хуй вычислишь.
>>2133260 Бля, ну вывести бабки с платежек - это рили изи, были бы. В серую работаю до поры до времени. Вот их и хотят обложить налогом. Или закрыть за тунеядство.
Подскажите пожалуйста, есть ли какой нибудь цикл видеоуроков, чтобы по нему можно было полностью освоить Python, с нуля до продвинутого уровня. На ютубе ничего годного не нашёл. Эталон - уроки канала simple code по с++, вот нужно что нибудь такое, только по Python.
>>2134055 Какое же говно, просто охуеть. Пробежался по названиям тем -- челы вообще не в курсе как нужно подавать информацию, просто навалили кучу говна в рандомном порядке. 10 минут на иттерируемые объекты, 20 на функции и два часа на венв лол
Я не помню, что бы раньше было это -> None Что оно означает? Где за это почитать?
Так же мне кажется, что я очень сильно все дроблю. Больше чем нужно. Что почитать такого, что бы я более правильно понимал структуру кода что ли? - когда надо создавать классы и как правильно их придумывать - а когда это нафиг не нужно -насколько сильно дрообить функцию
>>2134272 Зависит не от языка, а от того что ты хочешь. Понятно, что в машобе без матана не обойтись. А автоматизация рутинных действий вообще не требует ничего, кроме арифметики.
>>2134272 Если делать либы для питона, или в нии и кб сидеть, то нет, если пилить сайты, и прочую лабуду, те юзать фреймворки, то да. Кароч, создавать велосипеды, нет, юзать велосипеды - да.
>>2134354 Я еще даже не вкатился, поэтому не знаю, чего хочу, хех. Но точно не чего-то, что потребует хотя бы универских знаний математики (по крайней мере в процессе первичного обучения). >>2134374 О, юзать велосипеды я могу, спасибо. >>2134388 Просто не знал с какой стороны спросить, лол. Слышал просто что тут нужно больше математики знать, чем в других популярных языках.
>>2134272 Вряд ли. Если ты не кайфуешь от программирование и тебе не нравится себе в удовольствие кодить - то либо ты будешь макакой, которая выполняет сплошные рутинные задачи, либо у тебя должна быть железная дисциплина, чтобы изучить все тонкости и эффективно пользоваться разными инструментами. А если кайфуешь - то не задавал бы такой вопрос.
Все привет. Мимо дэвопс 4года экспы +N лет опыта в разработке пхп и около модмейкерских штучек на разных скриптовых языках. С чего можно начать чтобы научиться писать пиздатый код на питоне?
>>2134188 Ты че пидор динамический что ли? Че пидор что ли бля? Выебу сука бля __init__ всегда возвращает None блять, хуле оно там тебе подсказывает-то? небось жидбрейнс ебаный? выебал бы нахуй
>>2134542 Питон для детей(неиронично, книга охуенная, сам начинал с нее) >>2134621 Опыт и только опыт, рекомендую тайпхинту и мупу использовать, улучшает качество кода автоматически. >>2134188 Попробуй сначала с синтаксисом базовым разобраться, а то ты вообще по ходу не понимаешь, что происходит у тебя в коде. А так это тайпхинт. >>2133431 dynaconf и подставлять secrets >>2134149 А почему я не могу судить по хронометражу?
>>2134626 >>Опыт и только опыт, рекомендую тайпхинту и мупу использовать, улучшает качество кода автоматически. Хорошо, но я уже их использую. Иногда оно выглядит как привычка с C или делфей юзать статическую типизацию.
>>2124389 (OP) Посоветуйте пожалуйста с какой книги лучше начать изучение новичку Эрик Мэтиз - Изучаем Python или Тони Гэддис - Начинаем программировать на Python?
>>2134671 Вкатыш Вкатунцов - Полный обзор книг для вката в Python. Все эти нубские книги охватывают примерно одно и то же. Берешь любую, потом всё равно надо будет лезть вглубь самостоятельно.
>>2134640 Ну тогда рекомендую почитать про паттерны, я как-то задавался вопросом о том как писать абстрактно хороший код на питоне, но ничего особо годного не нашел. Язык слишком быстро меняется, чтобы была какая-то годная книжка, так как ей нужно настояться и пройти несколько редакций.
>>2134474 Ничего у меня не получается((( помогите подскажите правильную структуру может быть
пока у меня /app -__init__.py -/a --__init__.py --/b ---__init__.py ---c.py -/x --__init__.py
и ничего не работает Если я пишу в /app/b/c.py from app.models import variable_in_x то пишет, что ModuleNotFoundError: No module named 'app' Если я пишу в /app/b/c.py from ...x import variable_in_x, то пишет ImportError: attempted relative import with no known parent package Впрочем и если пишу в /app/x/__init__.py from app.a.b.c import variable_from_c то пишет ModuleNotFoundError: No module named 'app'
Я уже не знаю что делать, в интернете не пойми что пишет, даже до того, что вручную добавлять путь, хотя вроде бы и просто всё Работает только с совсем простым типа a.py b.py
>>2134752 Лазаю на гитхабе и там всё нормально у людей импортируется видимо раз столько кода написано, просто делают пустой __init__.py Может потому что у меня venv, но вроде нет, раз я его перенес в родительскую директорию для app и ситуация такая же
>>2134770 Чел, ты так и не понял как работают импорты. Это одна из самых сложных тем, по крайней мере, я не знаю ни одного человека, который бы об нее не споткнулся хоть раз. Попробуй прочитать еще раз и очень внимательно
>>2134770 Ты что, дурачок? Делаешь файл 1.py, внутри from app.m import a print(a) Потом папка app, внутри m.py, внутри a='hui' В чем проблема то блять?
>>2134474 > Как в g.py получить переменную, что определена в f.py from app.sobaka.f import xxxx например но все зависит от точки запуска + занеси __init__ в моудли
Как сделать, чтобы типа есть папка projectname в ней будет папка app и чтобы в ней были любые папки и файлы а я бы мог импортировать просто как app.papka1 и тд
>>2134788 Чел ты мб пойдешь документацию почитаешь? Но давай я тебе дам две подсказки: 1) Ты знаешь что такое точка входа скрипта? Погугли что это такое 2) Нельзя импортить ничего, что находится выше, чем точка запуска
Делаю пет на фласке. Надо прикрутить на страницу несколько фильтров, чтобы по нажатию кнопки get запрос переформировывался и хотелось, чтобы у юзера "сохранялись" последние выбранные фильтры. Я так подумал обычным фласк формами тут не обойтись, да? Подскажите популярное решение, наверняка эта часто встречающаяся задача.
>>2134793 а при чем тут точка входа, если речь даже просто о переменных тех же? я же не сервер пока что запускаю, а чисто переменные импортировать > Нельзя импортить ничего, что находится выше, чем точка запуска да ну просто вместо . пишешь .. и так далее это если относительно
а документация... да там ничего и не противоречит ладно, завтра посмотрю уже ужас просто
>>2134802 > а при чем тут точка входа, если речь даже просто о переменных тех же? Оооо понимаю нахуй, действительно, причем же блять тут точка входа, если у тебя идут импорта. Вот как думаешь, от какого места будут считаться импорты? > я же не сервер пока что запускаю А при чем тут нахуй сервер?
>>2134788 Не очень понятно, что тебе надо В корне projectname ты можешь так и импортировать. Если ты хочешь откуда-то из глубины импортировать, изнутри app, то тебе надо добавить папку projectname в путь поиска модулей. Иначе твои приложения не знают, что такой модуль существует.
>>2135595 Стек с того времени очень сильно поменялся. Из базы питона это asyncio и typing, куча сторонних решений вроде pytest, изменившиеся веб-фреймворки. Django тогда был, aiohttp/fastapi не было.
Технологии в целом с того времени заметно поменялись.
Надо новые факи составлять, но всем лень. Мне тоже и лень, и не чувствую в себе экспертности, чтобы вот этим заниматься.
>>2135720 >какие проблемы порождает асинхронность Посос, тут все в курсе про падение производительности для синхронных прог из-за накладных расходов на event loop и переключение контекста. Однако это падение редко будет превышать 10-20% для нормальных фреймворков и внезапно блять будет полностью нивелироваться при доступах к внешним ресурсам. А ты и дальше блокируйся на 400 мс при запросах к внешнему апи и на 1000+ мс при тяжелых запросах в базу
>>2135726 "пок-пок треды захуярю и все изи!" А вот тут начнется поэзия нахуй, при доступах к общим ресурсам, локах и с кайфовыми неотлавливаемыми ошибками
>>2135726 Пчел, почитай про I/O+CPU bound задачи, асинхронность это не панацея. Если не хочешь, чтобы у тебя пользователь ждал по 10 секунд ответа от сервиса, то выбирай инструмент под задачу
>>2135758 Если все что делает твой сервис это агрегирует несколько ответов от других сервисов и складывает это в джсончик, то никаких проблем. Как только добавится CPU нагрузка и блокирующие вычислительные операции на ядре, то через раз будут возникать ситуации, когда между получением реквеста от пользователя и ответом ему будут вклиниваться 5-6 блокирующих CPU bound операций от других запросов. И пользователь будет охуевать от ответов сервиса по 2-3 секунды. asyncio называется asyncIO не просто так
>>2135762 Притянуто. Если у тебя настолько ёмкие операции, то скорее всего надо их выносить на отдельные вычислительные процессы-ноды.
Фласк и треды могут быть полезны только в том случае, если у тебя обычное приложение на одного пользователя с cpu-bound операциями, и тебе надо прикрутить к нему веб интерфейс.
Само собой вряд ли разумно под asyncio переделывать всю задачу, смысла нет.
Ребят, за плечами всего год опыта написания бэкенда на питоне, есть варик перекатиться в data engineer с обучением внутри компании. Стоит того или продолжить хуярить бэкенд?
>>2135766 > Притянуто Да, пиздец притянуто, только у меня на каждом втором проекте такое. > Если у тебя настолько ёмкие операции Для того, чтобы пользователь начал охуевать от задержок в 2-3 секунды, достаточно CPU bound операции на 100мс. Какой-нибудь рекомендательный алгоритм или там обрезка изображения с конвертацией под нужный формат. > скорее всего надо их выносить на отдельные вычислительные процессы-ноды И как ты с этими процессами собираешься общаться? Будешь запускать на той же машине, чтобы тащить на каждую реплику обработку жсонов в отдельном процессе? Как выстраивать отказоустойчивость будешь? > Фласк и треды могут быть полезны только в том случае, если у тебя обычное приложение на одного пользователя с cpu-bound операциями, и тебе надо прикрутить к нему веб интерфейс. Что нахуй значит "на одного пользователя"? Это блять что вообще такое? А если пользователей 10? Станешь использовать асинхронные фреймворки? Окей, вот тебе прилетел реквест, ты отправил запрос к бд и переключился на другую таску. А там БАЦ и CPU bound. Подождите 100мс. А следом еще 8 тасок, где снова БАЦ и CPU bound задача. Подождите еще 800мс. Ну, а теперь можно и свою CPU bound тасочку запустить на 100мс и отправить пользователю. По итогу, ожидание ответа заняло более 1 секунды. А если пользователей 100? А если 200? Там реквесты по таймаутам отваливаться начнут.
>>2135791 >Для того, чтобы пользователь начал охуевать от задержок в 2-3 секунды, достаточно CPU bound операции на 100мс. Это значит что у тебя перегружен процессор вообще, и единственный вариант это как-то разгрузить его.
>>2135791 > Подождите 100мс. > А если пользователей 100? А если 200? А откуда ты собираешься брать 20 процессорных секунд? У тебя нет возможности выжать из одного процессора десятикратную производительность.
В случае asyncio у тебя есть возможность вызвать какую-то функцию в отдельном треде, или запустить отдельный поток.
>И как ты с этими процессами собираешься общаться? Будешь запускать на той же машине, чтобы тащить на каждую реплику обработку жсонов в отдельном процессе? Если тебе надо обрезать изображение, то тупо отправляешь задание в виде JSON в другой процесс и ждёшь ответа.
Это называется "изобретать свою очередь обработки сообщений", для этого есть готовые решения, конечно. Особенно если тебе надо надёжно.
Особых вариантов и нет. У тебя один управляющий узел, и пул вычислительных процессов-узлов, которые считают cpu-bound задачи.
Ух, после завтра начинается стажировка в компании, учил язык пол года, практиковался в запросах на SQL и немного джанго с aiogram. Страшновато, если честно, скорее всего на этой стажировке я не один и будет война за место.
>>2135807 Попробуй относиться иначе. Похуй на место в компании, всё равно на невыгодных позициях. Твоя задача прокачать технические скиллы, чтобы разобраться, как что работает и понять, как что делать.
Даю на вход 1 -3 8.5 Выдает (1.5000000000000002+2.5j) (1.4999999999999998-2.5j) А должно (1.5+2.5j) (1.5-2.5j) Как загуглить это гавно или в чем проблема Костыль с округлением ставить не хочу и не ебу как
>>2135798 > Это значит что у тебя перегружен процессор вообще, и единственный вариант это как-то разгрузить его. Нет, тебе достаточно сделать так, чтобы CPU операции выполнялись в том порядке, в каком они поступили. > откуда ты собираешься брать 20 процессорных секунд? У тебя нет возможности выжать из одного процессора десятикратную производительность. На одном ядре действительно нету. А вот на нескольких вполне себе есть. > В случае asyncio у тебя есть возможность вызвать какую-то функцию в отдельном треде, или запустить отдельный поток. Запускаешь в отдельном потоке @ Вспоминаешь про гил А если вне контекста питона, то асинхронный сервис может держать на одном ядре 500-700 рпс, при этом вычислительные мощности могут держать только 10. Тебе не кажется странным тащить асинхронный движок в каждый сервис, который будет не пойми зачем крутить луп, если на 50 ядер тебе нужен только один сервис для приема сообщений? > Если тебе надо обрезать изображение, то тупо отправляешь задание в виде JSON в другой процесс и ждёшь ответа Ты кажется начинаешь понимать зачем нужны асинхронные сервера, а зачем синхронные. Так, а теперь сделай следующий логический шаг и подумай, на чем будет написан сервис, обрезающий изображения? > Это называется "изобретать свою очередь обработки сообщений" Очередь сообщений нужна далеко не везде, И уж тем более с картинками ты ебанешься брокера использовать, чтобы эту картинку туда-сюда гонять. > Особенно если тебе надо надёжно Если тебе надо надежно, то к брокеру сообщений нужно прикручивать реплики и делать синхронную запись. То есть, брать кафку или костылить свое, если она не подходит. Сами по себе брокеры, конечно, понадежнее http, но то сорта говна. > Особых вариантов и нет. У тебя один управляющий узел, и пул вычислительных процессов-узлов, которые считают cpu-bound задачи. Ну это ты пока свой мвп на коленочке делаешь, то да, сойдет, а как дойдешь до нормальных продакшн решений с высокой отказоустойчивостью, то за такие решения тебя по рукам бить начнут. Начиная от отслеживания процессов(охуительная тема, базарю), заканчивая тем, что у тебя от каждой реплики 1 ядро автоматом откусывается просто по фану. >>2135816 > Взял и без задней мысли запустил в другом thread А потом ты жидко пукнув вспоминаешь про гил. И да, > run_sync_as_async все так же блокирует поток выполнения.
>>2135766 >Притянуто. Если у тебя там настолько ёмкие операции, то скорее всего надо их на отдельные вычислительные процессы-ноды.
>Фласк и треды могут быть полезны только в том случае, если у тебя обычном приложении на одного пользователя с cpu-bound операциями, и тебе куда надо прикрутить к нему веб интерфейс.
>Само собой вряд ли разумно под asyncio переделывать всю задачу, смысла нет.
Если я нашел прилку на джанго типо туду, как ее поставить себе? Типо попользоваться самому. Если там нету зависимостей. Надо просто накатить джангу в виртенв, и там сделать миграции, да? Работать будет? Некоторые разрабы пишут как устанавливать. Этот нет.
>>2135998 >Каким образом гил будет способствовать блокированию потока выполнения? Ты понимаешь что в рамках одного процесса питона треды не могут выполняться параллельно, а лишь только конкурентно и чтобы отпустить gil придется писать обертки на других языках? На нативном питоне у тебя будут охуительные просадки по производительности. мимо другой чел
>>2136022 Что asyncio что треды для cpu задач не подходят, тут либо кидать задачи в брокер, либо писать обертки, либо брать другой язык и писать на нем.
Ребята, прохожу стажировку, дали копаться в чужом коде и оптимизировать его, плюс немного убрать баги, задача вроде легкая, но я нихуя не понимаю, я вижу что хуево работать, но что делать я не знаю, после каждого действия все валится, я уже в тильте сижу, 6 часов потратил и за это время я убрал только переменные которые нигде в коде не используются и какую-то не нужную хуйню, может и нужную, но вроде нет.
Опытные ребята, что вы делаете когда застряете на месте, я то зеленый, интересно послушать
>>2136460 >задача вроде легкая, но я нихуя не понимаю о боже
> я вижу что хуево работать, но что делать я не знаю о боже праведный!
> после каждого действия все валится Добро пожаловать в мир реальной разработки
>я убрал только переменные которые нигде в коде не используются и какую-то не нужную хуйню Тебе надо понять, как код в принципе работает, логику построения.
Ты реально считаешь, что вот тебе, зелёному и без опыта, можно дать рабочий сложный код, который скорее всего долго делали, и ты сможешь быстро его улучшить? Если так, то у меня плохие новости для тебя и для тех, кто взял тебя к себе работать.
>>2130582 Специфика списков, которые продолжают ссылаются на один и тот же объект: после изменения только одного из них, изменяется и второй. Свойство некопируемости при присвоении характерно только для списков, но не кортежей, то есть кортежи здесь подобны не спискам, а строкам или численным переменным.
https://stackoverflow.com/questions/43241221/how-can-i-wrap-a-synchronous-function-in-an-async-coroutine Вот способ запуска синхронной блокирующей функции в асинхронном коде (по факту просто внутри нового треда). А как запустить асинхронную функцию в синхронном коде? То есть как закинуть асинхронный таск, чтобы тот пошел выполняться и при исполнении выполнил некий переданный ему коллбек, при этом не блокируя main-loop ?
>>2136742 Функции asyncio.create_task/loop.create_task синхронные, то есть ты из синхронного кода можешь запустить задачу.
Из синхронного кода ты можешь кормить очередь с помощью put_nowait.
Ты не можешь делать await в синхронном коде.
К Future/Task ты можешь добавить синхронный коллбэк, который будет вызван, когда они исполнятся. То есть task = asyncio.create_task(coroutine) <-- синхронный вызов task.add_done_callback(foo) <-- синхронный вызов, коллбэк тоже обычная функция.
Сложнее будет заблокироваться и ждать, по идее можно сделать через очереди, ты создаёшь queue.Queue() и ждёшь данные оттуда. А данные туда помещаешь в коллбэке.
Надо аккуратно смотреть, что там threadsafe, а что нет, если ты в многопоточке делаешь. Asyncio в целом не threadsafe.
>>2136756 >ты создаёшь queue.Queue() и ждёшь данные оттуда. Хотя я сейчас торможу и надо думать, что будет, если эвент луп работает в другом треде.
Внутри одного треда эти паттерны очевидно не работают, эвент луп не получит управления, пока ты сам ему не разрешишь через await. Насколько помню, ты в каждом треде можешь запустить свой эвент луп, но какие-то нюансы есть. Я это пробовал давно когда-то, даже работало, но реально не использовал, чисто для игр.
>>2136756 В жопаскрипте можно сирануть промисом, передав ему коллбек и код пойдет исполняться дальше, не ожидая исполнения этого промиса. То же самое и с setTimeout. Я про это говорил (похоже тоже придется тредами серить)
>>2135986 Так дело не в том поддерживают или нет, а в том, что у тебя крутится луп просто так. >>2135998 > Каким образом гил будет способствовать блокированию потока выполнения? Тем, что ты не можешь запустить 5 cpu задач параллельно. Точнее, конечно можешь, только они будут выполняться дольше, чем 10 задач последовательно. > Ты понимаешь вообще что такое thread? Там контекст каждые N мкс переключается сам, где там блокирование будет? Возьми и попробуй запустить, что как маленький. И посмотри на время выполнения
>>2136776 В JS когда ты промис делаешь или setTimeout, ты не можешь дождаться результата в этой ветке.
То есть сначала твоя ветвь исполнения доходит до конца, финального return, ветвь умрёт, и только потом будет вызвана новая функция. Это если без await.
Это всё потому, что в JS поддержка эвент луп в коробке, это основа языка с самого начала. Но там нет тредов.
Ты можешь реализовать аналогичное поведение в питоне, просто делай create_task или call_soon.
>>2136782 >Тем, что ты не можешь запустить 5 cpu задач параллельно. Точнее, конечно можешь, только они будут выполняться дольше, чем 10 задач последовательно. Одинаково из-за GIL. На тредах ты в каком-нибудь PIL можешь получить рост за счёт того, что там реально работа делается внутри Си-функций, не блокирующих GIL. Соответственно ты больше ядер процессора используешь.
Но в реальном серверном приложении тебе это мало поможет, скорее всего у тебя будет много воркеров запущено, не один.
Оверхед от асинкио минимальный, меньше, чем оверхед от тредов. То есть когда тебе надо примитивный JSON выплюнуть, не требующий обращения к БД и т.п., то асинхронность не нужна и на синхронных последовательных вызовах можно больше производительность получить. Только делает ли твой сервер при этом что-то реально полезное?
>>2136785 >да await это вообще сахар, что в питоне что в жс Нет конечно, в JS принципиально меняет логику исполнения программы. Ты не сможешь просто так переписать код с await на код без await.
>>2136782 >Тем, что ты не можешь запустить 5 cpu задач параллельно Ты вообще не понимаешь что значит конкурентность и параллельность Никому и не нужно выполнять 5 cpu задач параллельно в питоне (а если нужно то они проебались с ЯПом). Их через треды запускают чтоб блин обычные задачи не блочились из-за них
>>2136792 Пчел, иди кури мануал. Изначально в жс асинхронка работала на коллбеках через макротаски, потом чтоб вылечить это говно запилили промисы, а уже поверх промисов ебанули async/await. Все что делает async это превращает синхронную функцию в функцию возвращающую промис, а await резолвит промис вот и все в пистоне async превращает функцию в асинхронный генератор а await "резолвит" результат Любой код через await переписывается через Promise.then().catch()
>>2136800 Просто вот перепиши на промисы без await такую функцию
async function func() { let res = 0; for (let i = 0; i < 100; i ++) { ____const value_1 = await foo_1(i); ____const value_2 = await foo_2(i); ____if (value_2 > value_1) { ________res += value_2 ____} else { ________res += value_1 * i; ____} } return res; } Ты просто прочитал в каком-то индусском мануале про синтаксический сахар, а сам не понял. Нет, ни разу не сахар.
>>2136829 А разве строка (9) во всех 100 итерациях будет вызвана не до того, как произойдёт присвоение в (7) и (8)? В (7) и (8) ты собираешь очередь на исполнения тел промисов, которые вызваны уже потом будут.
Вот какое решение предлагает бабель, упрощённый вариант задачи. На скрине.
И проще нельзя. Решение >>2136827 на первый взгляд смотрится рабочим, то это решение из подхода callback hell, как раньше делали. Точно так же можно без прописов, просто через setTimeout.
await невозможно реализовать просто. В питоне под await лежит активное использование механизма генераторов yield from, в версии 3.4 даже они явно использовались, но в 3.5 от этого отказались.
С помощью цепочки yield from реализовывается механизм event loop. Аналогично, насколько я понимаю, и в JS.
Разница в логике промисов и await принципиальная. Когда делаешь await, то тем самым у тебя несколько веток кода одновременно работают, попеременно переключаюсь друг в друга. Если делать коллбэки или промисы, которые тоже коллбеки, то тело коллбэка будет вызвано только после того, как верта, откуда был вызов, завершится. В одном случае параллельное исполнение, в другом случае последовательное, просто мы передаём контекст в последующие вызовы.
> И проще нельзя. Решение >>2136827 на первый взгляд смотрится рабочим, то это решение из подхода callback hell, как раньше делали. Точно так же можно без прописов, просто через setTimeout.
Так, падажи. Т.е. написать "сложный" код, который реализует ту же самую логику, но без async/await можно? Тогда async/await это и есть сахар, которые помогает писать код просто.
> Разница в логике промисов и await принципиальная. Когда делаешь await, то тем самым у тебя несколько веток кода одновременно работают, попеременно переключаюсь друг в друга. Если делать коллбэки или промисы, которые тоже коллбеки, то тело коллбэка будет вызвано только после того, как верта, откуда был вызов, завершится. В одном случае параллельное исполнение, в другом случае последовательное, просто мы передаём контекст в последующие вызовы.
Так, падажи №2. await в функции равносилен возврату из неё и ожиданию результата промиса. Вариант на чистых промисах тоже делает return там где находится await. В плане паралельности тут никакой разницы.
>>2136870 >Т.е. написать "сложный" код, который реализует ту же самую логику, но без async/await можно? Тогда async/await это и есть сахар, которые помогает писать код просто. Нельзя, ты меняешь логику программы. Если сваливаться в демогогию, то любой код можно на машине Тьюринга реализовать.
Решение >>2136827 меняет алгоритм решения, тут вообще переход от циклов к функциональному рекурсивному стилю. Это ни разу не сахар, это другое решение просто. Но да, иначе решать можно. А вариант >>2136829 мне кажется нерабочим в принципе.
> await в функции равносилен возврату из неё и ожиданию результата промиса. Нет, await полностью меняет рантайм. Сахар это объявление функции как async. Тогда ты пишешь async function, просто возвращаемое значение оборачивается в промис.
Но await нет. Ты ждёшь разрешения промиса в этой точке и получаешь его значение, после чего можешь продолжить исполнение функции. Без await это невозможно. Точнее возможно, но тебе надо реализоывать логику генераторов, причём во всей цепочке вызовов. Что и делает бабель.
Без await ты не можешь получить значение промиса, никак. Потому что тело промиса запустится только после того, как твоя ветвь исполнения завершит работу и умрёт. Потому что очередь обработки.
>>2137452 Есть очевидная разница. Компрехеншен генирирует новый список из чего-либо, это суть map. Цикл это просто повторящиейся действия, они могут что угодно делать.
>>2137452 >А когда делаю это в одну строку mass = [item for item in itemMas] Так тебе нужен какой-то исходник(itemMas), без него ты не сможешь список создать.
В цикле тебе не нужны сторонние объекты, ты заполняешь массив по своему усмотрению.
>>2136917 >Без await ты не можешь получить значение промиса, никак Все с тобой ясно, наркоман, иди на мдн открой описание промисов. То, что выше пример безе await это, конечно, другое, не считается и вообще другая логика, ага.
В питоне можно сделать интерфейс в тайп хинтинге как в ГО? Условно, есть либа Foo, которую сейчас изменять нельзя, в ней есть некоторый класс Bar. Я хочу написать другой класс-интерфейс, в котором описывались бы некоторые методы, который реализует класс Bar, но при этом не наследует этот интерфейс и что бы pycharm при этом не ругался на это, если бы я указал этот интерфейс в аннотации, но в функцию/метод закинул бы Bar.
Двач, почитал и посмотрел несколько лекций по питону и вчера решился на свою первую маленькую программу. Что можешь сказать про код? Целый вечер его писал, но как же кайфово, когда пытаешься, делаешь ошибки и оно в конце концов начинает работать :3 https://pastebin.com/U3Js4Rb3
Анон, как сгруппировать список таким образом, чтобы нужные индексы элементов были вместе? Например, есть список: [1,1,2,3,1,5,1,4,1,2,2,6,1,5...] Надо последовательно сгруппировать индексы элементов, если сумма элементов меньше или равна, например, 10. Т.е. получить что-то вроде [[0,1,2,3,4],[5,6,7],[8,9,10],[11,12],[13,...]...]
>>2137637 Молодец. Вначале привыкни к синтаксису - поделай задачки как в школе на алгаритмы. Когда привыкнешь и у тебя есть какая-либо задача - вбиваешь ее в гугл/ютаб и смотришь есть ли решения или похожие решения. Адаптируешь под свои нужны. Если решений нет, гуглишь схожие темы/стаки оверфлоу/хабры или в конечном счете документацию.
На первых парах этого достаточно, а дальше ты сам поймешь уже, что именно тебе нужно подтянуть/изучить.
>>2137637 Слишком мелкоскрипт, нечего обсуждать. Навскидку, перемудрил с функциями. Достаточно гет, который вернет суп, и парс. Ну и извлекать лучше в словарь с говорящими ключами, а не в лист. Плюс забирать какой-то айди для проверки, новая ли это запись.
Хули этот пистон такой уебанский? Нужно переместить и перезаписать папку folder_a/folder_b/ в folder_a/ Пробую через shutil Если folder_a/folder_b уже существует, то эта хуйня перемещает в folder_b/ и получается folder_a/folder_b/folder_b.
>>2137650 Спасибо. Но, кажется, как только условие выполнится, все последующие индексы в свои отдельные подсписки добавляются. [[0, 1, 2, 3, 4], [5], [6], [7], [8], [9], [10], [11], [12], [13]]
Смотрите какой "хуйне" на курсах учат. Нужно было создать словарь из строки в одну строчку (но я еще в функцию обернул). Как бы никто не мешает решать через циклы и так далее, но в курсе все же предлагают решать все именно в одну строку.
Анон, напомни, пожалуйста, если идти по циклу, извлекая отдновременно элемент и следующий элемент, то при достижении последнего элемента в списке будет ошибка (потому что элемент+1 не существует) или питон обрабатывает подобное?
Можно ли с джангой реализовать динамическую подгрузку данных? У меня нет моделей, данные тяну по апи из OLAP, в пандасе их обрабатываю под нужны, генерю хтмл и отдаю в браузер. Иногда там бывают таблицы по паре тыщ строк, хочу чтоб сначала грузилось 100, а остальное по мере прокрутки.
Всем привет.Нужно сделать сайт на Django.Сайт про походы.На главной странице-интерактивный календарь.Даты ближайших походов выделены,цветом,например.Когда пользователь наводит курсор на такую дату,выпадает небольшое окно с информацией о походе.Если пользователь нажимает на дату,его перенаправляет на страницу похода.Я имею общее представление о маршрутах,представлениях,базе данных,html и css,но я не понимаю как сделать такой календарь.Буду благодарен,если кто-нибудь подскажет,хотя бы в двух словах,ну,или укажет,что именно из документации Django мне нужно изучить.Заранее спасибо.
Как создаются элементы на главной странице? Например, в интернет магазине есть товары на главной странице, как их туда добавляют? Отдельная таблица для главной страницы? Пускай она для всех пользователей будет одинакова.
>>2138350 Неправильно сформулировал. Не условия,а одна из его частей. В данном случае len(z). Лучше его определить в переменную y и само условия записать как x < y.
>>2138352 Если оно не изменяется в процессе цикла то лучше. Но в случае с len это не нужно, так как для стандартных типов оно константное. Питон записывает его в отдельную ячейку в памяти для каждого такого объекта и изменяет ее когда нужно.
>>2138351 Зачем тебе отдельная? Сделай выборку из существующих. На какие параметры завязываться сам думай. Можешь по цене выдавать ,количеству просмотров и тд.
>>2138449 Это зависит от того, насколько тяжелая там будет операция, вполне может быть, что там лишние 500 мс будут высчитываться каждый раз в определенных случаях
Что можно исправить? Вообще результат выдает верный, но мне кажется, что написано криво и сам алгоритм не верный. Или по алгоритму я и должен в конце получать ДВА значения и сравнивать между собой? Тем более вне цикла!
>>2138572 Грубо говоря, я ищу подстроки в строке - т.е. мне нужны индексы. Но поскольку 1 подстрока в строке может встречаться N раз, а мне нужны только самые первые, есть идея после нахождения подстроки, просто срезать кусок и искать что нужно дальше. Но индексы в таком случае будут новые. Можно попробовать вот так >>2138560 Или брать верхний индекс найденной подстроки "e", делать срез, а к индексам новым прибавлять "e".
Раньше работал с джангой 1.11/ 2.1. Сейчас что-то везде стали хотеть её, а я думал она нахуй умерла. Есть где гайды быстро посмотреть что поменялось и в целом освежить знания? Только не надо официальный туториал или док, они пиздец какие водянистые. Просто без примеров короткое описание
>>2138532 Алгоритм формально верный, но в такой реализации малоосмысленный. Если N у тебя настолько мало, что можно последовательно вычислить значения f(x) на всех выбранных точках интервала, как ты это делаешь, определяя dotYmass, то к концу вычислений минимум уже у тебя в руках:
Соль метода в том, чтобы вычислять f(x) только по мере надобности и в определенных точках (в точках dotXmass[c], dotXmass[d] в твоих обозначениях). К тому же, в конструкциях типа dotXmass = dotXmass[a:b], dotYmass = dotYmass[a:b] у тебя каждый раз тратится время на инициализацию нового среза.
Поизучал джанго. Самая сложная штука в дж это мтв ака мвс. Посмотрел чужие гиты проекты там, больше всего кода в этих контроллерах. Так вот. Если с cbf я еще разобрался, то почему то cbv кажется сложным. Хотя ооп знаю. Говорят что юзать cbv проще и читабельней. Подскажите где можно почитать про cbv, может есть читы или шпаргалки по теме, про оф доки знаю. Пытаюсь вот видео на ютабе смотреть для понимания дзена вьюшек на классах.
Хочу сделать обёртку для функции requests.post которая передаёт все аргументы но возвращает объект json (если есть конечно) Проблема в том что post принимает как именованные аргументы так и нет requests.post(url = 'https://google.com') тоже самое что и requests.post('https://google.com')
Моя обёртка (1) ЭТА ХУЙНЯ ПОЛНАЯ, сам понимаю Подскажи анон, как мне адекватно передавать аргументы из функции обёртки в функцию конфетку?