我想缩短我的代码,因为我有更多这样的功能。我想知道我是否可以使用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
上使用flask
和JSON
个助手。
我想要的是制作一个接受任何类型对象的getAllFrom(x,db)
函数。我不知道该怎么做,但我想打电话给db.X.find()
,其中 X 通过该功能。
嗯,就是这样。希望您能够帮助我。谢谢!
答案 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())
享受!