0

sqlite クエリを別の関数に渡そうとすると問題が発生します。

問題は、sqlite クエリにリストが含まれている可能性があるため*args、タプルをアンパックするため使用できないが、リストを無視するため、関数に渡そうとするクエリの例です。

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

したがって、この場合、宛先関数とargsは対照的に使用でき*argsますが、リストを含まない sqlite クエリがある可能性があるため、常にこれを実行できるとは限りません。

'SELECT * FROM history' 

私の質問は、一言で言えば、引数を使用して、リストが含まれているかどうかに関係なく、sqliteクエリを別の関数に渡すにはどうすればよいですか?

4

2 に答える 2

1

ここでの最善の答えは、単一のアイテムを持っているという奇妙なケースを処理しようとするのではなく、常に反復可能なものを入れていることを確認することです。

1つの場所にある場合は、文字列ではなく('SELECT postname FROM history WHERE postname = ? COLLATE NOCASE', [u'Test'])、長さ1のタプルを渡す方が理にかなって('SELECT * FROM history', )います。

文字列がどこから来ているかを言っていないので、データの方法を変更できない可能性がありますが、可能であれば、コードからエッジケースを削除するためのはるかに優れたオプションはタプルです。

本当にそれができない場合は、文字列以外の反復可能なものを解凍し、この質問に示すようにそれをチェックすることができます。

于 2012-11-19T16:31:41.687 に答える
1

できますtryexcept

try:
   func(*args)
except TypeError:
   func(args)

もちろん、これはTypeError関数内でも s をキャッチします。そのため、実際にアンパックを処理し、アンパック可能なオブジェクトを確実に返す別の関数を作成することをお勧めします文字列もアンパックされるため、これは文字列に対しても機能しません (コメントを参照)。

これは、オブジェクトがアンパックできることを確認する関数です。

def unpackable(obj):
    if hasattr(obj,'__iter__'):
       return obj
    else:
       return (obj,)

func(*unpackable(args))
于 2012-11-19T16:13:19.887 に答える