
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
нету

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, ...)]) стиль, но это надо уточнять по каждому отдельно

Andrey
01.08.2016
18:12:57
а особенность твоего применения их

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

Zart
01.08.2016
18:18:17

Andrey
01.08.2016
18:18:21

Марк
01.08.2016
18:21:24
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

Марк
01.08.2016
18:28:40

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])
и потом его обнуляю, все равно тоже самое

Andrey
01.08.2016
20:57:14
Эта группа больше не существует