Это копия, сохраненная 16 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий: >>1780956 (OP)
Литература:
https://ln2.sync.com/dl/cf2c1d070#xq4s328t-xbbjys2z-9r6j7ss7-gf4e9dv6 <-- Книжки, новое собрание
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem
Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить
https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться
#######################################
ЧаВо: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat Актуальность примерно 2015 года
Вопросы-ответы:
— А стоит ли читать Лутца, том номер N?
Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.
— Стоит ли читать %книга_нейм%, если там питон версии 2.х?
Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х
— А что ещё можно читать?
Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html
— Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0
— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4[РАСКРЫТЬ]
— А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.
— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
— Можно ли на питоне делать мобильные приложения?
Да, смотри на фреймворк Kivy https://en.wikipedia.org/wiki/Kivy_(framework) https://kivy.readthedocs.io но народ на него жалуется
— Как можно без лишней возни ускорить программу на питоне
1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь.
2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём
Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником.
https://dumpz.org/bASGKD8cCFDf
пидорское видео на английском с бесполезным историческим погружением когда замените на нормальное руководство по асинкам?
Я хер знает куда вопрос задать, бываю тут раз в год, поэтому наверное спрошу тут.
Кто нибудь вообще ебался с РеКапчей? Я пишу бота на Питоне для одной веб-игрухи, и столкнулся с тем, что меня обоссала обычная Рекапча.
Про сервисы для решения капч со своим апи я знаю, но мне захотелось написать на питоне собственный ReCaptcha виджет, в котором я смогу искать автобусы, то бишь аналог JS виджета для капчи от гугла, но на питоне.
При решении этой странной проблемы, я столкнулся с тем, что апи рекапчи странное, по крайней мере для меня.
Смог экспериментальным путём в chrome dev tools выяснить, что нужные мне URL это
https://www.google.com/recaptcha/api2/anchor
https://www.google.com/recaptcha/api2/reload
https://www.google.com/recaptcha/api2/userverify
Если с /anchor ещё понятно, там находится ключ нужный для /reload, то с /reload и /userverify не понятно, что именно туда нужно слать
Как я понял, в /reload передаются какие то данные о странице, что бы таким образом вычислять ботов. Что именно туда идёт? Можно ли это реализовать самому?
Так же не совсем понятно, что ещё должно идти в /userverify, так как именно он возвращается g-recaptcha-response, нужный что бы послать капчу нахуй.
На пикрил мой результат исследования аргументов этого апи, что такое response и остальные аргументы помеченные '?' я так и не понял.
Буду дичайше благодарен, если скините какие нибудь статьи с разбором этой злоебучей капчи, и может ещё какого полезного материала, что бы реализовать свой рекапча v2 клиент на питоне.
Лучше не лезь туда без опыта, соснешь.
Сама рекапча это виртуальная машина, там какая-то хуйня крутится. Точно проверяются мышковые ивенты и история айпи - если он слишком запален или много раз подряд решает - то будет усложняться и насыпать ещё, много перепроверок для одного решения и т.д.
Короче, наебешься знатно, а хорошего решения не получишь. Хорошее решение рекапчи - обезьянки-решатели.
Нужно написать функцию которая будет переносить строку если та превышает лимит в 40 символов.Левая часть должна быть с разбиением. Тогда, когда это возможно, каждая следующая строка должна начинаться с начала очередного слова. То есть первоначально мы получаем длину первого слова. Если эта длина свыше лимита, значит, обрезаем всередине, следующую строку начинаем с второй части слова. Если эта длина до лимита, значит, ищем тот символ, который последний до лимита, находим начало слова, частью которого является этот символ, и обрезаем от первого символа слова. Дальше повторяем это до тех пор, пока не получим самую последнюю строчку.Собственно в данный момент у меня есть вот такая часть кода, но не понимаю как ее дописать чтоб она выполняла вышеописанное задание.
def format_item(left, right):
content = []
while left:
current = left[:left_limit]
left = left[left_limit:]
if left[0] == " ":
content.append(current)
continue
words = left.split(" ")
if len(words) == 1:
content.append(current)
continue
before_last_space = " ".join(words[:-1])
content.append(before_last_space)
left = left[before_last_space:]
>Лучше не лезь туда без опыта, соснешь.
Но опыт же где то набирать надо.
>Короче, наебешься знатно, а хорошего решения не получишь. Хорошее решение рекапчи - обезьянки-решатели.
Мне надо не решать её, а просто сделать РеКапча Виджет на Питоне, что бы решать её из своего приложения, а не из браузера.
Видимо придётся по красноглазить недельку другую, раз уж мне единственному такая идея в голову сбрела..
Там не все помогли.Да и задание тут уже не с чеком.Входящими данными может быть любой текст, который должен переносится по лимиту символов.
>Там не все помогли
Вот же сволочи ленивые. Сейчас мы все исправим, братиш. Вот глянь сюда https://ideone.com/tSQeUv
Это заготовочка по переносу строк. Но надо чтобы ты точнее сформулировал правила переноса и что является серединой слова, потому что из тобою написанного ни черта не понятно что где обрезаем.
> раз уж мне единственному такая идея в голову сбрела..
Видел такую хуйню в какой-то качалке с файлопомоек, так они сделали экстеншен для браузера под рекапчу. Наверное, как раз чтобы не ебаться с жабаскриптом.
Ну смотри, по логике моего препода у нас есть какая-то строка.Эта функция считает количество символов, и если оно не превышает лимита то записываем полностью всю строку.Если заканчивается пробелом, то записываем до последнего пробела, а переносим уже все что после последнего пробела.В общем обрезаем по пробелу, и такого пункта как "середина слова" нет.
Просто проверяешь if и кидаешь ошибку, если не те данные на входе https://stackoverflow.com/questions/2052390/manually-raising-throwing-an-exception-in-python
Ты ленивый и тупой чёрт, за которого уже всё сделали и надо только марафет чуть-чуть навести.
Анон, какого хуя ты ему помогаешь? Пусть сам разбирается.
>hyper
выяснил что это тотальное говно.
мне просто нужно было воспроизвести ситуацию и она более-менее воспроизвелась в curl.
Оказывается, несмотря на отсутствие ограничений на размер URL в HTTP, на практике их дохуя в разных программах и в hyper тоже.
Как-то так: https://ideone.com/GKrsr7
>>787591
Всё что смог придумать:
def f(a=None, b=None, kwargs):
assert len(kwargs) == 0, 'Чот хуйню подсунули'
aiohttp смотри, Client который.
def my_func(a = None, b = None):
if isinstance(a, int) and isinstance(b, str):
return ab
другого варианта проверки типа нет, это Питон. Т.е. для аннотации еще можно сделать так
def my_func(a:int = None, b:str= None) -> str:
return ab
Но это чисто аннотация, подсказка. Если нужна реальная проверка типа в проде, а не при unittest
assert isinstance(a*b, str) == True (мог тут объебаться)
Мне не тип надо. Есть функция. Если её вызвать без аргумента или с аргументом "withBackUp", то она должна выполниться, делая бекап файла перед выполнением. Если же аргумент "withoutBackUp" - бекап не делать. Хочу сделать чтобы на любые другие аргументы была ошибка.
Блин, я так и делал, но у меня ВЫДАВАЛО ОШИБКУ)))))))). На самом деле он выдавал не ту ошибку. Теперь всё работает. Спасибо.
А если параметр hui, то чтобы вычислял длинну хуя.
Делаешь один дефолтный параметр backup=False, можно его кейвордом передать, всё.
Спасибо большое доброанон.Добра тебе.
def my_func(backup = False):
if not backup:
print('passing')
elif backup:
if isinstance(backup, bool):
print('proceed to backup')
else:
print('Umadbruh?')
my_func('gvido')
my_func(True)
Я бы оставил проверку, банально для защиты функции.
>else:
>print('Umadbruh?')
Няш, ну я не такой даун, чтобы про else/if спрашивать. Мне нужно чтобы интерпретатор слал нахуй, а не printом ругаться.
Существует 2 области на сайте, пользователь перетаскивает объект с одной области в другую. Что-то вроде kaiten'a.
дякую боже шо я юзаю гитхаб без гита
Ну ок, правда читал в антипаттернах проблему Uber, когда была дырка в HTML шаблонах, и можно было инъекцию сделать в бэке в базу.
Приложение Vue можно на NodeJS запускать вообще отдельно.
>Приложение Vue можно на NodeJS запускать вообще отдельно.
Ну это дополнительные проблемы добавляются, а писать хуйню тоже не хочется. Тогда такую страницу не стоит клепать для резюме?
Для резюме делай конечно. Чем больше покажешь тем лучше.
Какие проблемы? Команда фронтэнда занимается своим куском, ты своим.
>Какие проблемы?
Я бы спокойно бэк прописал. Представил бы все задачи как элементы в списке либо словаре, и прописал бы отдельно функции... Но все это дрочиво с фронтом. Стоит ли это все вылизывать?
Фронт на клиенте все отрабатывает, а тут у тебя только бэк занят.
Ну и фуллстак пихон + JS курсы все с vue/react/angular. Шаблонизаторы это не про оптимизацию.
Никаких. Что с книжкой, что без на работу тебя не возьмут один хуй.
С таким подходом ты выучишь очень поверхностно, будешь как шаман делать обряды, не зная как оно на самом деле работает.
Любой вопрос на собесе в сторону - и тоби пизда.
Я начал с бэков, теперь хочется в ML двигаться. Там и вилка лучше, намного лучше. Да и удаленок больше.
Курсов и книг сейчас дофига.
Понимаю что джун пайтон удаленка сейчас оочень трудно найти, но думаю не смогу быстро пересесть на ML и вкатиться.
Аноны, поясните тупому, недавно вкатился, хочу написать одну хуйню с помощью Python Ping. Но то ли у меня с английским хуже чем я думал, то ли в основах питона я еще не совсем разобрался. Вот часть из этой ссылки под заголовком "Working with the return values". Там сказано, что ping возвращает некий респонс лист. А как его достать, чтобы дальше в рамках проги с ним работать? Переменной просто нельзя присвоить этот респонс лист. В консоли-то оно работает, но мне нужно достать собсна сами цифры пинга и потом с ними всякую хуйню творить, считать среднее за много запросов, строить графики и т.д.
В гугле все в основном просто проверяют отвечает ли сервер на пинг, т.е. им тру/фолс достаточно, либо делают как-то сложно через сабпроцессы и т.д.
Лол, забавно бывает, стоит спросить где-то и потом к тебе приходит решение, над которым ты 4 часа бился и тупил, я такой слепой.
академический паттерн декоратор оборачивает и вклинивается в доступ к оборачиваемому элементу
а питоновский декоратор делает все на свете, а не только враппер над функцией
cron или while True:. В переменной складываешь последнее время сработает через timestamp, чекаешь время и выполняешь задачи, обновляешь переменную.
Garbage Collector все за тебя делает. Что хранить? Зачем? Откуда утечка?
Какая была проблема и какое решение? Никто не будет читать твои простыни же, бро.
>пример
Проблема: Нужно запилить пинг для пары серваков и оформить в ХМЛ репорт
Спасибо, уже сделал через time.sleep
while True:
print ('Enter the name of contact ' + str (len (contact_names) + 1) + ' or nothing for result.')
name = input ()
if name != '':
contact_names = contact_names + [name]
continue
if contact_names == []:
print ('No names!')
continue
else:
break
print ('Contact names is: ', end = '')
for i in range (len (contact_names)):
if len (contact_names) == 1:
print (contact_names [0] + '.')
break
print (contact_names , end = ', ')
if i == len (contact_names) - 2:
print (contact_names [-1] + '.')
break
Прошу подсказать решение: есть скрипт архивирования файлов, он считывает необходимый путь, ищет необходимые файлы, а как приходит момент АРХИВИРОВАНИЯ, то все.
Архивирование выполняю через os.system 7z.exe, содержание не работающей части следующее:
os.chdir(f'{path_set}')
for i in все_мои_нужные_файлы
os.system(f'{command}')
В command записаны все необходимые атрибуты (7z a -t7z -ssw -mx5 -r0 'zip_name' 'file_name').
Писал скрипт для использования на работе, дома все прекрасно работает, как пришел на место - вылезают ошибки
error: 7zip cannot open file ... Отказано в доступе.
Попробовал запустить паковку каждого файла вручную через командную строку, оно работает только в случае запуска cmd от имени администратора.
Могу ли я какой-то os командой присвоить всем моим os.system запуск от имени администратора? И очень не хотелось бы каждый раз тыкать YES на каждый ее запуск, так как нужно заархивить более 2000 циклов
List append() как минимум.
If len(contact_names) == 0:
print...
for name in contact_names
Почитай доки пожалуйста. Говнокод у тебя. Чтобы было наглядно раздели на функции. А так макарон на одна большая. Сам же запутаешься.
Ищи пакет elevate
Да, на месте пользования не стоит python, поэтому запускаю через сгенереный дома exe файл, возможности просто запустить cmd от админа и ввести python my_file.py нет
Так собери манифест или запусти exe от админа. Elevate в случае шиндоуса 50/50
ой пиздец пиздец, ты каких то методов понабрался и воротишь просто ёбаныйрот... Наверни ещё курсов.
Зачем сюда что-то постить, если ты учишь питон 5 дней?! Очевидно, что всем похуй.
Это же элементарно. На борде любой может выложить говна на всеобщее обозрение и каждый мимокрок его занюхнёт. Ты просто оказался этим мимокроком.
Ничего. Никак.
Был опыт с прошлых мест работы, все. На вопрос "пилили пет-проекты?" ответил, что нет, я вне работы этой хуйней не занимаюсь.
а то почитал про всякие паковщики для винды - там ебаная муть, мне пока лень разбираться
Google Photo
Чем запуск скрипта с рядом лежащим окружением на повершелле отличается от батника?
Powershell не для запуска скрипта из окружения. Просто берешь и без задней мысли переписываешь скрипт на powershell. И ни питон, ни окружение не нужны.
https://refactoring.guru/ru/design-patterns/decorator/python/example#example-0--main-py
ну вот пример академического паттерна, отличие в том что питоновский декоратор может менять поведение объехта, так как всё объекты, а академический паттерн общий шаблон?
ПАТТЕРН декоратор - он про оборачивание
декоратор питона не про оборачивание. Он волен делать все что угодно. И делает
немного примеров.
1 декоратор @dataclass ничего не оборачивает, а дописывает класс
2 декораторы роутеров во всяких вебфреймворках типа @router.get региструют функцию в системе роутов
3 декоратор @abstractmethod просто вешает флаг на объект метода и всё
так что питоновский декоратор не имеет ничего общего с паттерном "декоратор". Ну разве что он может создать обертку (как частный случай)
анальными ограничениями с политикой запуска.
В общем в декоратор передается декорируемый объект и что вернет декоратор - то и попадет в пространство имен. А декоратор внутри себя может сделать что хочет и вернуть что хочет. В декоратор может уйти функция, а вернется int и будет у тебя int переменная в итоге.
Бесполезно, но главное суть
return os.rename('.mp4', url[-10:]+'.mp4')
Как мне прописать нормальное регулярное выражение в '.mp4' и не качать лишние модули. Так и не понял просто как регулярки в самом питоне работают
В питоне регулярки не часть языка, они сидят в искаробочной либе re.
Тебе надо ренейм вызвать для всех файлов, заканчивающихся на mp4?
Ренейм же вроде один файл/директорию переименовывает, нет? Мне лень смотреть.
В цикле наиграй список файлов, проверь что заканчивается на mp4 через какой-нибудь endswith или регуляркой типа .*\.mp4$, потом ренейм.
Либо я не понял что-то.
Я хочу удалять файл после переименования, просто я скачиваю его и мне нужно знать точное название из его url, поэтому я хочу просто использовать регулярнку на 1 файл, кто-нибудь может мне подсказать что мне нужно запихнуть в '.mp4', я не понимаю, ибо r'.mp4$' не работает
str = re.sub(r'regex', 'replace', str)
return os.rename(glob.glob("*.mp4")[0], url[-10:]+'.mp4')
а, точно, вот я слоупок
Почему мне его постоянно показывает Яндекс?
почему нет?
имею ввиду что java/net не имеет подобного механизма
>в реализациях Jython (java) и IronPython (С#) нет GIL потому что они созданы поверх других VM?
Да, но это заброшенное говно мамонта, которое контрибьютит 2.5 компании
согласен, меня больше интересует краткая информация как допустим реализована многопоточность без GIL, хотя я только ща сформулировал свой вопрос который меня интересовал, пойду гуглить, хотя если кто-то бросит инфу типо таблицу сравнения мб, буду благодарен
Ты ещё и токс.. Пиздуй на курсы
>многопоточность без GIL
Для начала там GC работает по иному принципу, а не по инкременту/декременту счетчика ссылок
В ЖС тоже многопоточности как таковой нет, но асинхронка там тащит
есть ссылочки почитать?
Можно, экономишь байты. Потом правда можешь запутаться
нашёл себе норм материал покрывающий большую часть моих вопросов о gil, linux, потоках, сравнениях, на скорости х2 зоебис идет
https://www.youtube.com/watch?v=AWX4JnAnjBE
Базовые макакские операции:
работа с консолью - создание/менеджмент юзеров, обычные sql-query
работа с pgadmin
понимание индексов, constraints и возможно views
https://fintech.tinkoff.ru/study/fintech_middle/sre_in_it/
Все есть в оф документации (кроме pgadmin возможно), даже pdf скачать можно
Ну немного с ванильным ЖСом знаком + на Vue с каким-нибудь Vuetify в принципе смогу сверстать сайт, просто не подумал что стоит указать к питон-скилам.
>+Postgres
Основное же в принципе как в MySQL кроме наворотов постгреса, но спасибо, подучу тогда еще
>asyncio
Не о чем. Это фреймворк-каркас. Асинхронка строится поверх него. Лучше указывать aiohttp, tornado или fastapi
ну да. я про то что нужно указать чистое асинкиошное типа "подвержен современным веяниям", а не "люблю динозавров"
потому не торнадо, но фастапи
там отборочные завтра заканчиваются
> есть у вас техническая вышка
Ну, я начал работать когда остался в компании после практики на третьем курсе. Так что тут ответить даже не знаю как, нужна не нужна вышка. По тому что я смотрел и знаю, питон самый доступный (ну, может второй после JS) для вката без вышки. Правда большинство компаний все равно страхуются, непонятно зачем, и берут только людей с вышкой. Поэтому все равно стоит внимательно следить за вакансиями, ну и потому что язык хайпует, то часто это выливается в какие-то крутые ХАКА-МАРА-ФОНО-ТОНЫ с отбором в виде череды тестовых заданий где "20 лучшим предложат работу в такой-то компании".
Я магистр по радиотехнике из питерского Политеха. И что? По специальности я мог лишь перекатываться в байтоебство на МК и ПЛИСинах (причем учил я по большей степени это все сам, таких пар у нас не было)
Из курса универа конкретно мне помогли лишь пары товарища Синепола про сети, все остальное я учил сам
а я магистр йоба
Ага и смотрю удаленку бэкэнда питона: flask/django. Хочешь эджи стайл - ML. Короче это как RoR, поезд ушел. Java/Go на какое-то время займет умы погонщиков. Пока не будет нормального ORM с асинхронкой остаётся только DRF и CRUD пилить.
Облизнулся на GraphQL, но какая-то непонятная херня, опять же привязка только к SQLAlchemy, а там асинхронкой и не пахнет.
Остаётся только надеяться и двигаться в сторону ML.
сменить язык будет легко
>SQLAlchemy, а там асинхронкой и не пахнет
Ниче что в алхимии можно спокойно поставить движок вроде aiopg и будет тебе асинхронка? Ты peewee для этого не обязан накатывать
sa.select([sa.func.array_agg(work_table.c.threadid)]).select_from \
(work_table.join(session_table,
sa.and_(session_table.c.visitsessionid == work_table.c.visitsessionid,
sa.or_(session_table.c.ip == self.address,
work_table.c.visitorid == self.visitor_id))))
Вроде вижу, что происходит selec-запрос который вытаскивает данные из таблицы получавшейся в следствие join-a 2х таблиц: work_table и session_table, но че это за ебень с условиями and_ и or_ внутри join-a? И че за функция (array_agg) внутри select?
Не в обиду мейнтейнерам, но это только 1 коннектор. Если есть легаси на MySQL или просто решили использовать MariaDB/Percona, то уже все сложнее.
PG видимо https://postgrespro.ru/docs/postgresql/9.6/functions-aggregate. Модели есть? Тогда понятнее будут связи.
На edx бесплатные курсы же есть, знание ангельского обязательно.
Тебе все равно никто про все возможные подводные камни не расскажет. Такого в принципе не может быть, сам шишки набиваешь или смотришь кто уже набил их на SO.
А при чем тут yaml? Это markup language как xml/toml. Отвратительный, но его рэдхат толкает.
>На edx бесплатные курсы же есть, знание ангельского обязательно.
Я пробовал кучу курсов уже, хуй знает, не идет без тутора. Я наверное тупой просто.
>А при чем тут yaml?
А вот тут не ебу, такой стек.
Да не суть какие модели даже на самом деле, не въезжаю зачем там and_ и or_ внутри join для начала
все какие то особые спец курсы ищут
я вот начинал с https://pythonworld.ru/samouchitel-python
ну и про модули разные читал что есть в коробке
остальное догналось в практике и чтением SO
Да я собсна спрашивал не про пользу знаний из вуза, а про корку. А то я приду со своим юрфаковским бакалавриатом на собес, и меня даже спрашивать по технической части не станут, этого опасаюсь. У меня просто маленькая мухосрань, поэтому я не могу как в москве или питере ходить по миллиону собесов так сказать из спортивного интереса, и переезжать в ближайшие пару лет не варик.
upd Ну я понимаю, что можно создать переменную окружения на моем компе, и использовать ее в коде. Но тогда у других людей на компе она не запустится, и в чем тогда преимущество перед просто вбитием своих данных в код ручками? Или можно просто в отдельном файле создать словарь с логином и паролем, будет почти тот же эффект, что и от осэнвирона.
Преимущество в том, что пароли не сливаются при передаче исходников, в т.ч. через гитхаб и подобное.
Это примерно как приватный ключ для ssh, у тебя всё работает и заебись.
т.е. преимуществ по сравнению с тем, что я например залью пассы в файлик, который потом на гитхаб не буду заливать и импортирую из него переменную пассворд нет?
Ну тут готовый механизм, а там файлик, ебля с gitignore, пояснения, что должен ещё быть файлик с таким-то форматом и т.д.
1. Тестовая среда.
2. Недообфускация, чтобы ты в коде случайно не оставил личные данные при заливке на GitHub.
По-хорошему надо в хэш перегонять и в конфигурации по типу toml/yaml/ini писать.
http://insecurety.net/password-algorithms-skype-windows/
Хотя он и так в таком виде хранится.
if string == "" or string == "\n" or not string.startswith("#") and len(string.rstrip()) > 33:
Очевидно проверяет наличие пустых строк и строк длиннее 32 символов, которые не начинаются на "#".
Вопрос: Как это написать не так громоздко и более читаемо?
Без матча будет None, так что можно проверять.
Близко, но не то. Посмотри внимательнее условия:
Пустая строка даёт True
Строка длиннее 32 символов И не начинающаяся с # даёт True
Строка длиннее 32 символов И начинающаяся с # даёт False
Твоё регулярное выражение в последних двух случаях выдаст True.
это пучарм, если вдруг что
Вообще-то # с длинной никак не связан в оригинальном выражении. Чтобы был связан, там нужны скобки.
Ты уверен? Я протестил сейчас и всё как я сказал. Поставил скобки для наглядности.
Отлично, спасибо. Эх и ебля с регулярными выражениями.
Чето я не понял. Как вот это условие реализовано:
Строка длиннее 32 символов И начинающаяся с # даёт False
У тебя регулярка же говорит:
1. Начинаемся с # и потом больше одного любого символа
ИЛИ
2. от 1 до 33 любых символа до конца строки
Хватить меня путать, лол.
Если начинается с #, то ограничения на длинну нет. Так это работает в оригинальной строчке и в этой регулярке.
=.="
Я про хранение credentials в целом, бро.
Я думал это только с False прокает. Что ещё считается not? 0, False, None.
Все что пусто - то False
https://docs.python.org/3/library/stdtypes.html#truth-value-testing
Да и в любом классе можно определить __bool__ и оно будет работать в булевом контексте как надо.
Как мне логировать инфу/дебаг в один файл, а ошибки - во второй?
логгинг в питоне какой то базовый "все пишут в 1 файл"
если нужно в больше то нужно мудрить
какие то конфиги, какие то фильтры. брррр.
мне больше нравится подход NLog из шарпов
где объявляешь список таргетов которые могут быть получателями логов
а потом пишешь правила какие логгеры -> таргеты->(левелы)
захотел собрать все варнинги - создал таргет файловый варн.тхт и создаешь правило
<logger name="" minlevel="Warn" writeTo="warnfile" />
А если только одной секции то
<logger name="loggername." minlevel="Warn" writeTo="warnfile" />
удобно. а в питоне жуть какая то
лично для себя (для пет проектов) я создал примитивное подобие такого
Ну это звучит очень разумно, да
хочешь научиться языку решай литкод/хаккерранк
Ну в твоей задаче проще создать пару хендлеров
https://stackoverflow.com/questions/18911737/using-python-logging-module-to-info-messages-to-one-file-and-err-to-another-file
Даже в этом решении нет полного разделения. Те логи, что уровня WARNING, энивей попадают в дебаг. Дурацкая иерархия.
ну обычно разделяют по minlevel. ведь эти файлы потом еще и читать нужно
> Те логи, что уровня WARNING, энивей попадают в дебаг.
ну так создайте наследника от нужного хендлера и перегрузите метод filter где и решайте подходят ли данные записи для этого хендлера
Как вывести id в html?
какая разница на чем основной, если представленный кусок требует знания жс. а не питона
for i in s:
....print(False)
else:
....print(True)
почему выводит True?
и 2 вопрос: почему некоторые щитают что конструктор в питоне это __init__, а другие __new__?
там их кста дахуа, и подсветкой и без, и надстройки над основным логгингом
https://github.com/search?l=Python&q=python+logging&type=Repositories
но я читал шо нужно всё равно уметь пользоваться из стандартной либы, опять же от задачи зависит
>почему выводит True?
А что он должен по-твоему выводить, если у тебя пустой сет?
>Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the iterable (with for) or when the condition becomes false (with while)
else для for срабатывает, если не было break вроде.
Довольно ебанутая и неочевидная конструкция.
а понял, туплю
Не совсем понял, ты же можешь создать пул хэндлеров и просто ротировать их путем оверлоада выбирая тип лога .debug, .warning и так далее. Не вариант?
Поясняю подробнее идею.
Хендлер (он же таргет) просто знает как записать лог сообщение куда он там пишет. Конечно может иметь фильтр "минлевел" но он не нужен.
логгеры в системе не один логгер, а именованные логгеры. Причем иерархические имена. Например "server.core", "server.api"
логгеры генерят сообщения. таргеты знают как их записать. Нужно связать первое со вторым.
И пишутся правила где я перенаправляю "сообщения от таких то логеров такого левела пусть идут в такие то таргеты"
что это дает? Это дает возможность направить все или часть куда нам нужно. Например
- собрать варн и еггог со всей системы в файл error.txt (или 2 файла). Сразу зашел и видишь файл пуст и радуешься
- направить сообщения с какой то подсистемы в отдельный файл. Мне удобно когда каждая подсистема в свои файлы пишет. А потом вьюер если нужно свяжет
- server.api пишет в файл и левел дебаг, но я не хочу видеть server.api.internal (он дохера мусорит) - перенаправляю server.api.internal в blackhole и лог будет чище
ну или для server.api.internal писать только INFO
Nlog следит за конфигом и можно это сделать без перезагрузки приложения.
когда хендлер и его уровень гвоздями прибит к логгеру - это сильно мешает
можно конечно использовать хак для getLogger(name) где если server.api.internal то ему хендлер который пишет в тот же файл но фильтр INFO
но это и будет то же самое. Просто выраженное в коде, а не на уровне конфига "сообщения вот от этого логгера направь отдельно вон туда учитывая минлевел"
добавить звездочку и конфиг и вот и получится то, что я описываю
Опа, знаю твое задание, тянка делает его же)))
Ты можешь указать root logger. Параметр propagate
class logging.Logger
propagate
If this attribute evaluates to true, events logged to this logger will be passed to the handlers of higher level (ancestor) loggers, in addition to any handlers attached to this logger. Messages are passed directly to the ancestor loggers’ handlers - neither the level nor filters of the ancestor loggers in question are considered.
If this evaluates to false, logging messages are not passed to the handlers of ancestor loggers.
The constructor sets this attribute to True.
Note If you attach a handler to a logger and one or more of its ancestors, it may emit the same record multiple times. In general, you should not need to attach a handler to more than one logger - if you just attach it to the appropriate logger which is highest in the logger hierarchy, then it will see all events logged by all descendant loggers, provided that their propagate setting is left set to True. A common scenario is to attach handlers only to the root logger, and to let propagation take care of the rest.
IntelliSense и PyLance включи.
ну ты же можешь сделать override методов, только тебе придется каждый раз делать операцию по добавлению хэндлера и его удалению
def warn(msg):
logger.addHandler(self.warn_handler)
logger.warning(msg)
logger.removeHandler(self.warn_handler)
ты почему то все время смотришь на уровень сообщения
А я говорю про направление потоков сообщений основанных на "кто сказал + уровень"
образно говоря есть такие подходы
1 ты заводишь несколько настроенных логгеров (с настроенными хендлерами), а в коде выбирается нужный и используется
2 Каждая подсистема "кричит от своего имени". И есть код, который слушает и разруливает кого куда писать.
В первом случае если нужно извернутся то придется писать кастомные хендлеры с фильтрацией + еще в сам код проекта лезть чтобы в каком то месте изменить вызываемое имя логгера (а иначе как его отличить от других). А во втором такой универсальный перенаправлятор уже готов, все в конфиге, код не трогаешь
Все, дошло. Если это был модуль A, отрази логи в файле error.log, если ошибка в модуле B, то отрази в логе b_error.log.
Тогда есть резон использовать fluentd и уже на его основе правил распределять потоки логов.
Где-то видел на гитхабе кастомные реализации логгера. На самом деле в Питоне пакет давно уже не менялся, и асинхронка была и сразу форматирование в JSON на лету и кастомные поля. Мне кажется крупные компании какие-то писали, я как-то просто дублировал логирование путем записи в файл и в БД. Только недавно начал натыкаться на нормальные инструменты.
>каждый раз делать операцию по добавлению хэндлера и его удалению
да нафиг надо. проще один раз сделать такой хендлер, который на основе заданных правил и имея на руках имя логгера и левел зарулит куда его нужно правилам, нежели играть в костыли с тому, что дает модуль logging с его "родительскими хендлерами)
>>790053
>Если это был модуль A, отрази логи в файле error.log
угу. образно модуль (и подмодуль и вообще что то логически свое, вплоть до "вообще каждый класс" (в шарпе именно так предлагается) имеет свой канал куда и мусорит. А далее уже разбираются
Кстати это сходно с идеей "12 чего то там" где логи срут в stdout и дальше система парсит эти логи и распределяет.
Как по мне это 2 стороны одного яйца.
в шарпе еще есть пакет диагностик, который так и построен - каждый модуль может завести свой канал, на который можно настроить слушателей. Ну и у канала флаг "слушают ли его" для перфоманса. Ну и левела нет. чай не логинг а диагностика
>fluentd и уже на его основе правил распределять потоки логов.
ну это уже тонкости. главное концепт. почему то все всегда выбирают первый вариант и приходится немного, но лепит лисапеды что позволительно в пет проектах, но не в работе же
>почему то все всегда выбирают первый вариант
это я про логгеры в разных языках. Вроде бы простая концепция с доп уровнем правил "кого куда". но такая редкость.
Только шарп компилируемый и для них другие требования по предоставлению информации диагностической. Та же Java напримерм начинает более полный traceback показывать и т.п.
>в работе
Зависит от того, кто потом логи читает. Так уж лучше в единое хранилище ELK запихнуть, не? Главное доказать, что оверхед если и будет, то он окупаемый за счет, того что даже макака сможет прочитать информацию и понять, где началась жопа.
>Только шарп компилируемый
это не играет роли. просто логирование это одно. а диагностика это другое. сложно понять разницу. логироание это больше про "что делали", а диагностика больше про метрики
>Зависит от того, кто потом логи читает
вообще то от того кто пишет код. вот модуль питона не дает свободы. вот выше написали бери loguru. так и там та же фигня - логгеру добавляется слушатель напрямую.
>Главное доказать, что оверхед если и будет
ну я не вижу проблем с файлами. все эти внешние логеры хороши, кода нужно в одном месте собирать логи отовсюду. А просто слать данные внешне когда файлов хватает...
зы: я уже потерял нить беседы )
JSON в файле и JSON в какой нибудь NoSQL БД разные вещи. Отказал внешний сервис - читай файлы, а для аналитики фильтруй, строй графики. не?
я тебя не понимаю. складывать во внешний сервис да по сети еще нужно тогда, когда в этом есть смысл.
Иначе это реально оверхед на ровном месте. А файлам то чего отказывать. Хотя конечно однопоточная природа питона может влиять - у нас может быть 20 воркеров процессов и какать в 1 файл затруднительно.
Ну еще может быть смысл если утебя есть инструментарий для работы с логами где то, а для файлов нужного тебе нет, а прям вот очень надо чего то там анализировать и графики строить.
<div class='a'>
a
<div class='b'>b</div>
</div>
В данном случаи, при выборе класса а, в soup.text было только а
1. можно сделать без исключения. Мне надо достать условно говоря а, но при использовании .text, подтягивается еще и b
2. сайт выдает уебанский html, и все в таком виде, ничего с этим поделать не могу
ну вот твой случай
https://stackoverflow.com/questions/28685753/how-to-only-get-inner-text-of-a-tag-in-beautifulsoup-excluding-the-embedded-one/28685959
а вообще xpath рулит
один раз выучить xpath и уровень свободы в парсинге вырастет в бесконечные разы. Заодно и не выгонят "он знает xpath как его выгонишь. без него ж никто не разберется"
>а вообще json рулит)
Будет, когда там будут коментарии. тогда можно будет и питон выбросить. Но пока что мир иной.
Откуда этот xpath вообще вылез?
Я помню, что это была ископаемая технология для дрочения ископаемого хмл, а теперь дохуя мода опять, но для парсинга. Из-за селениума и его тестов?
он никогда не был ископаемым
он всегда был самым мощным языком запросов к xml (ну и конечно html)
Просто не все его знают. Или даже про него.
Народ же у нас считает как - парсинг? значит регулярки. хтмл? ну значит css запросы. А xpath это сложнааааа
кстати есть еще и jsonpath но кто о нем хотя бы слышал) Народ ничем не интересуется
Потому что сам хмл уже давно легаси, вот и ископаемый.
Не знают, потому что он был нужен только всяким энтерпразам для дрочения этого самого хмл, у них там любая хуйня на нем была, а в каких-то жабах может и до сих пор, лол.
>сам хмл уже давно легаси
от этого html не перестал быть "приложением языка xml" (с) вики
А значит xpath на нем работает. И в реальности ничего мощнее xpath и нет.
регулярки сразу нах
а css селекторы не имеют нужной гибкости
По-моему, последние версии селекторов примерно догоняют по возможностям, но ещё массово не заимплеменчены.
Так что может и закопают обратно скоро, есть ли смысл учить.
не будет никогда равенства возможностей. css селекторы идут другим путем
я про то, что возможностей css селекторов можно хватать
особенно учитывая селектор + немного кода
но если устроить сравнение то css не сможет охватить все случаи что может xpath
а я выучил xpath и нафиг мне эти "а как в этом вашем css замудрить"
В 95% случаев достаточно простого или среднего селектора или даже встроенных в тот же суп хуиток. xpath как раз для мудрения всякой йобы.
def test(kwargs):
....for key, value in kwargs.items():
........print(key, value)
test(mydict)
какой вариант правильный? две звезды просто указывают шо это keyword args? там же распаковка не нужна, ну тип цикл распаковывает
def test(kwargs):
....for key, value in kwargs.items():
........print(key, value)
test(mydict)
есть pyqt4(устарел), pyqt5, pySlide(чет там с основной лицензией qt, это типо фришная) ну и GTK, Wxwidgets, бери pyqt5 для вката
есь книжка справочник прохоренок, дронов pyqt5
https://rutracker.org/forum/viewtopic.php?t=5369996
всё, понял, распаковка по имени
а забыл, еще tkinter на это gui tcl/tk но там типо юзается для очень легковестных гуи и сама либа tkinter не в ооп стиле, может юзаться для бека matplot, но qt ща популярный
Ага, останавлюсь на Qt пока.
Создаю курсор с тем же логином/паролем - пик 2.
> psycopg2.errors.InsufficientPrivilege: ОШИБКА: нет доступа к таблице transcription
Почему так?
Спасибо, пойду читать.
Читай что такое path и как командная строка находит путь к программе по её имени.
потому что если у тебя несколько питонов неизвестно чей пип ты вызовешь
и вызовешь ли вообще
а -m pip вызывает нужный pip
а нефиг пипкать не из венв
python -mvenv huemoe
cd huemoe
source bin/activate
pip install huemoe
а зачем не venv вообще?
вот допустим я пользователь. у меня в системе по дефолту 2.7 которую не выцарапать 3.6 которую не выцарапать и 3.8 которая мне нужна для выполнения моих скриптов
мне изоляция нафиг не всралась, а уже зоопарк
Принцип тот что в докере, но ещё проще. Просто разворачиваешь кастомный венв под каждый проект и они не пересекаются.
Докер это не замена venv, а дополнение
Точно также как сидеть на бэкенде и утверждать что дрочево с деплоем приложений, nginx и линуксом "для лохов", т.к. есть docker-compose
В каком месте это дополнение? Никогда не пользовался венв внутри докера. Для чего оно в докере?
В том что когда тебе таки придется залезть внутрь venv по той или иной причине, ты не упадешь на спину в припадке "сложна сложна мы такого не проходили"
прям как новоявленные вкатывальщики, которые утверждают что математика и алгоритмы прогеру нинужны
Много математики знаешь? Функтор от монады отличишь?
>Неужели так сложно прописать алиасы python/pip на последний питон в bashrc?
У себя прописать можно
Везде прописывать не выйдет
ты что идиот? а если у меня несколько проектов.
в одном один, в другом другие еще и разных версий
ты что идиот? там симлинк
Это тебе по работе нужно так? Или ты сам для себя так пишешь, что-то на 3.5, что-то на 2.7, что-то на 3.8? Если по работе, почему ещё не используете там докер? Вряд ли же у вас там гуй какой-нибудь. И ещё вопрос, почему не обновляете питон в проекте?
я про зависимости скорее, тут у меня версия либы 1.1, а в другом венве 2.1
докер можно, но: под маком это виртуалка, мне не охота отдавать память под всякую хиуту
еще плюс в venv, то что твоей ide/lsp меньше индексировать зависимости
Там нет копии питона, но есть копии библиотек.
Ох уж эти макопроблемы.
> тут у меня версия либы 1.1, а в другом венве 2.1
> меньше индексировать зависимости
Ну так piploc/pythonloc это тот же самый венв, только попроще, как в жс. Разве что не из коробки. Ладно, может быть и хорошо что ты привык использовать венв.
суть венвов не столько в разных версиях питонов, сколько в разных версиях либ к нему ( тока не отвечай нахуйя, не поймешь зачем, просто проигнорируй)
Па приколу чиста
>Ну так piploc/pythonloc это тот же самый венв
только непонятно как с этим жить
как удостовериться что локально все пакеты что нужно они локально
как потом обновлять это все
только если хочется огородить приложуху по памяти или по доступам туда сюда.
иначе он не нужен
Если тебе не нужно, то и всем не нужно? Бро...
Ну так ты спрашивай сразу что тебе надо, а не устраивай перекличку. Конечно же реквестами пользовались все кто хоть немного трогал питон.
Алсо, я правильно понял, что list comprehension в русском зовут генератором списка, но это не имеет отношения к тому, что в целом зовется генератором, и это косяк русского языка?
Если ты такой параноик, то пидорасить sys path. Самая лучшая воспроизводимость всё равно будет только в докере.
Худшее что можно сделать на чужой системе это с пылу с жару запустить пип. Там как раз не нужны никакие алиасы и удобности.
Крайне диванное утверждение. Главная фишка докера не изоляция и ограничение ресурсов, а охуенная воспроизводимость окружений и удобство доставки на сервера.
>а охуенная воспроизводимость окружений
а она нужна в питоне? ну чтобы вот прямо аж ваще
только если юзаешь что то крайне сишное
Генератор это объект, у которого есть метод «высрать новое значение». Практически то же что итератор, только нет заранее готового контейнера со значениями. List comprehension не является генератором, а вот generator comprehension является. Это тот же что и list, только скобочки круглые.
я не параноик.
просто нет четкого понимания как заполнить этот локальный пип нужными пакетами чтобы ничего лишнего и не пропустить чего чтобы потом на целевой машине не было ай?
или на продакшене уже это не юзается?
Все знают докер, докер всё делает автоматически, зачем убивать время на чтение твоих наколенных ридми и делать всё руками? Или проверять очередной мейкфайл на пиздецы.
>Все знают докер, докер всё делает автоматически
недавно ставил пипи сервер локальный
сначала докер там прописывал его строку запуска сооружал
а потом как пип пакет и строку запуска
количество мозгоебли оказалось одинаковым
На продакшене я настоятельно рекомендую докер. А вот локально пиплок, как по мне, удобнее венва. Ну и как напишешь requirements так и будет же.
А теперь попробуй модифицировать этот сервер и расшарить модификацию в команде. Вот самое простое, поменяй тайтл на главной.
могу забрать исходники и сбацать свой докер образ
или свой whl
а далее квест с установкой где уже выяснили что разницы нет
что сказать то хотел?
слился товарищ )))
заметь. а я даже не стал использовать аргумент "а нахера мне шарить дистр своего пиписервера товарищам по команде", им сервер нужен, а не дистр
ну то такое
>Тут сыглы, хули.
мая твая нипанимат
Слился как дешёвка))0 Задавлен аргументами)) Та мне чо, свет сошёлся на твоём благополучии? Страдай, я не против.
все просто
прагматизм
будет нужен докер - поставлю докер
стоит докер - использую докер
ставить целый докер ради одного пиписервера - крайне спорное решение
в итоге стоит пакет, а на той машине где стоит пипи докер нахер не нужен (только память зря жрет)
я не умаляю заслуг докера но
прагматизм а не "докеееер хочу докееееер"
впрочем признаю, что я уже не в ту степь пошел
ибо выставил себя как потребитель, а не разработчик
ПРи загрузке файла он рандомит путь к файлу правильный, но при попытке скачать высирает всегда одинаковый файл.
В чем трабл?
Докер жрет с гулькин хуй. Куда проще заменять сервера, если на них требуется только докер. Композе ап и всё работает. А тут надо целый день чета там ставить настраивать. Почитай про infrastructure as a code, люди даже ресурсы в облаке описывают текстовыми файлами в терраформе. Докер примерно об этом же, описание как поставить в виде короткого текстовика, который каждый у себя может запустить и развернуть если ты ушёл в отпуск.
те кто работают и занят делом не ходят на такие форумы
То что докер что то упрощает - не значит, что все остальные подходы разом устарели.
И про "все знают докер" это враки
Да и применимость тоже преувеличена.
Ты можешь быть мамкин фрилансер. Можешь писать код, который не позиционируется как продукт. Можешь кодить пакеты для пипи. Да мало ли что.
Ну само собой, здесь есть прекрасная статья об уровнях упаковки вплоть до зашивки в хардварь https://packaging.python.org/overview/
Если люди заводят разговор про изоляцию, венвы, несовместимость питонов, то высока вероятность что им нужен докер.
Скорее, если бы они не детектились по постам, то никто бы и не был против
> любой инструмент выбирается под задачу
> пук
Топ 10 бесполезных комментариев в каждом айтишном обсуждении.
Твоя правда.
Гугли black, если хочешь раз и навсегда освободить мозг от форматирования кода. Ещё почитай про феномен bikeshedding: чем проще тема, тем больше времени и внимания ей уделяется.
Если однотипные данные, относящиеся к одному и тому же, то да.
Т.е., всякие словари, наборы переменных и т.д. Как у тебя на пикче точно нет.
>венвы,
он полезен хотя бы тем что не нужно засирать системный питон кучей пакетов, которые нужны только для проекта
и одно это необходимости докера не влечет
Большинство даже с однотипными данными этого не делает. Просто есть любители украшать всё подряд.
>Ну так piploc/pythonloc это тот же самый венв, только попроще, как в жс. Разве что не из коробки
в этом и суть. в том же пишарме поддержка венв, а пиплока аж ничуть
опять дрочить..
messages_count = 10
for i in (reversed(range(2, messages_count + 1))
print ('- Анфиса, есть ли новые письма?')
print ('- Непрочитанных писем:' , str(i) , '.')
print ('Я прочитал одно, и их осталось' , str(i-1) , '.')
print ('- Анфиса, есть ли новые письма?')
print ('- Одно непрочитанное письмо.')
print ('Я прочитал его. И нет больше писем!')
выдает ошибку:
Traceback (most recent call last):
File "main.py", line 3
print ('- Анфиса, есть ли новые письма?')
^
SyntaxError: invalid syntax
проблема в пробелах? если да, то, как исправить ее?
Миддл-скатыш.
да
Делаю недо-текстовое рпг, но не могу разобраться как сделать привязку к айдишнику. Т.е. человек командой выбирает один регион, и он за ним закрепляется в бд.
if event.object.text.lower() == "-регион Озеро Спокойное":
try:
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE public.region")
name = "Озеро Спокойное"
photo = "photo--------------"
cursor.execute("INSERT INTO public.region (name, photo) VALUES (%s,%s)" , (name, photo))
cursor.execute("update public.membboss set alltimedmg = alltimedmg + %s where vk_id = %s" ,(dmg,event.object.from_id))
connection.commit()
vk.method("messages.send", {"peer_id": event.object.peer_id,"message":"Вы получили земли в области Лес хуёв", "attachment": "photo---------------", "random_id" : 0})
cursor.close()
except (Exception) as e :
print(traceback.format_exc())
Транкейт траблицы тут для теста, надеюсь?
после lower оно уже никак не может быть равно строке с заглавными буквами, в первой же строчке дичь какая то дальше смотреть не вижу смысла
Не, привязать в бд к айдишнику человека. Вкшный айдишник
Не заметил, по привычке поставил заглавные. До этого было иначе, без заглавных.
Или процедуры или ОРМ, не надо это говно сюда тащить, пожалуйста. Объебешься в синтаксисе и у тебя весь код в тыкву превратится. И сверку строки делай через паттерны regex.
Есть код этой хуйни?
То есть это верзион контрол тул по сути? Можешь объяснить, что конкретно он делает, не просто он изолирует или тп. А вот, допустим ты написал код, Вася написал код. Вы его пушаете гитом в мастер, как здесь связан Докер?
Спасибо. У меня собес скоро вводный по реквестам\API тестам именно.
Например, почему или даже зачем нам нужны параметры в методе Гет?
Тоже самое для пост, какие конкретно параметры мы должны дать для Пост метод, в чем разница в таком случае?
Нет, он позволяет многим людям поднимать одинаковое окружение. Это как файл с образом виртуалки, но без оверхеда.
>Генератор это объект
Ловите профессора. В Питоне каждая пылинка это объект, я бы за такой ответ тебе перезвонил.
Понял, короче это изолированный сервер, среда, которая настраивается как рабочая под девов куда все и синхронятся. так?
>оверхеда
Что такое оверхед?
Нет, поднимает каждый у себя, но у всех получается идентичный.
>Что такое оверхед?
Накладные расходы. Например, виртуализация имеет оверхед, у докера намного меньше, потому что он работает на живой системе, но изолированно от нее.
дикий респект тому, кто подскажет возможное решение
а не, там элементу это отсылается, поэтому возьми какой нидь боди
>Вопрос в том, как сделать так, чтобы прогрузить весь контент страницы в html.
Сделать ожидание до момента, когда нужный элемент прогрузится, Селениум предоставляет такую возможность. И убери бьютифулсоуп, он нахуй не нужен
У двачеров видимо с логикой туговато. Истинность частного случая не несёт за собой ложности общего.
> я бы за такой ответ тебе перезвонил
Синдром вахтёра на максималках.
Пушится в гит Dockerfile, который есть набор инструкций как собрать какой-то образ. Выбрать можно даже дистрибутив, то есть работаешь ты в федоре, а на проекте принято использовать убунту. Пожалуйста, делаете всё в образе от убунты. Там и компилятор совпадёт, и cmdline утилиты, и переменные окружения, и пути куда что ставится.
Двачеры почему-то думают что венв это железная изоляция, хотя это всего лишь хак с path/pythonpath, который сработает только есть весь проект и все его зависимости написаны на чистом питоне, и у всех жёстко одинаковая версия (включая третью цифру) самого питона. Венв хороший инструмент, но если у тебя случилось так что локально работает, а на продакшене падает, то надо потестить уже в докере.
Делаю недо-текстовое рпг, но не могу разобраться как сделать привязку к айдишнику. Т.е. человек командой выбирает один регион, и он за ним закрепляется в бд.
if event.object.text.lower() == "-регион озеро спокойное":
try:
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE public.region")
name = "озеро спокойное"
photo = "photo--------------"
cursor.execute("INSERT INTO public.region (name, photo) VALUES (%s,%s)" , (name, photo))
cursor.execute("update public.membboss set alltimedmg = alltimedmg + %s where vk_id = %s" ,(dmg,event.object.from_id))
connection.commit()
vk.method("messages.send", {"peer_id": event.object.peer_id,"message":"Вы получили земли в области Лес хуёв", "attachment": "photo---------------", "random_id" : 0})
cursor.close()
except (Exception) as e :
print(traceback.format_exc())
Код для примера:
import requests
data = {'username': 'foo@bar'}
response = requests.post('http://httpbin.org/post', data=data)
print(response.request.body)
Что выводит принт:
username=foo%40bar
Это называется urlencoding, это способ сериализовать структуру в поток байт. Фиксить это не нужно, так и должно быть. print(response.request.body) — смотри тут внимательно, ты реквест принтишь, то что ты отослал, а не принял в ответ.
> ты реквест принтишь
В этом и цель. Сервер говорит, что пользователя не существует, поэтому я принтил реквест, чтобы разобраться, что не так. Через браузер с теми же данными все работает. Единственное, что отличается - %40 вместо @.
> человек командой выбирает один регион
Вот это выражение я не понял. Команда выбирает регион? Ну так добавь поле команде. А если нужно подтянуть в селекте для игрока используй джойн или подзапрос. Вместо кода лучше схему БД запости.
На пике запрос через браузер. Сервер авторизовывает и возвращает токен. При таких же заголовках и теле запроса через requests авторизация не проходит и возвращается текст в utf-16 "пользователь не найден"
>Двачеры почему-то думают что венв это железная изоляция
не думают.
они думают что городить огород с докерами геморнее и это так
Смотри, у тебя в браузере content-type: application/json, это другой способ кодирования. Вместо параметра data нужно использовать параметр json, иначе будет content-type: application/x-www-form-urlencoded.
Во, теперь работает, спасибо
Приложил пасту, там кода по хуйне, подскажите плс
https://pastebin.com/P94L8PLX
Если что-то подгружается не сразу, то смотришь ходящие запросы, оно подгружается в основном как раз в виде жсона.
А то знатоки уже налетели с селениумом. Браузер скачал готовые данные, отрендерил в хтмл, а они потом обратно руками дрочат.
Вообще ты мне намного облегчил задачу. Я сейчас ещё осознал, что треды можно получать тоже в виде джсона. Я об этом даже не задумывался. Огромная благодарочка, анон
Смотри в сторону unique_together. Выборка всегда должна быть по двум ключам: book_id, chapter.
> Add_chapter
Почему модель называется глаголом? Там же просто Chapter.
> models.ForeignKey(Manga
Что за модель Manga?
class Book(Model):
class Chapter(Model):
..book = ForeignKey(Book)
..number = PositiveIntegerField()
..class Meta:
....unique_together = (("book", "number"),)
Приблизительно так должно быть.
>А то знатоки уже налетели с селениумом.
У него изначально был селениум, мало ли что он хотел делать
В функции есть набор символов, например "abca", нужно вывести все возможные значения комбинаций этих символов, но чтобы они не повторялись типа aabc, а только abca, acab и тд.
Так и не дошло до меня как делать, интеврьюер сказал, что нужно было делать луп в лупе, в лупе, но я не понял все равно. Спасибо.
>#A = [a,b,c]
#B = [a, b, c]
#A B (concurrent letters are not same) = [ab, ac, ba, bc, ca, cb] = C
# C B
Я насобирал такую вот хуйню, но так и не понял.
Охуенно! Спасибо! Именно оно.
Теперь как развернуть этот лист компрохенсив в нормальный, чтобы посмотреть логику?
a = ['a', 'b', 'c']
b = [i+j for i in a for j in a if i !=j] - что равно этому квадратному лупу
for i in a:
for j in a:
if i != j:
b.append(i+j)
так что ли?
Разве компрехеншены не справо-налево раскладываются? Типо внешний цикл основной - внутренний идет уже как выражение основного
У тебя это перестановки, а не комбинации. Суть в чём, ты фиксируешь один символ, убираешь его из колоды, спускаешься в рекурсию, отпускаешь символ, берёшь следующий.
https://ideone.com/8Xvl1J
https://ideone.com/nNK2J8
Ловите Лутца!
Действительно
а что мне это даст?
Нормас, спасибо. Сразу и не монимаю что происходит. Буду разбираться.
Как кликнуть элемент, если имеем вот такое? Вопрос, кликнить на текс в строчке 10?
><div>text</div>
<div>text</div>
<div>text</div>
<div>text</div>
<div>text</div>
можншь открыть разработку в браузере нажать пкм элемент и скопировать его по xpath, дальше найти его в селениуме по хпатх и кликнуть
> чтобы они не повторялись типа aabc, а только abca, acab и тд.
То есть я получившиеся перестановки ещё профильтровал и оставил те что без двух одинаковых букв рядом. Не знаю нужно ли это было.
a = os.walk('.)
print(next(a))
print(next(a))
print(next(a))
print(next(a))
...
то он нормально обходит папочки, что в моем коде всё ломает?
блядь, думал не хватает одного цикла for, но все та же хуйня преследует...
Кароч деревня, бросай это дело. Не твоё. Поверь.
Попробуй открыть новую чакру, у меня не выходит телепатически считать твой код
>Например, почему или даже зачем нам нужны параметры в методе Гет?
У тебя не с Питоном проблемы. А с TCP/IP и сетями в целом. Читай Танненбаума и протоколы прикладного уровня (HTTP в частности)
Часто приходится работать одновременно с питоновским кодом и с жс-кодом, что из IDE лучше юзать? У меня стоит pycharm, там есть что-то вроде расширенной версии, она поможет? Или лучше брать другой редактор? В пайчарме просто навигация по проекту и по Гиту довольно удобная
При всем
Не знаешь основ HTTP но лезешь в requests? Ты серьезно?
Питон это прикладной язык, "обертка" для работы с более сложными сущностями, о чем может быть речь если ты не знаешь даже примерно сути этих сущностей?
Тебе дело говорят -> >>791720
Почитай про модуль os и os.getcwd в частности. Не додумывай как функции работают
>>791748
Да ты заебал. Ты на собес идешь. Тебе простительно не знать основ работы инета и http если ты хочешь быть QA-интерном, в противном случае ты будешь как шимпанзе, которую научили нажимать на 1 конкретную кнопку на клавиатуре
лол, че сразу не олифера то сразу?
В пучарме Про, точно есть дополнения. А так все на VSCode давно перекатились.
Ты можешь получить путь в __file__ и потом присобачить оставшийся путь.
Можно, но без слеша вначале.
идешь в магаз и отдаешь бумажки или цифры (валюта) и приобретаешь эту сомнительно полезную материю и потом соеденияешь её в различные образы
Ясно, где-то гвидо обосрался значит, ну остается теперь только одно, идти компилировать тайпскрипт в жс.
new
Как и в любом языке. Не слушай долбоебов. Спроси лучше себя "каким образом init может быть конструктором если первый же аргумент который он получает это конкретный инстанс класса"?
https://www.interviewbit.com/python-interview-questions/
Здесь например написано шо это конструктор
Ну его задача это выделять память под объехты и инициализировать элементы
значит победил тебя
Пишут хуйню. __new__ выделяет память и создает конкретный объект. Любому у кого недвузначный IQ это очевидно
init тогда инциализатором щитать? Если new конструктор класса, а init конструктор данных?
Само понятие "конструктора" в Питона весьма извращено и часто "конструктором" называют __init__ хотя конечно это нихрена не так. Де-факто init это конечно "инициализатор"
В любом нормальном языке ты создаешь инстансы следующим образом:
let a = new Array(); // JS
int arr[] = new int[5]; // java
int fizzbuzz [5] = { }; // c++
Ничего не напоминает?
Лол с плюсами конечно напортачил, там по-другому немного конечно. Если захочу создать не статически массив то надо наебенить что-то вроде:
int * arr;
arr = new int [5];
>Есть ли смысл накатывать на виртуалку какую-нибудь убунту
Есть смысл поставить себе второй системой линух и работать на нем
Иначе про разработку забудь
Под изучение самого питона не стоит, но дальше знания линупса уровня не бояться консоли очень и очень не помешают.
Ну скожи хотя бы по русски братик, я подучу куда смотреть я вообще ничего не понял с описания
ну из заданной строки вычисляешь производную , а потом х в том что получилось меняешь на второй аргумент функции считаешь как обычное выражение и ретернишь результат, думаю в интеренте есть какие нить онлайн калькуляторы диференциалов, можешь поискать и потыкать чтобы лучше понять
так же скорее всего в каком нить нампае уже все готово, надо только суметь засунуть это туда
> накатывать на виртуалку какую-нибудь убунту и разбираться с ней
Да, но не графическую. Накати серверную. Оставь графику пердолям из /s/, а сам учи основы ОС: что такое монтирование, пермишены и владение файлами, пайпы, шелл, контейнеры, компиляторы, мейкфайлы итд.
не графическую(первым же делом htop,mc,aptitude,elink)
Меня всегда интересовал вопрос: как подобные существа живут? И главное: не противно ли им каждое утро видеть свое красноглазое зашкваренное ебало в зеркале?
Ты асинхронный код хоть раз в жизни писал/читал? А поддерживал уже написанный на проекте?
я - да, за любые выкрутасы с коллбеками вместо адекватной асинхронщины ты получил бы залупой по лбу от сеньора
Асинхронно парсил хтмл регулярками с помощью goto.
>То, что Белый Человек пишет через async/await. Что в жс, что в питоне
Я думал тебе type hints и лямбды не понравились. Насчет async/await ничего сказать не могу - я мамкин дата саентист и никогда их не использовал.
Спасибо. Лекции по сетям я читать вроде бы не собирался. Мне бы просто в двух словах пояснить, что к чему. Ну и я не на сетевого инженера иду.
Я кажется делаю что-то не то и когда запускаю сразу два разных через команды
python3 test1.py &
python3 test2.py &
то они как-то странно работают (то ли отключаются через некоторое время то ли еще что), когда я отключаюсь от сервера.
Может ли быть проблема в том, что рядом с основной выполняющейся командой в коде я писал print('что-то там, для проверки выполнения команды') ?
Но если я запускаю эти скрипты по отдельности, то они работают даже после отключения от сервера
убери принты и попробуй если еще так не сделал, потому что сам сталкивался с проблемами при попытке запуска в фоне скриптов которые печатают в консоль
Потому что надо запускать демонов
Гугли unix daemon и daemon python, в принципе если тебе похуй, можешь просто прочитать главу про daemonize и скопипасть код в Python Cookbook от Бизли, она там есть
& должен отваливаться после отключения. Чтобы не отваливался можно запустить через nohup.
Или вариант с удобствами - tmux, потом можно будет подключаться обратно.
Эта есть проблема, скрипты прибиваются, если им некуда вывод сохранять. Не разбирался почему, у питона есть история, а у ноды, например, нет.
Ты можешь запускать как pythom3 test.p1 1> /dev/null 2>/dev/null
Это перенаправление обычного вывода(1) и вывода ошибок (2) в никуда. Тогда всё прекрасно работает. Ну или в файл сохранять.
Оба все равно подвержены GIL, с asyncio нагляднее и чище код, вместо asyncio loop можно взять uvloop, синтаксис не поменяется
мимокрок
Читай маны про systemd. Stdout интерпретатора можно направить в файл или же потом в journal посмотреть. Раньше советовали обертки или circus, но они банально устарели. Systemd довольно мощный инструмент.
>За что мы любим Никиту Соболева — только он умеет писать на Питоне так, что хочется плакать и переходить на Джаву.
Мало того что он дрочит httpx, где майнтейнера сами советовали использовать взрослый aiohttp, так ещё и плодит всякую хуйню вместо кода. Httpx обратно совместим с requests, отсюда и проблемы. Хватит пинать хуи трупы уебищных синхронных либ. Исключение zeep, пушто вариантов больше нет. SOAP нынче не модно.
А так даже pysnmp легко заменяется хуяк-хуяк либой aiosnmp. Она простая, на asyncio и конечно же без yield и callback.
Работаю питонистом уже 2 года. Вышки нет.
Начинал в регионе, в маленькой аутсорс-компании.
Сейчас в дс, в мыле.
Но недавно восстановился на заочку, чтобы таки получить корочку(будет легче заводить трактор)
Если пишешь сервисы, то только линукс. Если у тебя шиндоус поставь WLS2. В продакшене будет или докер или AWS. Ты же понимаешь, что хуй ты спрячешь говнокод питоновский? Обфускация на уровне контейнера уже лучше.
Не работал с ним сам.
Местным костылем бы не назвал, потому что его покупают(b2b) версию довольно крупные конторы.
Но, насколько знаю, развитие опенсорс-версии на какое-то заглохла. И только сейчас начинают его возобновлять
деванон
>Оба все равно подвержены GIL
Епт, а ниче что асинхронкам похуй на GIL? Мультитрединг/асинхронка это в принципе разные концепции конкурентного пограмирования
А ничего что асинкио использует потоки и по факту при наличии GIL это всего лишь сахар?
Пишешь из будущего, где пихон стал эталоном Энтерпрайза?
>асинкио использует потоки
Что?
Асинкио использует epoll/select, это другой подход, чем потоки.
Этот вариант говно же?
import statistics
statistics.mean(листнейм)
И лучше ведь этот вариант?
from statistics import mean
mean(листнейм)
Сильно ли эти два варианта отличаются в плане потребления "ресурсов"?
>то будет плохой практикой полный импорт модуля?
Да. Особо ничего хорошо, если не нужно, то зачем его подгружать?!
да, из за того, что таким образом ты имортируешь все объекты из модуля у каждого из которого свой вес, в отличии от поштучного где ты импортируешь всего один объект из модуля
абсолютно одинаково
при импорте всегда происходит выполнения кода в модуле который импортируется
разница между этими подходами только что из этого импортируемого модуля попадет в текущее пространство имен.
не прав.
польза есть если у тебя условный импорт внутри if, ведь импорт может не произойти.
иначе разница только в засранности пространства имен модуля
Спасибо анон. Просто я люблю импортировать с полным именем, чтобы понимать что к чему относится.
Все верно же
Анон, который не прав, пишет что есть разница в потреблении памяти.
Но ее нет.
При импорте происходит такой порядок действий
1 импортируемый модуль выполняется сверху вниз
2 по результатам его выполнения появляется загруженный в память модуль с аттрибутами (функции и т.д.). И он повисает в памяти навечно - потому второй импорт не вызывает повторного выполнения модуля.
3 что то из этого модуля добавляется в твое пространство имен как ссылка.
Ясно все с твоей аргументацией
Ну чо пояснять, есть стандарт, это реализация стандарта. Валидатор сам описывается жсоном. Питонячая реализация вполне качественная и расширяемая, приспособить для сваггера можно.
Если коротко, то лучше го. В целом что на твистеде, что на торнаде, что на асинкио можно делать успешные проекты. Но асинкио в последние годы развивался куда более интенсивно, и он архитектурно правильнее, не нужно манкипатчить всю стандартную библиотеку. Вроде бы ещё он быстрее, так как там оптимизировали переключения в корутинах.
> подвержены GIL
Чёт орнул. Асинхронное приложение по определению не занимается суровыми вычислениями, там только перекладывание между потоками IO.
Этот чел очень упорот на всяких линтерах и чекерах. Ему уже кто только не говорил что надо язык менять. Но видимо жлобность галерного погонщика не даёт просто так заплатить за другой язык больше. Хочется и дёшево и красиво.
> насколько просели мои знания и способности решать даже элементарные вещи
Чем же ты таким на работе занимался? Траву красил?
Хуйня. Питонов можно несколько запустить, если уж так хочется пригрузить проц. Про GIL пишут в основном клинические перфекционисты, для которых гил это такой вселенский фатальный недостаток, хотя на практике ой как сложно в него упереться, если ты занимаешься не вычислениями или играми. Тащемта даже это решается экстеншенами на си/цитоне, там можно отпускать гил, к примеру так делает numpy.
Го советую потому что он щас модный, и асинки это его киллер фича. Что-то такое, несложное, обслуживающее вебсокеты — самое оно.
Подскажите в чем может быть проблема.
Приложеньку на flask упаковываю в докер-контейнер. Не накатываются миграции.
Использую Flask-Migrate, sqlite3
заранее создал миграции с помощью
flask db init
flask db migrate
В самом Dockerfile есть следующие строчки
...
ENV FLASK_APP flask_app.py
RUN flask db upgrade
ENTRYPOINT FLASK_ENV=development flask run --host 0.0.0.0
...
Никаких ошибок не происходит, но при этом файл базы не создается, миграции не применяются.
На нем вообще пишут игры, кроме карт на раздевание и хентай-новелок?
>Го советую потому что он щас модный
Курсы по 18500 продаешь или дващерам скидки?
Го вообще под другие задачи был создан, как и Rust. Вернее так: были конкретные задачи, для которых не было готового инструмента или он не отвечал требованиям бизнеса.
И фишка Го нихуя не горутины, а как раз таки возможность загрузить мультипроцессорную железку. Это как сказать что фишка JS это минимальный вес кода.
Lua был создан под конкретные задачи, Java пилили под задачи Сириус бизнеса, Раст пилили под задачи Mozilla, Питон же сначала изрыгнули as is, потом на пике популярность вышли талмуды PEP "бля, а чо так сделали? Теперь надо переделать, вот теперь заебись". Twisted же тоже не просто так появился.
Сейчас в opensource дохуя всего, что было сделано для внутреннего использования. Но бывает "первая доза бесплатно". Это просто к слову, вспомнилось что-то.
Смотря что для тебя игры. Киберпанк и крузис точно не на питоне. Книги согласен, скорее вводят в заблуждение, для игор надо C++ или шарп, или жабу если фанат майнкрафта. Хотя наебенить прототип можно и на питоне.
а что тут необычного. это в примитивных вещах пришел запрос в базусходит и выдал
а если что то нужно с данными еще делать, а то и вообще бд нет, то проц занят.
Что сказать-то хотел? Бизнес какой-то, доза, какие-то задачи мозилла. Это какие интересно были задачи у мозиллы? Раст же пет проектом был.
> возможность загрузить мультипроцессорную железку
Такое можно делать на чём угодно, даже на питоне.
> фишка Го нихуя не горутины
А что тогда? Или давай иначе, кому нахер всрался го без горутин?
>Такое можно делать на чём угодно, даже на питоне
мимокрок, но будем честными - на питоне не очень удобно ядра загружать
не для всех задач подходит
> нужно с данными еще делать, а то и вообще бд нет, то проц занят
Ты каким местом читал мои посты? И второе, ну понятно масштабировать вертикально из-за гил сложно, а горизонтально пробовал?
> это в примитивных вещах
Как ты легко IO-bound приложения в хелловорлды записал.
Изучение алгоритмов, фреймворков. Просто один из возможных подходов. Дохуя чего можно написать нативно на bash/powershell и не ебать мозги ещё одним скриптовым языком.
Не знаю, каждый выбирает инструмент который ему подходит. Если ты про могильную разработку лучше сразу на Котлин, JVM из коробки. Jython мертв, в roadmap даже 3.6/3.7 не маячит.
Питон как и Node для легковесных решений или же ML. У других либо цирк с реализацией, либо просто нет.
Возможно ли подогнать структуру кода до уровня Энтерпрайза? Как нехуй делать. Будут ли решения зависеть от 1.5 мейнтейнера - шансы очень велики.
Тебе шашечки или ехать? Java Core - 1 год, Котлин ещё один, а в Питоне за год можно что-то уже сдавать и отрефакторить. Работать будет в любом случае.
Я к тому, что игр на питоне не существует. 99% из существующих - это детские поделки на готовом движке для вн - ренпи. Поэтому мне интересно, нахуя такие книги пишут inb4 чтобы заработать лавандос на дебилах. Ну ведь реально, язык для этого не подходит, у него нет ни малейшей ниши в геймдеве, нет хороших примеров, нет инструментов для этого. Про майнкрафт и джаву - это не благодаря языку, а скорее вопреки.
>Пет проект
>Software you know and love, like Firefox, Dropbox, and Cloudflare, uses Rust.
Прост чуваки в свободное время пилили, портфолио на ГитХаб забивали, ага.
была у меня задача поиска дублей видео в сотнях тыщ
сделал отпечатки и нужно было сравнивать каждый с каждым
шарить данные между процессами медленно. Поднять независмые процессы у каждого свой полный набор данных - дохера памяти нужно
после оптимизаций обхода и сишного кода вычисления расхождения обход на питоне занимал 5 часов
на шарпе все оказалось просто и в плане памяти и скорости и проход на шарпе 4 минуты (на моей машине конечно)
И от чего такое расхождение, на чём просадка производительности у питона?
Вообще не вижу проблему с данными, если надо сравнивать все со всеми, то есть надо сделать N^2/2 сравнений. Тривиально масштабируемая задача.
Но надо полагать, что основной ресурс съедает сравнение одного видео и другого. Там какая-то специальная либа для этого или что?
> нет хороших примеров, нет инструментов для этого
Вот здесь в точечку. Ну хотя блендер есть. Книги наверное могут быть полезны для тех кто знает питон и боится крестов.
>И от чего такое расхождение,
от того что я знаю шарп
выжав из однопотока питона все я пошел в шарп и там все приятно
а в питоне как я уже говорил непонятно как параллелить такой огромный список между процессами.
>сравнение одного видео и другого
не. на выходе у тебя отпечатки. это строки такие длинные
и нужно ну в примитивном варианте расстояния хеминга допустим
да в общем не суть важно.
суть в том что выдать каждому процессу весь список нельзя.
мудрить какую то общую память...
ключевое слово МУДРИТЬ. Для питониста, который знает только питон, нет выхода и он считает такую еблю вприсядку необходимым злом
у меня же пукан горит от того как приходится танцевать в питоне
> обход на питоне занимал 5 часов
> проход на шарпе 4 минуты
О, это очередной феномен переписали с технологии XX на технологию YY, и сразу стало хорошо. И конечно же это заслуга технологии YY, а то что мы всё переписали и заново осознали проект, этого не было.
> такой огромный список между процессами
Есть очереди, есть раунд робин. Можешь хоть в файл написать чё кому сравнивать. Очереди на процесспулах делаются супер изи.
> ключевое слово МУДРИТЬ. Для питониста, который знает только питон, нет выхода и он считает такую еблю вприсядку необходимым злом
Кек. Во всём виноват конечно же гил. Даже в том что ты не знаешь питон. Если ты так хорошо пишешь на шарпе, зачем ты начал делать это на питоне?
Замечание не в тему
Этот феномен прост
В шарпе нет GIL
А значит нет необходимости рождать процессы
А значит нет проблемы эффективно и просто шарить дааные между ними
И нет проблемы эффективной коммуникации между ними
>И от чего такое расхождение, на чём просадка производительности у питона?
У питона нет нормальной многопоточности. Чтобы использовать несколько ядер надо создавать процессы, а у каждого процесса своя виртуальная память. На линуксе питон создает новые процессы через fork и данные для чтения копировать не нужно. На винде такого нет и данные будут копироваться всегда. Вдобавок, что на винде что на линуксе по любому придется копировать назад результат. Если результат большой (например, картинка), то копирование его назад может убить всю производительность. В таком случае единственный вариант - переписывать кусок кода на крестах.
>Есть очереди
эффективность у них слабовата чтобы решать задачу "в лоб"
>Очереди на процесспулах делаются супер изи
изи. но скорость не сравнить
> Если ты так хорошо пишешь на шарпе, зачем ты начал делать это на питоне?
я нормально пишу на обоих. питон мой прикладной язык
на нем проще решать задачи когда нужно именно решить, а не создать софт
>Во всём виноват конечно же гил.
а кто еще? кто еще заставляет вместо потоков использовать процессы? Подключение файлов == просадки по скорости. Можно минимизировать чтение запись если подумать
но это уже не стыкуется с "изи".
>шарить данные между процессами медленно
в 3.8 подвезли
https://docs.python.org/3/library/multiprocessing.shared_memory.html
Зачем тебе на лету создавать и прибивать постоянно процессы?
Ты делаешь несколько процессов-воркеров и между ними распределяешь задания, и всё.
Использовать треды там, где у тебя большие задачи, тоже не самая лучшая идея обычно. Треды всё-таки для ситуаций, когда у тебя очень много мелких быстрых задач с большим количеством транзакций по обмену данными.
На воркеры в любом случае лучше переходить, так ты делаешь архитектуру, которую элементарно масштабировать на кластер. Треды ты на кластер, само собой, масштабировать не сможешь.
И там и там можно жить, но степень удобства различается в разы.
И чем больше задача требует коммуникации между потоками, тем хуже все в процессах.
>Ты делаешь несколько процессов-воркеров и между ними распределяешь задания, и всё.
У каждого воркера своя память. Мне, например, нужно было декодировать с огромной скоростью картинки и использовать их в основном процессе. Каждую картинку питон копировал сначала в процесс воркера, а потом назад в основной процесс, что занимало 90% времени. При использовании потоков такой хуйни бы не было.
Как-то мутно это всё. Уверен что ты там что-то не так делал. Ну да, трединг позволяет не копировать ничего между процессами, но это нужно в основном игроделам каким-нибудь, у которых только ну никак неделимый стейт.
Почему нельзя картинку взять сразу в воркере? Зачем её прогружать в мастере? Судя по всему у тебя мастер как-то агрегировал эти картинки. Мог ли воркер сделать частичную агрегацию на своей стороне, а потом отдать только результат для финального мержа?
> что занимало 90% времени
Может у тебя там сериализация тормозила? Или мастер тупил. Ну реально, звучит как хуета что оперативка не справляется с копированием.
В смысле? Я делаю запрос реквеста и потом в ручную парсю джесон и делаю валидацию. Или использую готовую библиотеку.
Вот и спрашиваю, какая разница?
Пишу бэкенд. Но извини конечно я там задачи алгоритмов не решаю.
Юля любит слушать музыку через интернет сервис «Тындекс Музыка». Это очень удобно — огромное количество музыкальных композиций в прямой доступности. Но вот проблема, у Юли осталось совсем немного трафика мобильного интернета, а она обязательно хочет скачать ещё одну песню на внутреннюю память телефона.
Всего в плейлисте Юли — n песен. Какие-то уже скачаны, а какие-то — ещё нет. Каждая песня характеризуется так называемой «прЕкольностью». Так вот Юля хочет скачать одну, еще не скачанную, песню из своего плейлиста так, чтобы сумма «прЕкольностей» всех скачанных песен была максимально близка к заданному её настроением целому числу k.
Входные данные
Первая строка входных данных содержит два целых числа разделенных пробелом: n и k — количество песен в плейлисте и число заданное настроением Юли соответственно (1 ≤ n ≤ 1000, - 109 ≤ k ≤ 109).
Последующие n строк содержат по два целых числа, разделённых пробелом: pi — «прЕкольность» i-й песни и di — статус закачки i-й песни: 0 — не скачана, 1 — скачана ( - 1000 ≤ pi ≤ 1000, 1 ≤ i ≤ n).
Гарантируется, что хотя бы одна песня в плейлисте не скачана.
Выходные данные
В единственной строке выходных данных требуется вывести два целых числа через пробел: максимально близкую к числу k сумму «прЕкольностей» скачанных песен, если скачать еще одну песню и «прЕкольность» этой скачанной песни.
Если существует несколько правильных ответов, то среди них требуется выбрать ответ с максимальной суммой «прЕкольностей».
Пример
Входные данные
4 1
1 0
2 0
3 0
4 1
Выходные данные
5 1
Сам я понял только то что
нужно найти ту песню, среди всех не скачанных, которая при сумме качества с остальными даст наибольшее приближенное значение это можно сделать перебором, сравнить каждую сумму с каждой нескачанной песней через цикл while и найти число, которое больше предыдущих, но <=k и поставить break
чтобы прервать цикл.
Заранее спасибо
Юля любит слушать музыку через интернет сервис «Тындекс Музыка». Это очень удобно — огромное количество музыкальных композиций в прямой доступности. Но вот проблема, у Юли осталось совсем немного трафика мобильного интернета, а она обязательно хочет скачать ещё одну песню на внутреннюю память телефона.
Всего в плейлисте Юли — n песен. Какие-то уже скачаны, а какие-то — ещё нет. Каждая песня характеризуется так называемой «прЕкольностью». Так вот Юля хочет скачать одну, еще не скачанную, песню из своего плейлиста так, чтобы сумма «прЕкольностей» всех скачанных песен была максимально близка к заданному её настроением целому числу k.
Входные данные
Первая строка входных данных содержит два целых числа разделенных пробелом: n и k — количество песен в плейлисте и число заданное настроением Юли соответственно (1 ≤ n ≤ 1000, - 109 ≤ k ≤ 109).
Последующие n строк содержат по два целых числа, разделённых пробелом: pi — «прЕкольность» i-й песни и di — статус закачки i-й песни: 0 — не скачана, 1 — скачана ( - 1000 ≤ pi ≤ 1000, 1 ≤ i ≤ n).
Гарантируется, что хотя бы одна песня в плейлисте не скачана.
Выходные данные
В единственной строке выходных данных требуется вывести два целых числа через пробел: максимально близкую к числу k сумму «прЕкольностей» скачанных песен, если скачать еще одну песню и «прЕкольность» этой скачанной песни.
Если существует несколько правильных ответов, то среди них требуется выбрать ответ с максимальной суммой «прЕкольностей».
Пример
Входные данные
4 1
1 0
2 0
3 0
4 1
Выходные данные
5 1
Сам я понял только то что
нужно найти ту песню, среди всех не скачанных, которая при сумме качества с остальными даст наибольшее приближенное значение это можно сделать перебором, сравнить каждую сумму с каждой нескачанной песней через цикл while и найти число, которое больше предыдущих, но <=k и поставить break
чтобы прервать цикл.
Заранее спасибо
Это копия, сохраненная 16 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.