2

私の状況では、ユーザーがデータベースからレコードを削除できる関数を作成しています。効率を高めるために、関数自体がバッチ削除の引数のリストを取得できる必要があります。さらに、簡単にするために、リストには ID (stringsまたはints)または行オブジェクト (栄光化されたdicts)のいずれかを含めることができます。

興味がある方のために説明すると、本格的な行を許可する理由は、ユーザーが問題の行を削除できることを確認するために行データを検査するセキュリティ チェックがあるためです。行の受け渡しを許可すると、データベースへのトリップを減らすことができます。

現在、私はしばしば非難さisinstanceれる関数を次のように使用しています。

def deleteRows(rowsToDelete):
    ids = set()
    rows = []
    for r in rowsToDelete:
        if isistance(r, basestring) or isinstance(r, int):
            ids.add(r)
        else:
            rows.append(r)
    # Some logic that SELECTS based on the data in ids and appends the
    # result into rows...
    # ... then security ...
    # ... then DELETE

これが危険である理由はわかります ( or ではない id に型を強制できる場合はどうなるでしょうintbasestring?)、しかし、何らかの方法で isinstance を含まないよりクリーンなソリューションを見つけることができません。 、または実際のコードに関連する場合と関連しない場合がある例外に依存しています。

問題は、python でこれを行う最も効果的な方法は何ですか? または、代わりに、呼び出し元をこれだけ赤ちゃんにすることは、災害のレシピにすぎません。つまり、パラメーターが強制するタイプのリストint または行のリストのいずれかであることを要求する必要がありますか?

4

1 に答える 1

2

インターフェイスをこれほど柔軟にしないことをお勧めします。コードは、delete_rows(*row_objs) と delete_rows_by_id(*int_ids) を別々に持つ方が簡単になります。前者は後者を呼び出します。

于 2013-02-19T00:35:34.047 に答える