TL; DR
Здравствуйте, у вас есть эта ошибка, потому что вы пытаетесь предоставить один аргумент для функции format
, которая ожидает два параметра (так как у вас есть 2 {}
).
Примечание : избегайте использования функции eval
... Это довольно не рекомендуется, тем более в текущей ситуации, в которой вы находитесь.Все может быть сделано без необходимости оценивать str
.
. Далее я запускаю код только для Сценарий # 2 , т.е.
query2 = """SELECT * FROM test.order WHERE order_id IN {} AND product_id IN {}"""
finTup = ((101, 105, 106, 107), (2, 2, 2, 2))
Шаг 1: Отладка
Представим, что вы обновляете свой код для отладки следующим образом:
frt = 'finTup[{}]'
half = ''
val = ''
i = 0 # btw, you don't need to initialize i here
le = len(finTup)
for i in range(le):
if i == le -1:
half = half + frt.format(i)
val = val + " " + frt.format(i)
else:
half = half + frt.format(i)+', '
val = val + " " + frt.format(i)+', '
print val
print eval(val)
temp2 = query.format(eval(val))
Выходные данные должны быть:
vars[0], vars[1]
((101, 105, 106, 107), (2, 2, 2, 2))
Итакпредставьте, что вы пишете код Python из вышеприведенного вывода, что бы вы сделали:
query.format(((101, 105, 106, 107), (2, 2, 2, 2)))
Вы фактически предоставляете один параметр типа tuple
с двумя элементами.Но важно то, что вы предоставляете format
с единственным параметром .Функция format
попытается получить доступ ко второму параметру, который вы не предоставляете.Он ломается.
Шаг 2: Исправление кода
Посмотрите на эту ТА статью .Он показывает вам, как использовать оператор *
.Это в основном превращает list
или tuple
в последовательность предметов.Идеально подходит для параметров функций и т. Д.
Итак, применимо к вашему текущему случаю:
temp2 = query.format(*eval(val))
И трюк готов.
Шаг 3: Оптимизация
Теперь давайте отбросим Код 1 и используем то, что мы изучили с Код 2 .Нам нужно распаковать tuple
из tuple
в параметры для подачи в format
.Итак, почему бы просто сделать:
# I renamed `finTup` to `vars` since I don't know what it means
def get_query(query, vars):
return query.format(*vars)
Он в основном объединяет логику Code 1 и Code 2 в одну строку.