使用python动态格式化tuple的tuple中的字符串

2024-03-29 12:59:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的示例中,场景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))

/strong代码:<>

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

请帮我把这个修好。你知道吗


Tags: 代码fromtestleformat场景orderval
1条回答
网友
1楼 · 发布于 2024-03-29 12:59:31

TL;博士

您好,出现此错误是因为您试图为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))

第一步:调试

假设您更新了调试代码,如下所示:

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:修复代码

看看这个SO article。它向您展示了如何使用*操作符。它基本上把listtuple转换成一个项目序列。非常适合函数参数等。你知道吗

因此,适用于你目前的情况:

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

把戏完成了。你知道吗


第三步:优化

现在,让我们扔掉代码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的逻辑组合成一行。你知道吗

相关问题 更多 >