如何解压缩可能包含列表的元组

时间:2012-11-19 16:10:26

标签: python sqlite list tuples

我在尝试将sqlite查询传递给另一个函数时遇到问题。

问题是sqlite查询可能包含一个列表,因此我无法使用*args,因为它解包了元组但忽略了列表,我试图传递给函数的示例查询:

'SELECT postname FROM history WHERE postname = ? COLLATE NOCASE', [u'Test']

所以在这种情况下,我可以在目标函数中使用args而不是*args,但是我可能有一个不包含列表的sqlite查询,因​​此我不能总是这样做这个例如

'SELECT * FROM history' 

所以我想我的问题简而言之,我怎么能成功地将sqlite查询传递给另一个函数,无论它是否包含列表,使用args?

2 个答案:

答案 0 :(得分:1)

你可以tryexcept吗?

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所示完成。