Это копия, сохраненная 13 мая 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий: >>2151231 (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
Насколько глубоко ты можешь залезть в жопу своим языком?
FastAPI только? Остальные какими-то недоделанными выглядят
Тестовое задание: необходимо сделать tcp сервер, который распознаёт заданный формат данных и отображает его в требуемом формате. Обязательна запись данных во внешний файл. Интерфейс и способ отображения на выбор разработчика. Формат данных BBBBxNNxHH:MM:SS.zhqxGGCR Где BBBB - номер участника x - пробельный символ NN - id канала HH - Часы MM - минуты SS - секунды zhq - десятые сотые тысячные GG - номер группы CR - «возврат каретки» (закрывающий символ) Пример данных: 0002 C1 01:13:02.877 00[CR] Выводим «спортсмен, нагрудный номер BBBB прошёл отсечку NN в «время»" до десятых, сотые и тысячные отсекаются. Только для группы 00. Для остальных групп данные не отображаются, но пишутся в лог полностью.
Язык Python, версия не ниже 3.2
Передача данных должна поддерживаться с помощью telnet клиента.
Что тут решать, тут только работа со строками.
Sanic
import config
config.TEST_CONF
то в иде подсвечивает, что не знает TEST_CONF, потому что она считана из файла. Как сделать, что он понимал что за конфиг и мог прыгнуть к определению?
>Одни хотят что-то с gRPC, а другие с FastAPI
Что-то? Без конкретных требований? Придумать самому? Я бы не стал там работать
Особо делать нечего. Парсить строку через re, дальше простые if-else с логикой.
Задача, как я понимаю, скорее на умение работать с сетью
Мой код представляет из себя функциональщину, я там форматирую разный текст - нарезать строку, что-нибудь к ней добавить, где-то инвертнуть и т.д. Таких функций у меня несколько подряд, и форматирование в каких-то функциях повторяется, они отличаются только текстом, который надо отформатировать.
Сейчас я переписал это в одну функцию, которая принимает на вход несколько разных текстов, и меня озадачил вопрос - а от этого изменения сам по себе код стал быстрее? Или я просто увеличил читабельность кода, снизив его повторяемость?
Timeit в помощь
имеется программа, которая переодически выплевывает клиенту много текста от 10 до 500 символов, таких текстов +- 50
Варианты, которые я рассмотрел:
1) Самый примитивный вариант: иметь файл.py с глобальными переменными, в которых хранятся строки
hello_text = "..."
bye_text = "..."
2) Использовать Enum:
class SomeText(str, Enum):
hello_text: str = "..."
bye_text: str = "..."
Более сложный для редаченья текста вариант, просто юзать import SomeText, можно обращаться по ключу, а не только черз точку, что важно
но постоянно юзать SomeText.hello_text.value ну такое
3) Использовать БД:
слишком заёбистый вариант, хотя можно запилить админку для редактирования обычным человеком
4) Использовать JSON + pydantic:
class Text(BaseModel):
hello_text: str = "..."
bye_text: str = "..."
texts = Text.parse_file("texts.json")
text.hello_text
Более сложный вариант чем Enum, но JSON же проще редактровать обычному человеку чем file.py, да?
Какие ещё варианты есть?
Пилю простой круд на джанге, подключаю js файл в html документе,
через %static%
Когда загружаю сайт, то получаю код 200 (тобишь файл js получен и все хорошо), как я понимаю
Но сам файл js ни в какую не работает, ни alert, ни вывод в консоль
Хотя если прописываю код в самом документе html через (<script>),
то все ок.
Как это исправить?
Я просто недавно вкатываюсь во все это(в универе я вот С++ изучал) и только, что заметил это момент
И вообще что JavaScript - это тупо маркетинговый ход, сам язык к жабе не имеет никакого отношения. Так вот, похожи они это потому что они оба скриптовые или потому, что суть если уж на то пошло все языки похожи.
Ну и еще, если кому не лень, можете пояснить за скриптовые языки, я честно гуглил, ну да читаю вот, да слова и даже смысл понимаю, но вот сути нет.
Это галера на проект. В двух разных проектах есть эти технологии, а у меня нет с ними опыта хотя и теорию знаю. Так на собесе и сказал. Интервьюер усомнился, что я справлюсь и хрюша попросила почитать про них и какой-нибудь мини-демо показать, что осилю. А потом его проревьювят. Офер уже выкатили. Осталось проекты показать и они пойдут меня заказчику показывать. Если не справлюсь, то буду другого заказчика ждать
Они совсем не похожи.
Есть некоторые тренды, которые популярные языки подхватывают, но не более того.
Всё это было раньше сделано в си, перле и лиспе.
> Это правда что JavaScript и Python пиздец как похожи?
Кто тебе это сказал интересно? Чем они похожи вообще?
Нихрена не понятно в твоём техзадании, что тебе надо.
Для хранения данных ещё можно посмотреть на формат yaml, его намного проще редактировать человеку, чем JSON
for x in range (2):
for y in range (2):
for z in range (2):
for w in range (2):
F = (( not x or y) and (not y or w)) or (z == (x or y))
if not F:
print ( x,y,z,w )
выводит
0 1 0 0
1 0 0 0
1 0 0 1
1 1 0 0
(все верно)
А этот код
for x in range (2):
for y in range (2):
for z in range (2):
for w in range (2):
F = not(( not x or y) and (not y or w)) or (z == (x or y))
if F:
print ( x,y,z,w )
выводит это
0 0 0 0
0 0 0 1
0 1 0 0
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 1 0
1 1 1 1
Разница ведь в том, что я переместил not на другое место.
for x in range (2):
for y in range (2):
for z in range (2):
for w in range (2):
F = (( not x or y) and (not y or w)) or (z == (x or y))
if not F:
print ( x,y,z,w )
выводит
0 1 0 0
1 0 0 0
1 0 0 1
1 1 0 0
(все верно)
А этот код
for x in range (2):
for y in range (2):
for z in range (2):
for w in range (2):
F = not(( not x or y) and (not y or w)) or (z == (x or y))
if F:
print ( x,y,z,w )
выводит это
0 0 0 0
0 0 0 1
0 1 0 0
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 1 0
1 1 1 1
Разница ведь в том, что я переместил not на другое место.
>Разница ведь в том, что я переместил not на другое место.
Ты скобочки забыл сделать вокруг выражения
Гугл изобрел го, что бы студенты могли сносный софт писать, с выразительность там полнейший пиздец, а такой перформанс, который он тебе предлагает тебе нахуй не нужен будет в 90% случаев
Я заметил что ща всякие сетевые штуки типа Yggdrasil онли на нем пишут
Заранее спасибо за помощь, няши.
у тебя есть два пути
1) пиши веб-приложение на жс (без питона)
2) пиши десктоп-приложение на pyside
на python+js не пиши, заебёшься вхолостую
Нахуй расчетную программу делать веб приложением? Потому что модно? Все 10 человек которым она может понадобиться не обосрутся скачать и установить.
>Нахуй расчетную программу делать веб приложением
>Все 10 человек которым она может понадобиться не обосрутся скачать и установить.
Извини, Сычев, но ебись ка ты сам со своей программой, мы лучше по старинке на калькуляторе.
Клиент-сервер ты понимаешь что такое? Если у тебя питон на сервере, как думаешь где вычисления выполняться будут?
Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках.
Во всех задачах считывайте входные данные через input() и выводите ответ через print().
Мой вариант - препод грит переделывай, все хуйня
n = int(input(150))
h = n // 60 % 24
m = n % 60
print(h, m)
А Вот ПИЗДОМРАЗЬ СЫЧЕВА МОЛОДЕЦ
n=int(input())
if n < 1440:
print( n // 60)
print(n - (n // 60 ) 60)
else:
if 1440 <= n < 2000 :
print( ( n - 1440 ) // 60)
print((n - 1440))
else:
if n >= 2000 :
print(( n - ( 1440 (n // 1440 )))//60 )
print((n-((n//1440)1440))- ((( n - ( 1440 (n // 1440 )))//60)*60))
сап
поступаю бесплатно в яндекс лицей на 2 курса
резы собеса дадут не позднее 1 октября (я уверен 95% пройду, тест сдал на 10/10)
таквот если в треде есть люди, которые учились там или преподают (лол), опишите, что думаете об лицее
С меня тонны нефти, в шапке книжек конкретно по нему не нашел
Хз, как тут принято скидывать целые проекты, но я залил сюда https://dropmefiles.com/0yDIP
В main.py есть описание принципа работы, в целом проблема такова, что при запуске main.py у меня почему-то срабатывают все импортирумые функции, хотя нужно, чтобы сработала только та, которую я выбрал. Пробовал по-разному втыкать конструкцию "if __name__ == main", но это ничего не дало.
Если я внутри функции делаю os.chdir(), то при выходе из неё программа вернётся назад или это изменит "глобоальный стейт" исполнения? Если второе, то как питонисто вернуться назад?
Рабочая директория это уровень процесса. Если тебе надо работать в конкретной директории то делай chdir, если нет, то работай с относительными или абсолютными путями, очевидно же.
есть регулярка
r'текст перед ссылкой - (https:[^\\]+)'
Суть - взять ссылку между текстом и \n. Проверил на regex101 всё работает бля. Засовываю в re.search и получается хуйня - возвращает во второй группе не только ссылку, но и всё, что после неё. ЧО ЗА ХУЙНЯ БЛЯДЬ
При импорте в любом виде импортируемый модуль исполняется от начала до конца.
Если ты не хочешь, чтобы какая-то часть исполнялась при импорте, надо её поместить внутрь
if __name__ == '__main__':
____ и вот здесь этот код
____ в том числе импорты можно делать здесь, но если ты так делаешь, то что-то у тебя не так в проектировании скорее всего
Что у тебя работает, даун? Ты ищешь любую последовательность до \. Так и пиши [^\n]+ или \S+
объясните как запустить этот скрипт
Бляяяяя, в regex101 конкструкция [^\n]+ не работала - тупо до конца текста всё собирал. Но в питоне это почему то работает. Спасибо, конечно, но какого хуя
python main.py
я вообще ничего не понимаю в программировании, пожалуйста объясните пошагово что нужно сделать чтоб запустить этот скрипт. чтоб, как там сказано, я в Своей Игре нажимал q и чтоб программа автоматом нажимала кнопку ответа в нужный момент
Из-за verbose мб?
Напиши в cmd (командной строке), что тебе сказали аноны (python main.py). Но сначала открой cmd в папке, где у тебя расположен код. Для этого нужно выделить расположение (адрес) папки в проводнике, написать cmd и нажать enter.
я сделал все как там написано, добавил пайтон в path list, в командной строке написал cd и вставил путь к папке, где находится скрипт, написал python main.py, но скрипт не запустился, а в командной строке просто появилась надпись Python.
и да, что этот скрипт вообще делает? как его юзать?
while True:
try:
if keyboard.read_key() == "q":
im = grab(childprocess=False)
r, g, b = im.getpixel((370, 7))
if r == 255 and g == 230 and b == 130:
pyautogui.click(x=1730, y=930)
pass
if keyboard.read_key() == "p":
break
except:
continue
>while True:
пока скрипт крутится
>try:
пытайся сделать следующее:
>if keyboard.read_key() == "q":
если нажата клавиша q
>im = grab(childprocess=False)
захватывай
>r, g, b = im.getpixel((370, 7))
RGB цвета пикселя в координатах 370х7
>if r == 255 and g == 230 and b == 130:
если красный - 255, зеленый - 230 и зеленый - 130, то:
>pyautogui.click(x=1730, y=930)
жми на точку в координате 1730х930
>pass
жди дальше
>if keyboard.read_key() == "p":
если нажата клавиша p
>break
гаси кампутер
>except:
кроме случая
>\tcontinue
когда продолжаешь работать
ну, он то и делает. он постоянное работает, если ты нажимаешь q, он делает скриншот, выбирает какой-то конкретный пиксель на экране, смотрит его цвет, если его цвет соответствует какому-то, нажимает на какое-то конкретное место. если нажимаешь p, он выключается. все ошибки и прерывания игнорирует.
если у тебя разрешение экрана другое или цвет кнопки изменился, то он не будет работать. ну и если ты кнопку перегораживаешь чем-то
Что значит "через python" запущу?
Что за херня во втором варианте, какие её 2000? делаешь n %= 1440 и дальше первый вариант уже.
Примерно одинаково. Компрехеншен все равно раскручивается в фор.
a.py
from b import x
from c import y
def some_method(some_var: x.SomeClass) -> None:
____y(some_var)
c.py
def y(some_var: x.SomeClass) -> None:
___pass
Так вот, чтоб эту аннотацию юзать, надо импорд делать только для аннотации?
def y(some_var: x.SomeClass) -> None:
У теюя питон не может устанавливать packages в то место, где питон установлен. Открой консоль как администратор и устанавливай.
А если оставить просто i*j во втором случае?
Будет видно, что кушоет аппенд.
Хотя я видел, что делают что-то вроде f = res.append и потом вызывают уже f, уменьшая расходы.
Потому что оно формируется динамически на клиенте.
>Так вот, чтоб эту аннотацию юзать, надо импорд делать только для аннотации?
Да, без импорта не получится.
Отдельно, в аннотации ты можешь как явно указывать тип
def some_method(some_var: x.SomeClass) -> None:
так и в виде строки
def some_method(some_var: 'x.SomeClass') -> None:
что решает многие проблемы, когда ниже какие-то классы декларируешь. Иногда без этого в принципе нельзя. Но описанную тобой проблему это не решает.
Без явного импорта просто невозможно понять, какой тип ты на самом деле ждёшь. У тебя SomeClass может быть в десятке модулей определён.
Да, ты же по сути работаешь в своем модуле с этим объектом, импорт произойдет и так, только через другие библиотеки.
Хотя хотелось бы что бы в всеобщую культуру написания питонокода начали входить интерфейсы
Ну это то я понимаю. но не обращаться же через объект приложения к бд для селекта
Пробрасывать инстанс бд в другие объекты и из них юзать, если нет глобального неймспейса
>Ну это то я понимаю. но не обращаться же через объект приложения к бд для селекта
Так во всех веб фреймворках делается
>Хотя хотелось бы что бы в всеобщую культуру написания питонокода начали входить интерфейсы
Зачем? Ты мыслишь категориями языков вроде Java
Питон хорош тем, что там предусмотрели аннотацию типов очень давно. Пусть изначально она была больше в виде заглушек и декларации о намерениях.
Но в JS такой возможности нет, поэтому там придумывают компиляторы TypeScript, независимый язык, компилируемый в JS. В PHP посмотрел, подвезли какую-то аннотацию в версию 7.4, то это ноябрь 2019, меньше двух лет назад.
В питоне же есть typing, с хорошей поддержкой в самом движке при этом. Объекты имеют свойство __annotations__, доступное в рантайме, очень много что можно сделать за счёт этого, если захотеть.
Насчёт того, почему не надо интерфейсов. Интерфейсы - это необходимость для компилируемых языков, без интерфейсов просто нельзя чисто технически передать какой-то объект в функцию. В функцию необходимо передать адрес таблицы виртуальных функций, которые что-то нужное делают.
В питоне duck-typing, в питоне основное понятие не "интерфейс" (таблица функций), а "протокол", соглашение о том, какие функции нужны.
И в typing сделали поддержку для этого, начиная с версии 3.8
https://docs.python.org/3/library/typing.html#typing.Protocol
Просто описывается протокол, то есть набор методов, который должен реализовывать класс.
А сам класс не нужно наследовать от этого протокола. За счёт этого нет того леса из иерархии зависимостей, как в Java.
При этом проверки намного более точные и гибкие, чем когда ты просто наследуешь свой класс от какого-то интерфейса и в аннотации указываешь интерфейс.
В общем если хочется грамотно писать, по высоким самым современным стандартам - надо через протоколы.
>Зачем? Ты мыслишь категориями языков вроде Java
Это есть не только в джаве и я не говорил, что нужно реализовывать так же. Необходимо разделять контракт и его имплементацию, выше уже привели пример протоколов, по сути как в ГОвне интерфейсы сделали и это правильно. Правда пока это мало кто делает и слишком сильно заигрывают с динамичностью из-за которой нихуя непонятно что за объект выдает та или иная функция сторонней либы, что даже в небольшом проекте вызывает лютую жопоболь.
>Это есть не только в джаве и я не говорил, что нужно реализовывать так же.
Но реально ключевое, как это технически реализовывать.
Подход в стиле Java это
class MyClass(BaseClass, InterfaceA, InterfaceB):
....
Где
class InterfaceA:
____def foo(self, par:str) -> None:
________raise NotImplementedError()
а дальше ты определяешь функцию
func(value:InterfaceA):
....
Это вот такой конкретный подход в Java-стиле. Многие, кто пришёл с этих языков, пытаются так писать. Вот не надо категорически. Очень порочное и тупиковое решение из мира компилируемых языков. На компилируемых платформах просто сложно сделать лучше.
Для современного питона есть решения намного лучше. Они намного лучше соответствуют концепции "контрактного программирования", более гибкие и прозрачные, лучше поддерживаются.
> пока
Это довольно новые технологии для питона, только в свежих версиях они дошли до уровня, когда полезны.
Инертность есть, надо изучить, привыкнуть, паттерны наработать. Плюс код в библиотеках старых и библиотеки принято писать, чтобы поддерживать относительно старый код.
Но очевидно, что к этому движутся довольно активно. Сейчас в питоне активнее всего вокрут типов что-то новое придумывают.
>Это довольно новые технологии для питона
Тайпинг завезли еще в 2015 году вместе с asyncio и при этом мало кто спешит дорабатывать свои либы
Как-то завезли, но в каком-то нерабочем виде.
Я сейчас стремительно дорабатывают. То есть вот например куча фич появляется только в 3.8, в 3.9 кучу всего добавили.
Протоколы упомянутые в 3.8 появились. Слёту Literal, очень полезная штука, тоже в 3.8. Хотя это фиксится через typing-extensions, но всё равно, это пока развивающиеся технологии.
Причём asyncio тебе даёт принципиально новые возможности, а typing это всё-таки чисто опция, поддержку кода улучшить, без него тоже работает. Поэтому конечно не так резво будут внедрять.
Но очевидный крен есть в эту сторону.
Документация:
https://dash.plotly.com/cytoscape/elements
Код:
https://ideone.com/bEVbCb
>Invalid argument `elements` passed into Cytoscape with ID "cytoscape-elements-basic".
Как передать созданный список словарей на место elements?
elements по идее должны пустыми, потому что в ходе программы будут заполняться, но почему-то сейчас вылезает ошибка.
Что не так?
Fastapi неплох, все есть.
Так я в зависимости от условия генерю список словарей и подаю на выход:
return [{'data': {'id': x}} for x in some_list]
вот только почему-то в таком виде вылетает ошибка. Хотя судя по документации, это правильный формат.
Если кто хоть что может подсказать, буду прищнателен.
Есть класс. Нужно его заполнить и отправить в качестве жсона. Но класс не совпадает со структурой модели из БД.
нужна твоя помощь с Jinja2
я нихуя не погромист и никогда им стать не хотел, но жизнь сложилась необычно и теперь мне нужно писать код
так вот, помоги решить 2 задачи
первая:
мне нужно за день до отправки посылки каждому челу отправлять сообщение с инфой, ровно в 14:00
как посчитать время, которое нужно выставить для ожидания с момента попадания человека в сценарий до 14:00?
вторая
за час до отправки посылки мне так же нужно отправить еще одно сообщение
КАК ЭТО СДЕЛАТЬ КОДОМ, ПОМОГИТЕ
Есть джанговская вьюха, которая принимает эксель-файл, через опенпайхл его парсит в памяти и отдаёт результат.
Если файл прошёл валидацию, его дальше нужно обрабатывать, т.е. идёт новый запрос к другой вьюхе.
Вопрос: как в памяти держать объект Workbook, чтобы не приходилось файл заново обрабатывать? Либо так не получится, и нужно его где-то хранить на диске, например NamedTemporaryFile?
ну дада дохуя прогер на джаве нашелся
или на плюсах
или на шарпе
или на чем угодно кроме jinja2
спасибо, что откликнулся, но сам разобрался
Хуевая архитектура. Сохраняй файл в сторадж и кидай задачу в селери, а потом пиши результат в БД
Есть какие-то подходы/рекомендации/методы/инструменты для обновления тухлых проектов?
Так чтобы хоть какое-то направление получить, куда копать и как, чтобы сломать по минимуму.
Спасибо анон, это помогло.
Но блин, вылезла новая трабла - как в селениуме добавить заголовки?? попробовал selenium-wire, но после первого перехода перестают открываться страницы с ошибкой "selenium-wire". Как решить эту проблему?
Ссука, шутки за 300. Проиграл зачем-то.
Главное, что сильная типизация.
Маловато будет. Дохуя пакетов. Проекту 5 лет, наверняка мажорные версии сломают кучу всего.
К тому же и сам питон хотелось бы обновить. Вот даже не знаю, с чего начать.
Не работать там, где есть много говнолегаси
А вообще, я бы сначала обновил все библиотеки и прогнал бы тесты (они же там есть и покрывают бизнес-логику?)
Да тесты есть на каждый пердеж. Ну в целом складывается ощущение, что какой-то супер страты для обновы нет. Ебошишь и смотришь что сломалось. Хуево, конечно.
Фулстек что ль? Никому они уже не нужны
А вообще react с джангой не идут. Можешь DRF подрочить или fastapi, но джанга уже понемногу умирает
Это фреймворки для построения апишек, как флас (который действительно умирает), причем тут замена хтоничной джанге?
>Это фреймворки для построения апишек
Ты всё правильно понял. Сейчас рыночек в основной такой, что бэк пишет апишку, а фронт пишет приложение на реакте и её дёргает. Всё то, что использует чистую джангу, скорее всего является легаси.
К тому же, ты же спрашивал про то, много ли вакансий на стек React + Django. Ответ: нет, но связка react + DRF/fastapi много где используется, так что смею предположить, что и пригодится такой фулстек куда-нибудь.
Для DRF все равно придется знать джангу, потому что джанга огромна и всеобъемлюща, а в нем выкидывается только шаблонизатор
Да, но учитывай и то, что отличие DRF от Django не только в том, что "темплейты выкидываются". В самом DRF куча всего, что нужно знать, чтобы им комфортно пользоваться. Так что после джанги всё равно посидеть ещё придётся
Заранее спасибо.
Чтобы не срать этими None на каждый случай None.
Просто я стал смотреть книжки по Django за 2020-2021 год и там зачастую React или Vue используются.
А еще на апворке смотрел заказы, там регулярно встречается связка React + Django или React + Ruby on Rails.
Алсо на hh.ru:
290 вакансий «react django»
155 вакансий «vue django»
Количество ответов по запросу ничего тебе не скажет, потому что:
1) По запросу "django" может выйти "django rest framework"
2) Иногда пишут "Желательно знать django", а вакансия вообще на PHP утрирую
3) Как я и сказал, есть вакансии на django, но они с легаси. Хочешь копаться в этом? Ныряй.
А вообще, давай мы вернёмся к первому твоему вопросу.
>Много вакансий с таким стеком?
Ты же сам на него ответил:
>на hh.ru:
>290 вакансий «react django»
>155 вакансий «vue django»
Так зачем спрашивал?
Я подразумевал скорее востребованность и актуальность относительно других технологий для бэкенда, а не конкретное число вакансий. Кроме hh.ru есть же множество других площадок для поиска работы.
>Так зачем спрашивал?
Ну теперь понял, что Django неплохо бы освоить, но в дальнейшем стоит смотреть упомянутые тобой штуки.
Он жрет только одноуровневый, а типа {'a': 1, 'b': {'a': 1}} уже нет. Сериализатором нельзя, он ожидает словарь на входе.
Сериализуй в json и передай в редис {"data": "your_json_here"}
Это же от требований зависит, если фронт "умный" и может сам менеджить данные, то можно юзать GraphQL, а если нет то и нахуй это не всралось
Нормальные люди не используют python для дестктопных приложений, точка. Учи Java/C#/C++, точка.
Хватит, у маска хватает. Хотя по факту его программисты изобрели урезанный аналог qt.
В случае джанги и его орм очень просто юзать графкуэль, в остальном это ебля с оптимизацией запросов к БД + нельзя сделать нормальное кеширование + ебля с проверкой прав доступа.
Из 40 отправленных резюме мне ответило только 3 HR, 14 человек написали что не подхожу, остальные заигнорили.
Первый HR
Прошли с ней общение, сказала идем на тех собес, я обрадывался, следующий тех собес назначен сразу на некст деньги, я немного подготовился, немного запросики повторил и т.д.
Результат тех собеса:
Меня не спросили не одного вопроса по питону, 80% вопросов было по БД и оптимизации запросов, я все это почти провалил.
Пришел ответ от HR :Вы нам не подходите
Следующие два собеседования -
Мне отослали тестовое,первое я выполнил минут за 30, второе за 3 часа, хотя давали до 7 дней там и там, но мне не ответили, а там вышло строчек 50 кода в 1 и строчек 300 в другом, все четко, просто игнор.
У меня уже жопа горит, я блять не знаю, я готов за копейки работать ради первого опыта, но даже шанса не дают попасть на тех собес, а тестовое задание такая хуйня.
>ИМХО, если вы самоучка и не успеете запрыгнуть до ~2022 года вы в провале
Никогда так не говорили! Еще бы найти ту древнюю шешебку, где на соц рекламу наложили пасту про вкат и коммиты в одну ветку
А вам говорили про нетворкинг. Я вот учусь в максимально провинциальном говновузе по айти специальности, учат хуйне полной, но один из одногруппников оказался пиздец пробивным челом и уже на третьем курсе синьором-помидором стал в одной галере. И тут включается кумовство непотизм нетворкинг, с минимальным собесом взяли джуном в эту контору. Ну он меня не напрямую протянул если что, у него таких полномочий нет и в принципе он фронтенд. Короче заводите правильные знакомства, пацаны.
40? Это же очень мало. И в других сферах тебе тоже никто не ответит, дело не в проганье.
Один хуй разницы. Все упирается в знание инструмента
Возьми Electron
>второе за 3 часа
> строчек 300 в другом, все четко,
Как можно за 3 часа высрать 300 строчек и что за лютый пиздец будет вместо кода, если так писать? Если не копи-паст из другого места и старых наработок, конечно.
В питоне для описания типов есть два механизма. Один это "абстрактные классы", второй typing.
Вот это сбивает конкретно, на что вообще смотреть и что скорее использовать? Даже официальных рекомендаций нет. typing вроде более новый, активно развивается, но в официальных доках в typing часто идёт отсылка к abc.
abc нравится тем, что вот красивая поддержка рантайма, можно всякие isinstance делать, хотя класс реально не наследован. Но тяжеловато и есть ощущение legacy. А typing вроде как модно и молодёжно.
Если я хочу какие-то свои типы-протоколы задекларировать, через что лучше делать, на 3.8+?
typing — это про type hinting (статическая типизация на минималках), abc и abstractmethod — это про интерфейсы. Два совершенно разных инструмента, а ты их в одну кучу смешиваешь
> Если я хочу какие-то свои типы-протоколы задекларировать
Что именно и зачем?
Смысл в том, что мне надо как-то задекларировать тип объекта, который я могу передавать в фунцию. У объекта должно быть несколько методов, то есть это "протокол".
Можно пытаться как-то описать это через abc, сделать там тип MyProto, можно через typing, в 3.8 для этого сделали typing.Protocol
https://docs.python.org/3.8/library/typing.html#typing.Protocol
abc интересны тем, что там возможность проверки в рантайм есть, через isinstance. typing интересен тем, что модули вроде mypy делают более глубокие проверки, на соответствие методов тому, что надо, а не просто наличие этих методов, что вообще важно.
А вообще, я как-то серьёзно этими технологиями не пользовался, но сейчас понимаю, что пора понимание улучшать в этой части.
Кмк, ты пытаешься решить абстрактную задачу, оттого и нет хорошего понимания, каким путем пойти. Лучше все же решать реальные и конкретные задачи.
> мне надо как-то задекларировать тип объекта, который я могу передавать в фунцию
Зависит от того, зачем тебе. Если ты хочешь сделать интерфейс метода более понятным для программиста — добавь type hint-ов. Про type hinting есть мотивационный PEP, не помню номер. Там отлично описано, как работать с кастомными типами данных и с generic-ами. Но type hinting — это не совсем про улучшение читаемости кода, это больше про линтинг через mypy.
С abc тоже интересная история. Чаще всего, они больше усложняют код, нежели упрощают. Поэтому надо смотреть на конкретную задачу
По теме, советую книжку Expert Python Programming, там как раз есть главы про это все
У меня задачи как раз самые что ни на есть практичные.
Я передаю какие-то объекты в функции-методы, пихаю их в очереди. При этом мне надо задекларировать тип, чтобы было понятно, что от объекта требуется.
Даже в форме лёгкого деанона. Есть класс, который делает обработку сложных данных. Там есть методы "подгрузить данные", и в зависимости от того, что за данные, могут быть какие-то события возникать.
Для обработки этих событий класс имеет что-то вроде коллбэков. Но точнее, мне хочется туда передавать объект вида "очередь", а точнее объект, имеющий методы вроде put_nowait. Это может быть как обычная очередь queue.Queue, так и asyncio.Queue, так и специальный мой класс совсем другого рода, то тоже имеющий такой метод.
Я столкнулся с тем, что хочется как-то описать этот тип, те метода, которые в нём нужны, но я не очень понимаю, как это грамотно сделать.
class ComplexDataHandler:
def load_data(self, data: pandas.DataFrame):
…
Можно еще проверку добавить, если сильно нужна:
assert isinstance(data, pandas.DataFrame), ‘Хуйню передал’
> передавать объект вида "очередь", а точнее объект, имеющий методы вроде put_nowait. Это может быть как обычная очередь queue.Queue, так и asyncio.Queue, так и специальный мой класс совсем другого рода, то тоже имеющий такой метод
def func(queue: typing.Union[queue.Queue, asyncio.Queue, CustomQueue]):
…
Если правильно понял, то тебе type hinting-а будет достаточно
https://www.python.org/dev/peps/pep-0484/
>По теме, советую книжку Expert Python Programming, там как раз есть главы про это все
Глянул, на удивление находится по первым ссылкам книжка. Про эту тему там похоже ничего адекватного нет и вообще книжка хоть и свежая, но уже устаревшая. Она про 3.7, а очень много по тебе добавилось в 3.8+.
Но вообще по некоторым другим темам, более серьёзным, книжка смотрится очень интересной и полезной, на первый взгляд, стоит изучить, так что спасибо.
>>171953
>def func(queue: typing.Union[queue.Queue, asyncio.Queue, CustomQueue])
Вот это смотрится очень грязно и костыльно. Я не хочу привязываться к конкретным функциям в принципе. В частности потому, что я хочу, чтобы можно было передавать любой тип, главное, чтобы там были определены некоторые меторы. В объем условно "реализован интерфейс", но без наследования от интерфейса.
Чтобы был полноценный duck typing.
В принципе в typing есть для этого typing.Protocol. Я даже как-то пока так сделал, работает. Но нет уверенности, что я делаю идейно правильно.
> хочу, чтобы можно было передавать любой тип, главное, чтобы там были определены некоторые меторы. В объем условно "реализован интерфейс", но без наследования от интерфейса
Тогда через abc и abstractmethod, если тебе более-менее каноничный способ нужен. В книжке, которую кидал, как раз есть пример. Но
> без наследования от интерфейса
Не понятно, откуда такое желание. Явное лучше неявного, все таки. Если у тебя слишком обобщенный и универсальный интерфейс -- это может создать лишнюю сложность. Простой интерфейс -- это один из критериев хорошо спроектированной системы
Кстати оказывается всё намного проще, если в питоне 3.8, или если испольовать typing_extension в более старых версиях.
Есть специальный декоратор
@typing.runtime_checkable
который позволяет для протоколов делать проверку через issubclass и isinstance. То есть мне не надо самому абстрактный класс реализовывать, всё typing делает за меня.
Я пишу
@typing.runtime_checkable
class TypeQueue(typing.Protocol):
____def put_nowait(self, element):
________... # рекомендуется именно троеточие
и после этого
def foo(q: TypeQueue):
____ code
и не только mypy отловит, но и в коде я могу сделать
def foo(q: TypeQueue):
____ if not isinstance(q, TypeQueue):
________ raise TypeError
и всё будет работать.
Но в рантайме оверхед, конечно, и проверка ограниченная - только наличие методов. mypy может проверить соответствие методов более детально. Но зато просто в коробке.
И не нужно никакого наследования от интерфейсов.
Я могу использовать queue.Queue или asyncio.Queue, или любую чужую библиотеку и не вносить в них изменения никакие.
Вот это реально здорово.
Кстати оказывается всё намного проще, если в питоне 3.8, или если испольовать typing_extension в более старых версиях.
Есть специальный декоратор
@typing.runtime_checkable
который позволяет для протоколов делать проверку через issubclass и isinstance. То есть мне не надо самому абстрактный класс реализовывать, всё typing делает за меня.
Я пишу
@typing.runtime_checkable
class TypeQueue(typing.Protocol):
____def put_nowait(self, element):
________... # рекомендуется именно троеточие
и после этого
def foo(q: TypeQueue):
____ code
и не только mypy отловит, но и в коде я могу сделать
def foo(q: TypeQueue):
____ if not isinstance(q, TypeQueue):
________ raise TypeError
и всё будет работать.
Но в рантайме оверхед, конечно, и проверка ограниченная - только наличие методов. mypy может проверить соответствие методов более детально. Но зато просто в коробке.
И не нужно никакого наследования от интерфейсов.
Я могу использовать queue.Queue или asyncio.Queue, или любую чужую библиотеку и не вносить в них изменения никакие.
Вот это реально здорово.
Так а если нужно что-то простое и кроссплатформенное? Какой-нибудь wxPython вполне норм, вроде.
>Тогда через abc и abstractmethod
>Не понятно, откуда такое желание
И как он заставит asyncio.Queue унаследовать от этого ABC? По-моему, Protocol как раз единственное разумное решение здесь.
Спасибо.
В документации достаточно инфы, тебе нужно книги по распределенным системам смотреть что бы не обосраться с асинхронностью, потому что когда дело доходит до изменения стейта начинается лютая жопа
Когда ты начинаешь работать любой более-менее большой системой с очень большой вероятностью она будет многопоточной. Причем ты даже в однопотоке можешь обосраться. И вообще, асинхронность и многопоточность это ортоганальные вещи.
Вот например, есть у тебя состояние, тебе нужно получить и изменить его если оно соответствуюет определенным условиям.
async def change_state(state_id, new_data):
____state = await get_state(state_id)
____if state.available:
________state.data = new_data
________state.available = False
________await set_state(state)
Вроде бы ничего такого, если у тебя эта функция запрашивается не особо часто. Но если ебошить дохуя запросов так, что бы изменение стейта в одной корутине происходило раньше чем его проверка в другой, то у тебя скорее всего проебется консистентность.
Это называется гонка состояний
https://ru.wikipedia.org/wiki/Состояние_гонки
https://leetcode.com/problems/minimum-time-visiting-all-points/
В 6 строчке у тебя зачем-то and вставлен
чот ты сложна сделал
Тут больше интересно, что ты никогда не видел книг от орайли. Вкатываешься с нуля за три недели первый день?
База данных у меня что-то типа postgres_test, потом идёт схема mysuperapp и аж потом таблица test
То я типа теперь должен используя sqlalchemy в модели постоянно дописывать
__tablename__ = "test"
__table_args__ = {"schema":"mysuperapp"}
? Оно-то работает и строчка туда сюда, но мне чет не нравится так дописывать и вроде у других в коде такое не видел. Что мне надо поменять, чтобы просто было без типа того тэйбл аргс?
При этом при подключении я же писал что-то вроде
postgresql+asyncpg://user:password@localhost:1337/mysuperapp
Ну это оно базу данных определило, а дальше схема с таким же названием и её уже указываю
Типа postgres_test -> mysuperapp -> mysuperapp -> test
оказывается надо просто использовать готовую схему public, а не создавать свою)) сразу понял как включил после отдыха
Спасибо.
Аноны, посоветуйте ресурс или книгу чтобы научится писать качественный код на сабже? Работаю в R§D уже 4 года, язык знаю но мой код похож на парашу может есть чтото для чистоты и качества кода именно
Экранирование запросов, как и в любом другом языке
Почитай про Prepared statement
Да, оно, спасибо.
https://ideone.com/30nLbH
бамп
Я бы подрубал линтер и смотрел на ошибки, которые он находит.
бамп
бамп
бамп. что не так?
СПАсибо бОльшое БРатец Питонус!!!!!!
https://www.onlinegdb.com/online_python_compiler
что не так??
бамп
Что ты со своими бампами заладил? Что ты вообще пытаешься делать и почему ты считаешь, что твой код должен что-то печатать?
Поставь отладочную печать и посмотри значения.
Сделал через aiomisc сервис типа PeriodicService
В коллбеке парсятся данные и делается сохранение в бд. Почему-то именно сохранение не отрабатывает и обрывается из-за raise RuntimeError('Event loop is closed')
Сильно палками не бейте, асинхронщину учу недавно. Почему цикл закрывается до окончания работы запроса?
python3.9
Скорее всего ты запускаешь какую-то задачу и реально не ждёшь её окончания.
Очень часто когда ты пишешь в функции main()
await something.run()
на самом деле что-то просто запускается в фоне и ты окончания не ждёшь. Это самая обычная история.
Попробуй в конце фунции main(), или той функции, которую ты через asincio.run() запускаешь, сделать await asyncio.sleep(10). Вот чтобы не закрылось всё сразу.
про aiomisc ничего не знаю.
отладочная печать ничего не умеет. я просто хочу выяснить что не так с этим кодом, где я не соблюдаю синтаксиса, я не могу понять почему код ничего не выдает!
https://onlinegdb.com/66UjCXc--
Тебе не кажется, что программирование это не совсём твоё? Код ничего не выдает, потому что условие x==297 and d==117 у тебя не выполняется ни в одной итерации цикла. Чтобы наглядно в этом убедиться, достаточно посмотреть значения d, в случае если x=297, d не принимает 117.
Если тебе нужно, чтобы принт срабатывал в случае если хотя бы одно условие верно, нужно использовать or вместо and.
мне просто задачку по математике надо решить, знаю, что не мое,
> Код ничего не выдает, потому что условие x==297 and d==117 у тебя не выполняется ни в одной итерации цикла. Чтобы наглядно в этом убедиться, достаточно посмотреть значения d, в случае если x=297, d не принимает 117.
но спасибо за инфу, все понял,
>про aiomisc ничего не знаю
Просто вспомогательная либа, где наборы классов для готовых сервисов сделаны.
Бд сразу закрывалась после установления соединения, она же и закрывала цикл.
Благодарю
теперь подумай, почему у тебя было неправильно. почитай там описание синтаксиса, функций всякое такое
а я поздно проснулся. ну пох
Как это все применить в практической плоскости?
>Начинай писать свои проекты
Так я пишу, вот по работе недавно хуитку для автоматизации написал. Там и модульность, и аутентификация, и запросы из разных баз данных, и запись в третью базу данных, и форматирование данных, и даже работа с гитом и ci/cd. Но это все функциональщина, а вот как перенести логику функций, когда алгоритм просто следует от предыдущей операции к следующей, на логику классов, когда есть все вот эти полиморфизмы, наследования и инкапсуляции - вот это я вообще не представляю. И примеры с class Animal вообще не помогают.
>это все функциональщина
Это плохо, что ли? Наоборот, хорошо. ООП нинужен, уже тем более насильно его пихать.
Очень полезно даже не самому писать, а с чужими проектами разбираться, как они устроены, работают и т.п. С какими-нибудь небольшими.
А к ООП надо самому придти, чтобы понять, зачем это надо. И смотреть, как это реально используют. Потому что на задачах, что можно в примитивных примерах изобразить, смысла в ООП нет никакого. А на реальных имеет, хотя не на всех задачах.
Пока не известно, в ближайшие лет пять начинать обсуждать не планируют.
Models:
class Requirement(RegistryRequirement):
req_id = CharField(max_length=20)
guid = UUIDField(unique=True, default=uuid4)
created = DateTimeField(default=datetime.now)
updated = DateTimeField(null=True, default=None)
class Meta:
database = source_db_proxy
db_table = 'requirement'
class RequirementDescription(RegistryRequirement):
content = TextField(default=None, null=False)
publication_status = TextField(default=None, null=True)
publication_date = TextField(null=True)
work_status = TextField(default=None, null=True)
regulation_level = TextField(default=None, null=True)
act_requisites = TextField(default=None, null=True)
act_text = TextField(default=None, null=True)
valid_to = DateField(default=None, null=True)
validity_status = BooleanField(default=None, null=True)
object = TextField(default=None, null=True)
compliance_list = TextField(default=None, null=True)
compliance_list_ext = TextField(default=None, null=True)
req_guid = ForeignKeyField(
Requirement, to_field="guid", backref="descriptions", on_delete="cascade"
)
Select query
query = (
db_source.Requirement
.select()
.join(db_source.RequirementDescription)
)
for q in query:
print(q.guid, q.descriptions.content
Models:
class Requirement(RegistryRequirement):
req_id = CharField(max_length=20)
guid = UUIDField(unique=True, default=uuid4)
created = DateTimeField(default=datetime.now)
updated = DateTimeField(null=True, default=None)
class Meta:
database = source_db_proxy
db_table = 'requirement'
class RequirementDescription(RegistryRequirement):
content = TextField(default=None, null=False)
publication_status = TextField(default=None, null=True)
publication_date = TextField(null=True)
work_status = TextField(default=None, null=True)
regulation_level = TextField(default=None, null=True)
act_requisites = TextField(default=None, null=True)
act_text = TextField(default=None, null=True)
valid_to = DateField(default=None, null=True)
validity_status = BooleanField(default=None, null=True)
object = TextField(default=None, null=True)
compliance_list = TextField(default=None, null=True)
compliance_list_ext = TextField(default=None, null=True)
req_guid = ForeignKeyField(
Requirement, to_field="guid", backref="descriptions", on_delete="cascade"
)
Select query
query = (
db_source.Requirement
.select()
.join(db_source.RequirementDescription)
)
for q in query:
print(q.guid, q.descriptions.content
Это peewee, забыл указать
про абстрактные фабрики читал?
допустим есть
common.py
main.py
а нужно получить скомпилированный в виде одного.
python -OO -m py_compile common.py main.py
создают два файла и соответственно их нельзя запустить, компиляция нужна под linux и windows
Если тебе нужен исполняемый бинарник, не зависящий от питона, это одна история. Nuitka как вариант.
Если тебе нужно просто в виде одного файла собрать, то там другие опции есть, в виде архива собрать (причём вместе с зависимостями можно) и потом архив запускать. Но для этого нужно будет, чтобы питон был в системе.
https://docs.python.org/3/library/zipapp.html
Django By Example
А есть годные обфускаторы кода? Просто держать проект на сервере заказчика опасно, кто знает сегодня он платит а завтра заберет себе проект и будет сам им заниматься.
Работай с байткодом
И правильно сделает, лучше сторониться такого зловредного говна как ты.
Учись работать нормально.
Тогда или компиляция в бинарник, или надо предоставлять сервис, а не код, или/и прописывать всё в договорах.
Байткод не решение, по питоновскому байткоду исходный код восстанавливается практически один в один.
Мне казалось, что ООП - это де-факто стандарт индустрии, вообще любого языка. А если я пишу код на функциях, то это какая-то хуета. Разве нет?
https://www.youtube.com/watch?v=QyJZzq0v7Z4
ООПщики сами от своих вещей отказываются, вроде наследования.
Вот нахуя так сразу срезать? Чот грустно все это
>да на степике чот сертификаты какие-то получил никому не нужные
Чем этот принцип отличается от университетского?
>ну дома книжки чот читал, что на дваче советовали
А что такое образование? Преподование в узкоспециализированном месте набор фактов? По какому критерию оно отличается от набора фактов, полученного дома от книг, или других медия носителей?
Образование по факту нужно для социализации (если ты соц. выблядок, который ищет друзяшек), и ради индокринации. Причём последнее было с раннего существования этого социальнного института, а именно в римской империи.
Если ты в свои года не понял - что образовани spook времён либерального просвещения объёб гоев на бабки, мне тебя жаль.
Ну ты и додик, когда был джуном, то обмазывал резюме сертификатами мейла и степика. Залетел в ойти в с первого собеса.
Хочу сделать бота для линейки через библиотеку pyautogui, но блин, линейка не регестрирует клики, что нужно использовать, чтобы клики регались в линейке?
Как правильно организовать хранение файлов? Ну для своего проекта, просто отдельный каталог? И еще, прям всегда следует nginx использовать для отдать статики? Ну т.е. картинки-то понятно, а видео, например? Если я чанками отдавать хочу? И вообще, есть какая-нибудь альтернатива для обслуживания статики, кроме nginx? Интересует что-нибудь в асинхронных фрейворках. У многих есть что-то вроде serve_static, но это для чего, если не рекомендуется использовать?
Пока код не сильно отличается от стандартных примеров, выделение объектов не нужно.
А вот когда что-то действительно свое пишешь, у этой штуки появляется свое состояние и интерфейс, который в глобальной области вообще не к месту, ему бы свою область сделать. Вот с этого и начинается ООП. Когда хочется сгруппировать все в папочки и навести порядок.
На твоём говносайте канал закончится, когда там 10 человек будут видео смотреть. Только CDN тебе поможет.
Так ты не загружаешь на cdn свою статику, он запрашивает у тебя, а потом только кеширует. Ты хоть почитай что советуешь. Я спрашиваю, как организовать хранение статики, а не как быстро доставлять её в любую точку
>Так ты не загружаешь на cdn свою статику
Это зависит от CDN, например, s3 хранит все данные у себя, а ты просто встраиваешь в свой сайт ссылки
Тот самый s3, который может откручивать в минус твой баланс и ты потом квартиру должен продать, чтоб рассчитаться за счет от ddos по запросам?
Если ты проебался с настройками оплаты, что бы не уходить в минус это твои проблемы.
В любом случае жирный контент это не то, что ты должен хранить у себя.
А как ты настроишь его?
Если только метрику по количеству запросов делать будешь или считать сколько у тебя биллинг. Т.к. бабки у тебя откручивает не в реал тайме, а через час-два или больше. Так что загнать тебя в минус не так уж и трудно. Компании и обычные люди жаловались на то, что нет возможности настроить чтоб твое облако уведомляло о приближении нуля или вовсе отключалось, если ты зашел за определенную сумму. Амазону то выгодно
>Если только метрику по количеству запросов делать будешь или считать сколько у тебя биллинг
У них есть AWS Budgets, где за тебя это делают, можешь алерт на каждый процент поставить
https://aws.amazon.com/blogs/aws-cloud-financial-management/getting-started-with-aws-budgets/
Ёмаё, сегодня целый день пытался обойти эту шнягу, вроде называется Smart Guard. Даже AHK не работает, может кто знает, как обойти эту штуку? Все библиотеки испробовал...
Хуйня для защиты от автоматизации не дает тебе что-то автоматизировать? Удивительно.
Ну что тут можно сказать - бери книгу по с++ и учи, сделаешь драйвер и обойдешь его на уровне ядра. Как сделаешь, приходи.
но почему для линейки нет библиотек, которые могут обойти её...
Я ещё нуб, не знаю даже в какую сторону искать или что делать.
Ты тупой что ли? Как ты себе это представляешь?
- Да, мы создаём и продаём софт с защитой от ботов и читеров
- Да, мы знаем, что есть библиотечка на питончике, которая шлёт нахуй всю нашу систему
Серьёзно блять?
Что, уже деменция начинается?
С опытом куришь ддк и можно опционально навернуть тот же шиндовс интерналс.
Уже есть. Пикабу зовётся
>Вот с этого и начинается ООП. Когда хочется сгруппировать все в папочки и навести порядок.
Ну хз, разве не для этого как раз модульность нужна? Вот на примере моей приложухи - есть точка входа main.py, есть папочка controllers, в ней по отдельному .py файлу для контроллеров баз данных, отдельно лежит аутентификация, в /app лежит логика, в /output лежит выход. Вроде норм все расфасовано по папкам.
Операционную систему.
В моем понимании модуль это то же самое что и библиотека, набор функций без состояния.
Вот пример, когда мне кажется очевидно преимущество ООП, это Micropython. Класс SPI работает одинаково для аппаратного и программного варианта. То же самое с таймерами и другой периферией.
Если даже в таком случае тебе проще сделать функции отдельно, данные отдельно, то я даже не знаю, наверное тебе ООП ни к чему вообще.
Если при виде полноценной задачи (а не задачки в три строчки) ты не дрищешь в штаны и знаешь, что делать. Все эти градации отделяет лишь сложность таких задач.
Если я могу, но с гуглом?
А главное разработано и то, и другое одними и теми же людьми!
Если сможешь за недельку накидать фронтенд алгола-68 для llvm, то поздравляю- ты больше не стажер.
>На твоём говносайте канал закончится, когда там 10 человек будут видео смотреть. Только CDN тебе поможет.
Стоимость трафика на CDN раз в десятки раз выше, чем трафик на vps/серверах. Если у тебя заканчивается трафик на рядовом vps/dedicated сервере, то это значит, что ты бы на AWS уже заплатил за него сотни долларов. Тогда как впс такая стоит десятку.
Никак, иди в перл.
CDN будет выгоднее, когда у тебя большая нагрузка, но редкая. То есть скажем в основном у тебя тишина, а потом бац, и прямой эфир с большим трафиком.
Иначе ты будешь платить сильно больше. Причём тут уже очень кусачие цены, потому что видео реально отжирает.
Вот оценки. Если ты вещаешь в 3 мегабита, то час трансляции у тебя будет 1 гигабайт примерно. Если твою часовую трансляцию смотрит 1000 человек, то ты истратишь террабайт. По тарифам амазона ты должен будешь за одну эту единственную трансу заплатить 50-100 долларов. При том, что всего 1000 человек.
Если же ты берёшь себе сервер с лимитом трафика, но с большими лимитами, то там куда скромнее цифры. Вот, например, меньше 1200 долларов в месяц, 10 гигабит подключение и 500 тб трафика. По тарифам амазона 500 тб это больше 20 тысяч долларов. Я сейчас не смотрю на unmetered тарифы, там скорее всего просто очень много пользователей сидит и ты большой канал не выжмешь.
Вот пример:
https://www.esited.com/hosting/10g-dedicated-server/
про этого провайдера ничего не знаю, просто тут с явно прописанными лимитами и при этом 10 гигабит порт.
Вещать стримы на AWS и аналогах можно только в том случае, если по подписке за деньги полноценные, что каждый пользователь реально не меньше 10 рублей в час платит за то, что смотрит.
python skylift/cli_jobs.py wigle_api --ananas --wigle_api_key QUlEMjJiODA3ODk1ZTFjNGNzA2NDE= --jobs data/jobs/wigle_api.csv
File "skylift/cli_jobs.py", line 109
fp_wigle = join(job.path_in, f'{job.filename}.csv')
python skylift/cli_jobs.py
File "skylift/cli_jobs.py", line 109
fp_wigle = join(job.path_in, f'{job.filename}.csv')
В чем именно ошибка и как это пофиксить?
Стек Python, Airflow, Clockhouse, Tableau, Docker.
Предполагаю, что будут дефолтные вопросы, как и на бэкендера: ооп, бд, базовые алгоритмы. Но может еще есть какие-то по специальности?
При этом сейчас у меня есть состояния пользователя реализованные через class UserStates(Helper)
Есть небольшое приложение, оно возвращает урлы.
nginx отдает картинки. Как сделать так, чтоб от приложения отдавать nginx команду на возврат картинки? Т.е. типа у меня своя учетка, я загрузил картинку. Она доступна только мне. Я не хочу, чтоб другой кто-то по ссылке на пичку смог получить её.
Прокси с проверкой доступа, лучше на каком нибудь го такое писать.
Работаю инженером в одной госшараге.
Для работы написал себе скрипт на питоне, просто обработчик данных.
Коллеги очень заинтересовались затребовали себе такой же.
С помощью pyinstaller сделал exeшник.
Всё работает отлично, но есть одна проблема - при клике на эксешник сначала происходит распаковка файлов и она идёт ОЧЕНЬ медленно. Ну и компы у нас в шараге весьма древние. Т.е. я кликаю по эксешнику, запускается пуская консоль и до запуска программы надо ждать иногда 10-20 секунд.
Меня это устраивает, но моим коллегам очень не нравится, что в консоли в течении всей распаковки ничего не пишется. Если бы там было написано что-то типа "Ждите, программа запускается" - это было бы всем понятно. А так люди думают, что просто всё зависло.
Но как я понял, вывести такое сообщение во время распаковки просто невозможно. Это блин очень странно, неужели только я столкнулся с такой проблемой? Всё что я смог - это включить дебаг bootloader и в консоль теперь сыпется всякий мусор при распаковке. Но выглядит это максимально криво.
Правильно ли я понимаю, что единственный шанс это исправить - добавить к моей проге графический интерфейс с одним-единственным окошком как в консоли, отключить нафиг в pyinstaller саму консоль и использовать встроенный в pyinstaller splash screen?
Или может есть какие-то альтернативы?
Неужели только у меня эксешник распаковывается так долго? Или это только меня смущает, всем остальным похуй?
Не может такого быть. Там в несколько мегабайт бандлы получаются, что там делать 10-20 секунд?
Ну мой эксешник весит 35 мегов. Если запустить pyinstaller в onedir режиме - получится папка на 80 мегов.
Не знаю, почему так долго распаковывает.
Я использую-то всего три библиотеки - pandas для загрузки данных из экселя, shapely для построения геометрии и matplotlib для рисования результирующих картинок.
Бывает кстати ещё одна проблема - выводится сообщение "Matplotlib is building the font cache. This may take a moment.", причём иногда оно появляется, иногда нет - но это уже не проблема распаковки понятное дело.
Ну хз тогда, это большие и навороченные либы, с ними могут быть нюансы.
распаковывать исполняемый код в виде кучи файлов и проверять его антивирусом.
Используй onedir, заебал.
>Это блин очень странно, неужели только я столкнулся с такой проблемой?
вообще говоря,да.
Ну не стремятся питонисты код шифровать и распространять экзешники.
То есть, один из способов решения этой проблемы - поставить коллегам питон.
Кстати да, у нас на работе Касперский параноидальный стоит.
>Используй onedir, заебал.
И передавать коллегам 80 мегов говна?
Блин, эксешник так удобен и выглядит так аккуратно.
>То есть, один из способов решения этой проблемы - поставить коллегам питон.
Тогда нужно будет и все библиотеки им ставить.
Вообще это возможно, но долго и сложно - нужно будет писать служебку и обоснование нашим админам, потом учить коллег, как запускать питон...
Блин, я вообще так-то специально из матлаба в питон перекатился в надежде, что наконец пропадут проблемы с передачей моих прог другим людям.
На шарп тогда надо было катиться.
>Блин, эксешник так удобен и выглядит так аккуратно.
Ты инженер или формошлеп? Тебя не должно это ебать. Софт решает задачу и решает ее уникальным образом. Конкурировать не с кем.
Похуй вообще. Они будут пользоваться чем угодно, если это экономит им время.
>писать служебку и обоснование нашим админам
так ты ты уже нарушил гостайну и предал Родину, пердун из НИИ!
Сиди и вручную интегрировай!
>Ты инженер или формошлеп?
Инженер, но мечтаю быть формошлепом. Даже курсы окончил яндексовкие по JS и питону.
>Они будут пользоваться чем угодно, если это экономит им время.
Безусловно. Проблема в том, что мне самому не очень приятно, что все впечатление от моей программы портится каким-то сраным распаковщиком.
Но мне эстетически неприятно видеть висящее чёрное окно консоли с моргающим курсором без каких-либо надписей.
чувак, все прекрасно понятно.
Вот такой вот выбор - быть Инженером или Пользователем.
Твои коллеги поборят в себе лень, если они инженеры и все будет хорошо.
Никто пока не решил эту проблему и не написать новый интерпретатор питона, такой чтобы он внутри exe работал.
Нужны усилия еще большего числа людей.
но можешь еще perl освоить ради смеха. там все это работает.
> эстетически неприятно видеть висящее чёрное окно консоли
а, так ты не весь мануал на pyinstaller прочитал.
там есть ключик --windowed
>Но как я понял, вывести такое сообщение во время распаковки просто невозможно.
опять же, пункт про splash screen в документации тоже пропустил?
Это же просто отключит консоль. Станет ещё хуже - при клике на эксешник вообще ничего не будет происходить пока он не распакуется. Даже не поймёшь, кликнул ты по нему вообще или нет.
Так splash screen с консолью не работает, как я понял. Нужно будет писать гуй, или я не прав?
>>178180
>Правильно ли я понимаю, что единственный шанс это исправить - добавить к моей проге графический интерфейс с одним-единственным окошком как в консоли, отключить нафиг в pyinstaller саму консоль и использовать встроенный в pyinstaller splash screen?
>Нам это не надо.
Что и удивительно. Я преполагал, что питон - язык для инженерных расчетов, современная замена фортрана. И что такие проблемы давным-давно решены без костылей.
Но ладно.
Инженер-питонист просто проставит что захочет на свой АйМак M1 из незаблокированного интернета. Там даже корпоративные способы контроля не особо работают.
А вы там ебитесь в подвале сами со своим устаревшим железом и без SSD
Лол.
Я так-то в филиале Роскосмоса работаю.
К которому потом твои инженеры-питонисты на аймаках, роняя по дороге кал, бегают за помощью, когда очередной еба-шаттл ебанет в полете, забрав с собой смертничков.
Зато аймак/ссд/интернет на работе, только результатов как не было, так и нет.
это я тебя еще пожалел.
на самом деле инженер-питонист дает коллегам ссылочку на google collab, который сразу его ноутбуки запускает в вебе.
Полехче тут с антисемитизмом и гомофобией, гой.
Есть ли бесплатный Телеграм-бот, который приветствует нового пользователя, заставляет его решать капчу и при этом приветственное сообщение видно только новому подписчику?
Shieldy но я видел и другие аналоги.
Пацаны, пытался запустить pytest из Makefile, он мне без конца серил что "pytest not found" хотя он был установлен что в виртуальной среде что глобально, когда изменил на "python -m pytest" как советовали тут https://stackoverflow.com/questions/35998992/py-test-command-not-found-but-library-is-installed он мгновенно все сделал как надо
Че это за магия?
Я херею с этих петушков со стэка - тупо цитируют оф доки питона, но когда им задают вопрос по существу "что значит что ты только что сказал", теряются и убегают
Вот ты додик. Ты разве видел в каналах личные сообщения?
Это же канал. Он общий.
Никакое api нe заставит Телеграм делать то, что он не хочет делать.
-m значит, что ты запускаешь модуль, точнее пакет, на исполнение.
Технически, если ты сделал пакет
my_pkg,
то при запуске
python -m my_pkg
у тебя запустится __main__.py файл, что лежит в каталоге этого модуля.
Примеры
python -m http.server
это чтобы веб сервер запустить из консоли. И много другого.
Но необходимо, чтобы модуль поддерживал этот функционал, чтобы там был файл __main__.py
Лол, биомусор из госшараги учит кого-то эффективности. Еще и про результаты какие-то говорит, сидя в рогозинкосмосе. Сюр какой-то.
>Коллеги очень заинтересовались затребовали себе такой же.
>Нахуй пошли, я забесплатно делать для вас это не буду
Не нравится, пусть не пользуются, я не очень понимаю, какая твоя-то беда? Просто скажи, что так работает.
>Набигай, посоны
Куда набегать то? Я помню, было время, тут треды за три дня в бамплимит уходили, сейчас этот уже больше двух недель, и только 350 постов.
Питон, похоже, теряет популярность и уходит в андеграунд.
Хотя может это просто вкатуны в программирование заканчиваются.
> вырвался на первое место
> отрицательный рост минус 0.00%
поржал с этой британской статистики.
Значит остальные упали/недоросли.
1. ForeignKeyField для нескольких разных моделей
Ну типа:
model House
..
model Garage
..
и мне нужно в одной модели типа:
model Property(model.Model):
.. property = model.ForeingKeyField() - в котором можно выбрать гараж это или дом или еще чего.
Как сделать это по-тупому я знаю, просто добавить поля property_house = .... property_garage= ... с null=True blank=True
и потом функцией смотреть что заполнено, но это как-то всё равно тупо
2. Какой самый простой способ для django выводить простецкие графики?
Конкретно - Line Chart. Интересует как решение с JS так и просто картинкой
1. GenericForeignKey
2.
- Для картинки: генери график Ploty сохраняй в jpeg, и кодируй в base64 например для автообновления.
- Для JS - chart.js https://simpleisbetterthancomplex.com/tutorial/2020/01/19/how-to-use-chart-js-with-django.html
>2. Какой самый простой способ для django выводить простецкие графики?
1. docker run apache/superset
2. "вот вам, ребята, логин и отъебитесь от меня со своими графиками. все равно у вас каждый день новая хуйня в голове"
Какие регулярки, шизик. С таким входными данными там легко можно обойтись split()
Ничего не дают. В скобках ты можешь указать классы, от которых наследоваться. А можешь не указывать.
Реальной работе кем, ёпт? Питон-разработчиком? Это довольно общий термин.
Напиши скрипты сборки для систем в докере.
Сделай сайт-сервис, который будет получать данные, получать данные из редиса, хранить их в кликхаусе/постре/монго.
Иди мети двор, быдло.
Сама задача: "sosi hui" вывести без кавычек
Что делать дальше?
Я посмотрел 2 курса на Степике от института биоинформатики по Питону
Писал несколько скриптов для работы с базами данных (на работе таким образом упростил свою задачу, вроде выгрузки из Оракла, сохранения в csv, прохождение по данным из файла в Вертике) и всякую чепуху вроде простейших парсеров и телеграм ботов
И вот сейчас у меня ступор: что учить, что писать (особенно это вызывает окаменение мозга), как двигаться?
Знаю, тут есть опытные ребята, которые проходили такой этап
Я работаю за деньги, но не программистом, хотя в айти (Business Intelligence Consultant - что-то между аналитикой и дата инженирингом), хочу добавить сюда питон на хорошем уровне, чтобы на лучшие места претендовать.
[Not win, 395, Win, 342, Win, 374]
как мне найти максимальное число среди тех которые идут после win
изменять список нельзя
максимальное число не у победителя
у проигравшего самое большое число
а мне надо большее среди победителей
словарь не вариант
в нем не могут существовать два элемента с одинаковыми индексами
*ключами
они просто перезаписывают друг друга
вьебать новый список только винов и в нем самое большое число найти?
max([[<твой список>] for i in range(1, len([<твой список>])) if [<твой список>][i-1] == "Win"])
Зипишь список с собой же со сдвигом и получаешь пары, ну а там заворачиваешь выражение в макс.
max([[<твой список>] for i in range(1, len([<твой список>])) if [<твой список>][i-1] == "Win"])
Забыл
а блять не забыл, это какая-то хуйня с форматированием
max([[<твой список>][x] for x in range(1, len([<твой список>])) if [<твой список>][x-1] == "Win"])
Вот бля короче
как в aiohttp client подхватить и сохранить cookie, которые secure=1 , но я с этим сайтом общаюсь по чистому http внутри контейнеров и на самом деле шифрованный трафик только внаружу вылетает? клиент не сохраняет эти куки у себя, но обычные сохраняет.
Допустим есть диапазон дат.
start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
TestedDate = datetime.datetime.strptime("26-11-2017", "%d-%m-%Y")
И проверка как находится ли дата в этом диапазоне
if start <= TestedDate <= end:
print (TestedDate, "Дата находится в диапазоне")
Else
print("Дата не находится в диапазоне")
Но препод требует чтобы было указан номер этой даты. Как вообще это реализовать?
В мыслях есть генерация массива, сравнивание TestedDate c датами в массиве и запрос номера этой позиции. Только хз как это сделать, единственный опыт в программировании был какулятор на делфи несколько лета назад.
Подумай об оптимизации самой программы, а не о выделении ее в отдельный процесс. Десяток пользователей (лол) не должен вешать ни mysql, ни питон.
У меня ещё сервер слабый всего 2гб, сколько вообще нужно для нормальной работы базы >1гб
Чел, побойся бога, sql создавался для работы на компах с килобайтами оперативки. Ладно, с сотнями килобайт. Можешь немножко развернуть, что у тебя там программа делает?
восемь секунд в пайнте
Делает запросы вида:
SELECT FROM table1 WHERE (text LIKE '%tags%' OR title LIKE '%tags%')
SELECT FROM table2 WHERE (text LIKE '%tags%' OR title LIKE '%tags%')
SELECT FROM table3 WHERE (text LIKE '%tags%' OR title LIKE '%tags%')
где tags может быть несколько:
SELECT FROM table1 WHERE (text LIKE '%tags1%' OR title LIKE
'%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%')
SELECT * FROM table2 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%')
на каждого пользователя
>Чел, побойся бога, sql создавался для работы на компах с килобайтами оперативки. Ладно, с сотнями килобайт.
Это ты конктерно загнул. SQL создавался в конец 70-х для серьёзных машин того времени.
> Although IBM’s System/R and SQL proved that relational databases were feasible, hardware technology at the time was not sufficiently powerful to make the product appealing to businesses.
> In 1977 a group of engineers in Menlo Park, California, formed Relational Software, Inc., for the purpose of building a new relational database product based on SQL that they called Oracle. Relational Software shipped its product in 1979, providing the first commercially available RDBMS. One of Oracle’s advantages was that it ran on Digital’s VAX minicomputers instead of the more expensive IBM mainframes.
Дальше смотрим, что из себя VAX представляли того времени:
> Первая серийная модель архитектуры VAX была представлена публике 25 октября 1977 года. Это была модель VAX-11/780 «Star» с процессором KA780 (29 печатных плат ТТЛ) и 4 МБ ОЗУ с коррекцией ошибок (ECC RAM).
То есть тут прямо сказано, что SQL всё-таки работал на довольно приличных машинах для того времени, вовсе не для примитивных.
По своей памяти, на машинах 20+ летней давности тот же MySQL можно было поднять, но это машины с 8+ мб памяти.
Конечно, 2Гб это абсолютный overkill, в этом ты прав. Просто всё-таки цифры другие были. На куда более слабых машинах работали веб сервера с большой нагрузкой, и ничего.
Надо анализировать, какие там запросы работают, сколько времени каждый запрос работает, почему они тормозят, может быть менять структуру запросов. Мне удавалось разгонять более, чем в 100 раз какие-то задачи на базе MySQL, просто корректируя запросы и чуть правя структуру БД.
Если проблема на 10 пользователях, то очевидно это проблема архитектуры базы и запросов, надо вот здесь смотреть, что происходит.
У меня сейчас выполняется по одному запросу на таблицу:
SELECT FROM table1 WHERE (text LIKE '%tags1%' OR title LIKE
'%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%')
SELECT * FROM table2 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%')
не лучше ли всё это одним запросом выполнить?
Вот если так писать, то не удивительно. Твоя СУБД вынуждена каждый раз полностью сканировать всю базу целиком на предмет вхождения tags.
Что такое tags, откуда они берутся? В каком виде они встречаются в тексте и заголовке?
В норме ты должен при сохранении текста в БД выделить тэги и сохранить информацию об этом в отдельных таблицах many-to-many (это как вариант). Тогда поиск будет быстрым.
tags это слова поиска,
например text = 'Раз два три четыре пять...'
tags1 = два, tags2 = четыре, если они встречаются то выдаётся запись и так по 20+ таблицам
мимо килобайт-SQL
Вот что происходит в твоём случае. Для каждого запроса вида 'like' MySQL будет сканировать с нуля базу, все записи последовательно. Если у тебя база в гигабайт, то весь гигабайт будет сканироваться. Каждый раз (!!!).
Тебе надо или менять архитектуру, чтобы не было запросов LIKE, либо же надо смотреть на другие решения вроде. По идее какой-нибудь ElasticSearch для таких задач предназначен, но я с ним не работал, не скажу точно, что он умеет.
Всё зависит от того, откуда берутся tags. Если это рандомные слова, которые пользователь может вводить, и таких запросов может быть много, то только вариант с альтернативными решениями. На MySQL такие вещи не делают, обычно ставят на форумах лимиты на количество таких запросов, если подобный функционал есть. Это может работать быстро, только если база небольшая и она вся в память помещается.
Если же tags лимитированы, то можно просто чуть базу переделать, избавиться от LIKE.
SELECT * FROM table1 WHERE (text LIKE '%цифровой%' OR title LIKE '%цифровой%') AND (text LIKE '%медицинский%' OR title LIKE '%медицинский%') AND (text LIKE '%сервис%' OR title LIKE '%сервис%') AND (text LIKE '%«доктор%' OR title LIKE '%«доктор%') AND (text LIKE '%рядом»%' OR title LIKE '%рядом»%')
вот реальный, по 24-м таблицам которые выполняются последовательно, получили запись 1-й таблицы, сохранили, второй, сохранили, и т.д. запрос такой занимает 25 секунд.
кол-во tags можно ограничить 5-ю, но есть ещё и tags которые не должны встречаться в тексте или заголовке
>По идее какой-нибудь ElasticSearch для таких задач предназначен
Глянул, там очень серьёзные стартовые требования к железу и оперативной памяти в частности. Не для бюджетных VPS решение.
Слово tag сбивает, тэг это понятие про другое. У тебя просто поиск по тексту.
Какого размера у тебя база, сейчас (когда 25 секунд работает) и в перспективе? Сколько записей с большими текстами и какого размера текст в среднем?
Ради теста, попробуй изменить запрос на (условно)
select from table1 where (title like variant1 or title like variant2 ...) and (text like variant1 or text like variant2)
то есть перегруппируй title и text.
При этом для title можно сделать индексы, то там надо смотреть с размером индекса, размером записи title и т.п. Но даже без индексов стоит попробовать.
>select from table1 where (title like variant1 or title like variant2 ...) and (text like variant1 or text like variant2)
fix, я идиот, это совсем другой запрос по выборке. Надо чуть подумать.
То есть, это же события одного порядка, почему он одни обрабатывает, а другие нет?
и я кстати понял при каких причинах виснет, даже один пользователь может обрушить вбил теги:
"ла ла ла" и когда кол-во результатов превысило 60000 память закончилась и запустился своп
>когда кол-во результатов превысило 60000 память закончилась
Надо сразу добавлять LIMIT N в SQL запрос. Чтобы в любом случае выборка была ограниченной.
блядь, ну заплатишь. задачу же решать надо.
посмотри еще библиотеку http://sphinxsearch.com/
но это примерно те же яйца, но без java-энтерпрайза. ресурсы в любом случае нужны.
>сейчас 4 гб в дальнейшем скорее всего будет не более 10-ти гб
Для VPS это довольно много, ты не можешь поместить всё в оперативную память. Хотя в условиях выделенного сервера это не проблема для таких объёмов.
Суть проблемы в том, что каждый запрос сейчас у тебя требует, чтобы все 4 гб были загружены последовательно из диска в память и проверены на вхождение. Поэтому долго работает.
SQL базы не предназначены для полнотекстового поиска.
Вообще полнотекстный поиск это серьёзная задача, простых решений тут нет. Вот для твоего примера не получится сделать так, чтобы переписать запрос и всё за секунду после этого бы работало.
>блядь, ну заплатишь. задачу же решать надо.
поддерживаю, хотя ты не мне отвечал, а не анону, что запрос делает.
Если это не пет-проект, а коммерческий проект, где ты на зарплате, то надо просто ставить вопрос, что нужен выделенный сервер. Цена вопроса на уровне 100 долларов в месяц, копейки по сравнению с зарплатным фондом. По моему опыту кабаны чаще очень легко идут на траты на железо, просто внутренний комфорт есть, типа серьёзный проект = серьёзное железо, а не детская VPS.
Тогда ставится уже полноценный софт, вся база помещается в оперативку и поэтому работает очень быстро. Прикручиваются сторонние решения для поиска, или NoSQL по необходимости.
Но я думаю, даже обычный SQL ускорится на порядок, если ему выделить памяти достаточно, чтобы всё в оперативку влезало.
>SQL базы не предназначены для полнотекстового поиска.
причем, все равно умеют его делать. без особенных проблем с производительностью. вопрос только к качеству.
Есть годный видеокурс по фласку? Чтоб прям все тонкости были.
возможно
Спасибки
A='qwerwq er bababaobaber okayuo misaka'
B='ba@ba'
D=B
at=[]
for i in range(len(B)):
if B=='@':
at.append(i)
n=0
while 1:
C=A[n:n+len(B)]
for i in at:
D=D[0:i]+C+D[i+1:]
if n==len(A)-len(B):
print(-1)
break
if C!=D:
n=n+1
else:
print(n)
break
прога вырезает участок оригинальной строки длины подстроки, заменяет собачки подстроки на символы оригинальной строки и собстно сравнивает получившиеся штуки.
Питон не любит рекурсию. Лучше через цикл с очередью переписать если есть возможность
В каком смысле не любит?
причём тут второй питон?
паттерн
n = 0
while 1:
____if n==len(A)-len(B):
________print(-1)
________break
____if C!=D:
________n=n+1
было бы разумно заменить на
for n in range(len(A) - len(B) + 1):
____ calculations
____ return in success
print(-1) # если не вышли из цикла через return, то ничего не нашли
но только мне всё равно не нравится.
уж скорее лучше ближе к Си переписать, чтобы не создавать сначала строку и потом сравнивать её, а просто посимвольно в цикле сравнивать, и игрорировать символ @. Для маленьких строк должно быстрее работать, но для больших шаблонов, где мало @, будет хуже
опци
Програмісти, хто знає?? як зробитм шоб всі вклабки адресу з цього сайту автоматично замінялись на 2c-pm. я не можу все вручну записувати довго
Макс объем: 300Mб, макс кол-во файлов: 4
КЛИКНИ/БРОСЬ ФАЙЛ/CTRL-V
>Для маленьких строк должно быстрее работать, но для больших шаблонов, где мало @, будет хуже
Не, чего это я, для больших обычно будет как раз лучше, потому что очень быстро можно отлавливать несовпадения, не конструируя всю строку.
В приведённом коде меня больше всего вымораживает конструкция
for k in at:
____D = D[0:k] + C[k] + D[k+1:]
Learn English!
а еще можно сэкономить две строки, если оба
probe = input_string.find(start_token)
засунуть модным моржом в
while (probe := input_string.find(start_token)) > -1:
но это как-то менее читаемо
>>183049
Ну чел, ну сложно ведь. И медленно. Вот у тебя вариант 44 мс, а мой 10-12 мс
Вот тут пример: https://ideone.com/1HfYnv
Реально тут код на строчках 4-15, остальное подсчёт времени.
12 строк кода вместе со строкой комментария, на твоём примере меньше 10мс работы против 44 мс у тебя.
бля, иногда я сам ненавижу эти блоки пробелами.
вот так надо: https://ideone.com/DHA94i
хотя предыдущий вариант корректно работающий, более того, в каких-то случаях даже чуть более быстрый.
>у тебя вариант 44 мс, а мой 10-12 мс
Чувак, серьезно? Мерить время выполнения по сообщению из редактора, включающего запуск интерпретатора? Ну держи, обтекай
https://ideone.com/IfWZRI
Накатил Пучарм на новую ОС (Линух)
Вот есть у нас словарь, где имена заранее отсортированы по группам, например:
Petya, Vasyan
Anton, Vasgen, Ramil
Значение для каждого из этих имен - число integer. Я могу его изменять, и когда изменяю его для одного из ключей в определенной группе то оно изменяет и для всех других, например сделал my_dict['Vasyan'] = 100, и теперь в том числе и для my_dict['Petya'] будет возвращаться 100
Теперь попробуй вместо шаблона 'sr@l' подставить шаблон '@sr@l'
Твой скрипт выдаёт None. А должен был выдать 2.
Переусложнено, отсюда ошибки.
Не, я понимаю идею, которую ты хочешь реализовать, но невозможно разобрать твой код, не хочется кучу времени убивать на это. Много "оптимизаций" и не понятно, как обрабатываются особые случаи, которые возникаю. Вот как в случае, когда '@' в начале шаблона. Или когда в конце, там другой баг.
Парни, хуярю элементарный параллелизм на multiprocessing. Вот вроде обычная функция которая возведет все эелементы массива в квадрат. Внизу нахуярен объект MyTimer исключительно для подсчета времени исполнения. Как видите, время у синхронного и параллельного вариант практически то же ("параллельный" даже умудрился отсосать). Шо тут не так?
Во первых у тебя опечатка, ты два раза вызываешь функцию test1.
Во-вторых, использую контекстный менеджер для Pool
with mp.Pool as pool:
____data = pool.map(func, splitted)
return data
Наконец ты не видишь прироста потому, что главные затраты времени на подготовку списка, разбиение его на куски, пересылку в процессы и т.п. Поэтому ты ничего не выигрываешь.
Попробуй использовать более сложные вычисления, чем возведение в квадрат, вот как в моём примере
https://ideone.com/O1MNl8
(на ideone пускают в один поток, поэтому там нет ускорения)
и ты увидишь прирост производительности
3.3396499156951904 secs elapsed for Sync
1.1430809497833252 secs elapsed for Parallel
Хм, и правда, когда стал юзать хитрожопые умножения во вложенном цикле, прирост появился
>главные затраты времени на подготовку списка, разбиение его на куски
But wait... разбивать список на чанки - это вообще задача по хуйне для питона, оно за константное время происходит. Да и чанков тут всего 10
Тебе данные надо нарезать, сериализовать для отправки в процессы, потом из этих процессов эти данные получить и сохранить в основном процессе. Это главная работа. В то время как само умножение работает очень быстро.
блять, код балдежный но так же как и мой хуевый по времени пролетает для строки из 86к символов. Буду думать.
str(13 ^ 100500)
(в смысле 13 в степени 100500, преобразовать к строке, так как звёзды двач съедает)
Получается строка в 111962 символа
В ней ищу подстроку
'637036977498347229246'
по шаблону
'63@036@7749@347@29@46'
она находится на позиции 110890
Мой вариант на питоне 3.8 на моём ноуте работает за 60мс, на 3.6 кстати быстрее, 55-60мс. На 3.10 те же 60мс
Сделал разогнанный вариант, ближе к стилю Си, работает за 22-23 мс. Намного веселее, но при этом просто поиск подстроки без шаблона работает за 0.1мс, совсем другой порядок.
Контрольный вариант с re, самый примитивный и не оптимальный, работает за 0.5мс.
В общем очевидно, что есть куда разгоняться, но в питоне довольно сложно.
Вот вариант, тут старая версия, другая версия и контрольный вариант с re
https://ideone.com/qXEX33
>>183678
Самая проблема в производительности это вложенный цикл, циклы в питоне медленные.
Если ставить задачу разгона и без re, то возможен вариант с тем, чтобы сгенерировать сначала код без циклов, а потом этот код выполнить через compile+eval
Тогда, думаю, в несколько раз можно ускорить.
Вообще обычно всякие шаблонизаторы на разных языках так и работают. По шаблону сначала генерируется код, раскрывающий шаблон, а потом полученный код уже выполняется. Даже в Си были такие регулярки в древнее время. Все эти джинджи примерно так устроены.
вот это прошло. Загнал строку в 700к знаков, очень быстро скушалось, ну и допилил случай нескольких собачек в начале паттерна,+ упростил, чтоб самому понять. Прям круто, спасиб
xs = ['Not win', 395, 'Win', 342, 'Win', 374]
max(filter(lambda x: x[0] == 'Win', zip(xs[::2], xs[1::2])), key=lambda x: x[1])
надо получить строку из 2 строк, складывая по-символьно.
string = ''.join(lambda x,y: x,y from s1, s2)
где я ошибся?
пример - строки s1 = ГОВНОГОВНО s2 = ПИЗДАПИЗДА.
на выходе должно получиться ГПОИВЗЕДОАГПОИВЗЕДОА.
В синтаксисе.
from itertools import zip_longest
result = ''.join(c1+c2 for c1, c2 in zip_longest(s1, s2, fillvalue=''))
string + ''.join(map(str.__add__,s1, s2))
вот такой придумал, но он не добавляет конечные элементы при разнице в длинах изначальных строк. можно обойти через cycle, но да, зип_лонгест проще.
спасибо.
Что надо прописать в sql запросе, чтоб создать таблицу с поддержкой кириллицы в названии?
f"""CREATE TABLE {user_request['name']}(
id INT AUTO_INCREMENT PRIMARY KEY,
send_massages VARCHAR(1000),
get_massages VARCHAR(1000));""")
Ну я хочу чтоб у меня создавалась таблица при регистрации пользователя, для того, чтоб туда сохранять туда его контакты и переписку, типа бекенд для чата хочу сделать, ее же надо сохранить под каким-то именем.
Спасибо, няша, все заработало. А то я сначала подумал что эти словари работают как пары ключ-значение, а оказывается можно вкладывать. Лучший тред в этом разделе.
https://www.postgresql.org/docs/12/multibyte.html#CHARSET-TABLE
лол >>184037 уже скинул.
>>184041
temp = {'Температура ':'O,H,C,M,N','000 градусов':'1,2,3,4,5', '100 градусов': '5,4,3,2,1', '200 градусов': '5,4,3,2,1'}
print("{}\n{}\n{}\n{}".format(*temp.items()))
я бы с форматированием строк поигрался.
вообще, можно выводить это списками, '\t'.join(arr[])
>>183830
Вот вариант этой идеи с токенами
https://ideone.com/g6YGpn
сама функция на строках 15-39, там ещё функция для тест-кейсов каких-то, поэтому много кода
На тестовом примере >>183783 работает меньше, чем за 0.2мс вместо 20мс ранее. В 100 раз ускорение. Получается даже быстрее, чем работа через re
Беды как у этого пчелика
https://stackoverflow.com/questions/69527805/python-cannot-install-cryptography-command-errored-out-with-exit-status-1/
А я всего лишь хотел похешировать пароль
чел дохуя библиотек еще не перешли на 10 пятон, это нормально. через пару месяцев все будет.
[ (0, -1, 4), (-5, 2, 7), (-1, 4 ,0), (2,9,1) ]
Как оставить только кортежи с уникальными комбинациями? То есть в примере выше убрать (-1, 4 ,0) или (0, -1, 4)
r = functools.reduce(lambda acc , val: acc.update((sum(val), val) [(0, -1, 4), (-5, 2, 7), (-1, 4 ,0), (2,9,1) ], {})
list(r.values)
Когда джаваскрипт проект тянет гигабайты зависимостей, то это гораздо смешнее.
Норкоман штоле?
они по заданию одинаковые не зависимо от порядка элементов. те они, даже отсортированные, всё еще оригинальные.
> A user may need to set the limit higher when she has a program that requires deep recursion and a platform that supports a higher limit.
https://docs.python.org/3.5/library/sys.html#sys.setrecursionlimit
> A user may need to set the limit higher when they have a program that requires deep recursion and a platform that supports a higher limit.
Обзмеился.
Ебать хайвмайнд
pycharm это всего лишь IDE, как и блокнот
Будет работать на любом интерпритаторе
чому вас вообще учат, на этих ваших курсах
Жупитер ноутбук
*{tuple(sorted(item)):item for item in input}.values()
return mapToResponse(service.getObject(id))
AttributeError: type object 'meetlist' has no attribute 'meets'?
Есть класс и в нем метод addmit (там еще куча всего, я все неважное обрезал). Так почему компилятор говорит:
AttributeError: type object 'meetlist' has no attribute 'meets'?
Потому что meetlist - это название для класса, а объявлять переменные нужно у экземпляра класса, для него всегда зарезервированно первое место параметров у методов внутри классов, которое обычно называют self. поэтому надо исправить: meetlist.meets = [] на self.meets = []
кастомизацию внутри crm
Начни с того, что все, что ниже объявления списков, заменяется одной строкой:
print(random.choice(names), random.choice(surnames))
Вжух и 5 строк в одну.
А вообще пока продолжай изучать, чуть подтянешь язык - цепи Маркова помогут с генерацией текста.
Сортировать массовчики это конечно хорошо, но вот думаю, ведь многие знают канал Ильи Климова, а есть ли такой же образный Климов но в мире питона ? Можно даже на английском, но лучше на русском офк
На 3 лучше, мне кажется, Джанго это монолит, сделав чутка асинхронности тут, чутка там, в общем результат вряд ли сильно лучше, поскольку дофига остального включая библиотеки на синхронных решениях
Это копия, сохраненная 13 мая 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.