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)

请注意,此语法使用 Python 2.7 中引入的字典推导。如果您运行的是较早版本的 Python,则需要将该行替换为

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