2

私のWebアプリケーションは、PythonとpyMongoを使用してMongoDBで実行されます。私はこのシナリオをたくさん得ます-次のようなコードを読み取ります:

from pymongo import Connnection
users = Connection().db.users

def findUsers(firstName=None, lastName=None, age=None):
    criteria = {}
    if firstName:
        criteria['firstName'] = firstName
    if lastName:
        criteria['lastName'] = lastName
    if age:
        criteria['age'] = age
    query = users.find(criteria)
    return query

if検索条件に入れる必要があるかどうかを判断するためにオプションであるすべての値のステートメントが必要なのは、そのような厄介なことです。mongoがクエリで無視した特別なクエリ値があった場合のみ。次に、私のコードは次のようになります。

def findUsers(firstName=<ignored by mongo>, lastName=<ignored by mongo>, age=<ignored by mongo>):
    query = users.find({'firstName':firstName, 'lastName':lastName, 'age':age})
    return query

特にオプションのパラメーターがもっとたくさんある場合は、以前ほどクリーンではなくなりました。指定されていないパラメータは、デフォルトでmongoが無視するものになります。これを行う方法はありますか?または、少なくとも私が現在持っているものよりも簡潔なものはありますか?

4

1 に答える 1

3

Pythonで空の値をフィルタリングする方がおそらく良いでしょう。値ごとに個別のifステートメントは必要ありません。ローカル変数には、からアクセスできるため、値locals()を使用してすべてのキーを除外することで辞書を作成できますNone

def findUsers(firstName=None, lastName=None, age=None):
    loc = locals()
    criteria = {k:loc[k] for k in loc if loc[k] != None}
    query = users.find(criteria)

この構文は、Python2.7で導入された辞書内包表記を使用していることに注意してください。以前のバージョンのPythonを実行している場合は、その1行を次のように置き換える必要があります。

criteria = dict((k, loc[k]) for k in loc if loc[k] != None)
于 2012-08-27T18:22:30.040 に答える