gpt4 book ai didi

python - 使用 python 动态格式化元组元组中的字符串

转载 作者:行者123 更新时间:2023-12-01 01:34:58 26 4
gpt4 key购买 nike

在下面,场景 1 在两种情况下都运行良好(代码 1 和代码 2)。但场景 2 在代码 1 中不起作用。

我的要求是元组应该不断重复自身,直到它动态填充查询中的所有格式字符串。因为 where 子句对于所有查询来说并不是恒定的。

场景 1#

query = SELECT * FROM test.order where total_price in {}

元组:

finTup=((125, 125, 125, 125),)
SELECT * FROM test.order where total_price in (125, 125, 125, 125)

场景 2#

query = 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
le = len(finTup)
for i in range(le):
print(i)
print(eval(frt.format(i)))
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)+', '
temp2 = query.format(eval(val))

代码2:

if le == 1:
query = query.format(finTup[0])
elif le == 2:
query = query.format(finTup[0], finTup[1])
elif le == 3:
query = query.format(finTup[0], finTup[1], finTup[2])
elif le == 4:
query = query.format(finTup[0], finTup[1], finTup[2], finTup[3])

Error:
temp2 = query.format(eval(val))
IndexError: tuple index out of range

请帮我解决这个问题。

最佳答案

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 函数将尝试访问您未提供的第二个参数。它坏了。

<小时/>

第 2 步:修复代码

看看这个 SO article 。它向您展示了如何使用 * 运算符。它基本上将列表元组转换为项目序列。非常适合函数参数等。

因此,应用于您当前的案例:

temp2 = query.format(*eval(val))

技巧就完成了。

<小时/>

第 3 步:优化

现在,让我们丢弃代码 1 并使用我们在代码 2 中学到的知识。我们需要将tupletuple 解压为参数以输入format。那么,为什么不只是这样做:

# I renamed `finTup` to `vars` since I don't know what it means
def get_query(query, vars):
return query.format(*vars)

它基本上将代码 1代码 2 的逻辑组合到一行中。

关于python - 使用 python 动态格式化元组元组中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52478381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com