0

我想缩短我的代码,因为我有更多这样的功能。我想知道我是否可以使用 getattr() 来做这个人问的事情。

好吧,这就是我所拥有的:

def getAllMarkersFrom(db, asJSON=False):
    '''Gets all markers from given database. Returns list or Json string'''
    markers = []
    for marker in db.markers.find():
        markers.append(marker)
    if not asJSON:
        return markers
    else:
        return json.dumps(markers, default=json_util.default)

def getAllUsersFrom(db, asJSON=False):
    '''Gets all users from given database. Returns list or Json string'''
    users = []
    for user in db.users.find():
        users.append(user)
    if not asJSON:
        return users
    else:
        return json.dumps(users, default=json_util.default)

我正在使用pymongoflask助手JSON

我想要的是创建一个getAllFrom(x,db)接受任何类型对象的函数。我不知道该怎么做,但我想调用db.X.find()X通过函数传递的位置。

嗯,就是这样。希望您能够帮助我。谢谢!

4

2 回答 2

3

这些函数中几乎没有任何真正的代码。每个的一半是构造函数的缓慢重建list()。一旦你摆脱了它,你就会得到一个条件,它可以很容易地压缩成一行。所以:

def getAllUsersFrom(db, asJSON=False):
    users = list(db.users.find())
    return json.dumps(users, default=json_util.default) if asJSON else users

这对我来说似乎很简单,不需要重构。这两个函数之间有一些共同点,但将它们分开不会进一步减少代码行数。

然而,可能简化的一个方向是不传递标志来告诉函数返回什么格式。让调用者这样做。如果他们想要它作为一个列表,有list(). 对于 JSON,您可以提供自己的辅助函数。因此,只需编写函数以返回所需的迭代器:

def getAllUsersFrom(db):
    return db.users.find()

def getAllMarkersFrom(db):
    return db.markers.find()

以及将结果转换为 JSON 的辅助函数:

def to_json(cur):
    return json.dumps(list(cur), default=json_util.default)

那么,把它们放在一起,你只需调用:

markers = list(getAllMarkersFrom(mydb))

或者:

users = to_json(getAllUsersFrom(mydb))

根据需要。

如果你真的想要一个通用函数来请求各种类型的记录,那就是:

def getAllRecordsFrom(db, kind):
    return getattr(db, kind).find()

然后调用它:

users = list(getAllRecordsFrom(mydb, "users"))

等等

于 2013-04-08T04:59:34.597 回答
0

我会说最好为每个任务设置单独的功能。然后你可以在不同的函数之间有共同功能的装饰器。例如:

@to_json
def getAllUsersFrom(db):
    return list(db.users.find())

请享用!

于 2013-04-08T06:20:28.177 回答