@python_beginnersЭта группа больше не существует

Страница 217 из 1885
Denis
01.08.2016
18:00:26
А в каком виде оно в функцию передается?

Andrey
01.08.2016
18:02:43
и что за функция? орм какой-нибудь?

Марк
01.08.2016
18:03:18
Нет. POST в роут, дальше вручную. ОРМ не юзаю.

Andrey
01.08.2016
18:03:32
так функцию покажи

Google
Andrey
01.08.2016
18:04:43
или ты в скуль так и передаешь (1,) ?

Марк
01.08.2016
18:05:38
Да нет там функций каких-то. Выгребание данных с формы и их обработка. Вытащил кортеж - и в sql запрос в стиле select ... where in {0}.format(users)

И, ессно, что select... where in (1,) не работает.

Andrey
01.08.2016
18:06:54
ну а что тебе мешает это джойном сделать?

Denis
01.08.2016
18:07:05
Инъекции же

Andrey
01.08.2016
18:07:21
а, да

Denis
01.08.2016
18:07:32
Нельзя SQL делать форматом

Марк
01.08.2016
18:07:38
Инъекции - то отдельный разговор.

Andrey
01.08.2016
18:07:40
чо за база? есть же драйвера которые подготовленные запросы делают

Denis
01.08.2016
18:07:48
Для этого обычно функции в либе есть

Zart
01.08.2016
18:07:58
Нельзя SQL делать форматом
для where ... in ... приходится

нету

Andrey
01.08.2016
18:08:22
ну psycopg2 нормально примет тупл же? нет?

Google
Zart
01.08.2016
18:08:26
нет

всё плохо

Denis
01.08.2016
18:09:20
Ну тогда join

Zart
01.08.2016
18:10:52
обычно люди конструируют запрос вида ... where x in (?, ?, ?, ...) - длиной в len(args) и подставляют args у этого подхода разумеется проблемы с кэшированием запроса, раз и с обработкой вырожденных случаев для len = 0 и 1

вроде отдельные DBAPI модули понимают ('... where x=?', [(args, ...)]) стиль, но это надо уточнять по каждому отдельно

Jonh
01.08.2016
18:13:33
Есть вот проект примерно 50k LOC, нужно определить, что тормозит систему. До этого профайлеры для питона не юзал, не было необходимости.

Zart
01.08.2016
18:14:15
python -m cProfile script.py

Марк
01.08.2016
18:16:45
и это не особенность пайтоновских кортежей
Не знаю. Кортеж+where in был элегантным решением, но единичный случай всё разбил в пух и прах. Пришлось костыли городить, которые меня откровенно раздражают. Но лучшего варианта не придумал

Jonh
01.08.2016
18:17:14
python -m cProfile script.py
А как это будет работать с приложением за uswgi?

Zart
01.08.2016
18:18:17
А как это будет работать с приложением за uswgi?
не удивлюсь если там готовый ключ есть вообще вызов профайлера тогда в скрипт вписать надо или тестить под другим сервером

Марк
01.08.2016
18:21:24
какие костыли? ",".join(("1",))
Так всё равно не подойдет

where ... in () . Без скобок не работает.

Zart
01.08.2016
18:22:28
и?

Andrey
01.08.2016
18:22:35
встаавь в скобки?

Марк
01.08.2016
18:22:55
В запрос, который уже рассчитан на кортеж?

Zart
01.08.2016
18:25:35
def where_in(args, placeholder='?'): return '({})'.format(', '.join(*[placeholder]*len(args))) ...execute('select * from table where key in {}'.format(where_in(args)), [args])

для :name параметров придётся допиливать нумерацию через enumerate

Google
Zart
01.08.2016
18:28:59
потому что один элемент же

джойн вставляет строки между элементами, но если список из одного или нуля - вставлять некуда

Марк
01.08.2016
18:40:12
Да, действительно. Не знал

И да, я еще REGEXP в скуль воткнул. В итоге получается запросец в виде `select ... where id in .. or name REGEXP ...``. Полистал на Стеке. Вроде юзать можно, но осторожно

Кстати, интересный вопросец: like быстрее регекспа или нет? Чисто академический интерес

Zart
01.08.2016
18:54:00
это и есть регэксп

только попроще 8)

Марк
01.08.2016
19:00:30
Но я так понимаю, за индексы можно забыть

Zart
01.08.2016
19:00:37
почему?

Марк
01.08.2016
19:00:52
like точно их не юзает

Zart
01.08.2016
19:01:03
субд какая?

Марк
01.08.2016
19:01:11
mysql

Zart
01.08.2016
19:01:18
а, греп

http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html

"The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character. For example, the following SELECT statements use indexes:" часть

в пг можно вроде регэксповые индексы клепать

Марк
01.08.2016
19:03:03
Стопе, это 5.7. Раньше такая тема была?

Zart
01.08.2016
19:03:07
была

Google
Denis
01.08.2016
19:03:26
В пг, говорят, можно индекс по выражению делать

Zart
01.08.2016
19:03:35
если у лайка есть константный префикс, то индекс может урезать диапазон поиска

можно

https://www.postgresql.org/docs/9.1/static/sql-createindex.html вон примеры внизу

Марк
01.08.2016
19:06:19
Век живи век учись

SELECT * FROM tbl_name WHERE key_col LIKE other_col;

In the second statement, the LIKE value is not a constant.

Ч0т не вьехал

Zart
01.08.2016
19:07:43
тебе ясным английским пишут

Марк
01.08.2016
19:08:29
Это не константа, хорошо. Но почему она проигрывает `a%``

Admin
ERROR: S client not available

Марк
01.08.2016
19:08:31
?

Zart
01.08.2016
19:09:11
а если подумать?

Марк
01.08.2016
19:09:50
Если подумать

Зарт, стоп

Дай подумаю

Zart
01.08.2016
19:10:09
col1 like col2 - тебе надо обойти всю сраную таблицу и дергать из КАЖДОЙ строки и кол1 и кол2

когда же у тебя 'a%', ты заведомо знаешь что все ключи меньше 'b...'

значит можно б-трии хэшем откинуть сразу ~1/50

Темный
01.08.2016
20:37:21
class Buffer: def __init__(self): self.in_lst = [] self.count = 0 def add(self, *a): self.a = list(a) for i in a: if len(self.in_lst) < 5: self.in_lst.append(i) self.count += i if len(self.in_lst) == 5: print(self.count) self.in_lst = [] self.count = 0 def get_current_part(self): print(self.in_lst)

Google
Темный
01.08.2016
20:37:41
Вам дается последовательность целых чисел и вам нужно ее обработать и вывести на экран сумму первой пятерки чисел из этой последовательности, затем сумму второй пятерки, и т. д. Но последовательность не дается вам сразу целиком. С течением времени к вам поступают её последовательные части. Например, сначала первые три элемента, потом следующие шесть, потом следующие два и т. д. Реализуйте класс Buffer, который будет накапливать в себе элементы последовательности и выводить сумму пятерок последовательных элементов по мере их накопления. Одним из требований к классу является то, что он не должен хранить в себе больше элементов, чем ему действительно необходимо, т. е. он не должен хранить элементы, которые уже вошли в пятерку, для которой была выведена сумма.

buf = Buffer() buf.add(1, 2, 3) buf.get_current_part() # вернуть [1, 2, 3] buf.add(4, 5, 6) # print(15) – вывод суммы первой пятерки элементов buf.get_current_part() # вернуть [6] buf.add(7, 8, 9, 10) # print(40) – вывод суммы второй пятерки элементов buf.get_current_part() # вернуть [] buf.add(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) # print(5), print(5) – вывод сумм третьей и четвертой пятерки buf.get_current_part() # вернуть [1]

все выполняется как выше, но где-то ошибка?

точнее степик не принимает ответ, загуглил решения - сделано у некоторых через while, но сути не меняет, одно и тоже...

Denis
01.08.2016
20:41:15
В чем ошибка-то?

Темный
01.08.2016
20:42:01
кто бы знал Failed test #1. Wrong answer

Denis
01.08.2016
20:42:23
Сам тест дается?

Темный
01.08.2016
20:42:49
на степике не даются тесты

вот это и бесит, авторы придерживаются мнения, что ученики сами должны догадаться, лол

Zart
01.08.2016
20:44:29
хреновая реализация буфера

а задачка вполне реальная, такие буфера часто попадаются то тут, то там

Темный
01.08.2016
20:46:33
вроде все обрабатывается, можно и через срезы это сделать, а не через переменную count, но сути не меняет

Zart
01.08.2016
20:46:42
count не нужен

Темный
01.08.2016
20:46:58
ну, ок, переделал на срез, все тоже самое

Zart
01.08.2016
20:47:47
Темный
01.08.2016
20:47:59
полный вывод дай
это и есть полный

Zart
01.08.2016
20:48:02
они там обычно приводят входные данные как минимум

Темный
01.08.2016
20:48:25
когда-то да, когда-то нет

Zart
01.08.2016
20:48:46
self.a у тебя бесполезное

хм... count у тебя на самом деле summ

вообще алгоритм хотя и глубоко неоптимальный, но выглядит правильно

Темный
01.08.2016
20:51:40
ну да, сейчас переделал на sum(self.in_lst[:5]) и потом его обнуляю, все равно тоже самое

Страница 217 из 1885

Эта группа больше не существует Эта группа больше не существует