2013-04-08 64 views
0

我想縮短我的代碼,因爲我有更多這樣的功能。我想知道是否可以使用getattr()來做類似this的人問。如何將這些功能通用

那麼,在這裏它去什麼I`ve有:使用上JSONpymongoflask助手

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) 

我真的。

我想要的是製作一個接受任何類型對象的單一getAllFrom(x,db)函數。我不知道如何做到這一點,但我想打電話db.X.find(),其中X通過該功能。

好吧,它是。希望您能夠幫助我。謝謝!

+0

@BrenBarn,我已經試過了。我應該編輯這篇文章,因爲我真正想要的是瞭解解決這個問題的最佳方法。謝謝! – cesarvargas 2013-04-08 05:46:19

回答

0

我要說它更好地爲每個任務分配不同的功能。然後你可以有decorators用於不同功能之間的通用功能。例如:

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

享受!

+0

很棒的建議!謝謝! – cesarvargas 2013-09-10 20:30:56

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")) 

+0

謝謝你提供的所有提示!這似乎是最好的方法。 – cesarvargas 2013-04-08 05:36:04

+0

你會推薦我任何「最佳實踐」書嗎?謝謝! – cesarvargas 2013-04-08 05:47:08