我在尝试将sqlite查询传递给另一个函数时遇到问题。
问题是sqlite查询可能包含一个列表,因此我无法使用*args
,因为它解包了元组但忽略了列表,我试图传递给函数的示例查询:
'SELECT postname FROM history WHERE postname = ? COLLATE NOCASE', [u'Test']
所以在这种情况下,我可以在目标函数中使用args
而不是*args
,但是我可能有一个不包含列表的sqlite查询,因此我不能总是这样做这个例如
'SELECT * FROM history'
所以我想我的问题简而言之,我怎么能成功地将sqlite查询传递给另一个函数,无论它是否包含列表,使用args?
答案 0 :(得分:1)
你可以try
,except
吗?
try:
func(*args)
except TypeError:
func(args)
当然,这也会在你的函数中捕获TypeError
。因此,可能想要创建另一个实际处理解包的函数,并确保为您提供一个可解包的对象作为回报。这对字符串也不起作用,因为它们也会解压缩(参见注释)。
这是一个确保可以解压缩对象的函数。
def unpackable(obj):
if hasattr(obj,'__iter__'):
return obj
else:
return (obj,)
func(*unpackable(args))
答案 1 :(得分:1)
我认为这里最好的答案是尽量确保你总是放入一个可迭代的,而不是试图处理一个单项的奇怪情况。
如果你在一个地方有('SELECT postname FROM history WHERE postname = ? COLLATE NOCASE', [u'Test'])
,那么传入一个长度为1的元组更有意义 - ('SELECT * FROM history', )
而不是字符串。
你还没有说过字符串的来源,所以你可能根本无法改变数据的方式,但是如果可以的话,元组是从代码中删除边缘情况的更好选择
如果你真的不能这样做,那么你想要的是解压缩任何非字符串的可迭代,检查是否可以按this question所示完成。