2012-11-19 49 views
0

我在嘗試將sqlite查詢傳遞給另一個函數時遇到問題。如何解壓可能包含列表的元組

的問題是,SQLite的查詢可能包含一個列表,因此它解壓縮的元組,但隨後忽略列表我不能使用*args,例如查詢我試圖傳遞給函數:

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

所以在這種情況下,我可以在目標函數中使用args而不是*args,但是我可能有一個不包含列表的sqlite查詢,因​​此我不能總是這樣做,例如

'SELECT * FROM history' 

,所以我想我簡而言之問題是我怎麼能成功地通過一個SQLite查詢是否含有列表或不使用ARGS另一個函數?

+0

我會爭辯最好的答案(如果可能的話)是確保你總是得到一個元組。記住你可以得到長度爲1的元組 - 「'(」SELECT * FROM histroy「),''可以完美地工作。 –

+0

@Lattyware - 爲什麼不作爲回答發佈?我不知道sqlite,否則我可能會有一些貢獻,但如果你說的是正確的,它確實看起來像是比我更好的解決方案。 – mgilson

+0

嗨Lattyware,我已經嘗試過你的解決方案,但是sqlite不能使用元組,我得到了錯誤ValueError:操作參數必須是str或unicode,因此我回到了無法解壓元組的問題,因爲我鬆開了列表。 – Paul

回答

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)) 
+0

如果單項目是一個字符串,作爲字符串將被解壓縮這將不工作(或至少,不是意)。 (請參閱3.x或'__future__ import print_function''上的'print(*「test」)')。 –

+0

*抱怨* - @Lattyware,它會做一些事情,但它可能不會是正確的。如果我無法想出一個乾淨的解決方法,我會在一分鐘內刪除... – mgilson

1

我認爲這裏最好的答案是儘量確保你總是把在迭代,而不是試圖處理具有單個項目的奇情況。

如果你在一個地方有('SELECT postname FROM history WHERE postname = ? COLLATE NOCASE', [u'Test']),傳遞長度爲1的元組更有意義 - ('SELECT * FROM history',)而不是字符串。

你還沒有說過字符串來自哪裏,所以你可能根本無法改變數據的方式,但是如果可以的話,元組是更好的選擇,可以從你的碼。

如果你真的無法做到這一點,那麼你想要解壓縮任何非字符串迭代,檢查可以完成,如this question所示。

相關問題