如何将这些功能变为通用

时间:2013-04-08 04:45:03

标签: python pymongo introspection getattr generic-function

我想缩短我的代码,因为我有更多这样的功能。我想知道我是否可以使用getattr()做一些类似this的问题。

嗯,这就是我所拥有的:

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)

我在pymongo上使用flaskJSON个助手。

我想要的是制作一个接受任何类型对象的getAllFrom(x,db)函数。我不知道该怎么做,但我想打电话给db.X.find(),其中 X 通过该功能。

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

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:0)

我想说最好为每项任务分别设置各种功能。然后,您可以decorators获取不同功能之间的通用功能。例如:

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

享受!