2015-09-09 25 views
0

一位朋友最近告訴我,你可以在Python中創建一個dict的子類的實例,然後使用該實例來保存,更新等等。似乎你有更多的控制權,並且它看起來也更容易。爲什麼使用MongoAlchemy的時候可以繼承一個Python Dict?

class Marker(dict): 

    def __init__(self, username, email=None): 
     self.username = username 
     if email: 
     self.email = email 
    @property 
    def username(self): 
     return self.get('username') 
    @username.setter 
    def username(self, val): 
     self['username'] = val 
    def save(self): 
     db.collection.save(self) 

回答

1

作者在這裏。您希望使用它的一般原因(或許多類似庫中的一個)是爲了安全起見。當你爲一個MongoAlchemy Document分配一個值時,它會檢查一個檢查以確保你指定的所有約束都滿足(例如,類型,字符串長度,數值範圍)。

它也有一個查詢DSL,可以使用比json-like內置語法更令人愉快的使用方式。下面是從文檔的例子:

>>> query = session.query(BloodDonor) 
>>> for donor in query.filter(BloodDonor.first_name == 'Jeff', BloodDonor.age < 30): 
>>> print donor 
Jeff Jenkins (male; Age: 28; Type: O+) 

的MongoAlchemy Session對象還可以模擬交易:

with session: 
    do_stuff() 
    session.insert(doc1) 
    do_more_stuff() 
    session.insert(doc2) 
    do_even_more_stuff() 
    session.insert(doc3) 
    # note that at this point nothing has been inserted 
# now things are inserted 

這並不意味着這些刀片是一個原子操作,甚至可以說,所有的寫入將會成功 - 但這確實意味着如果你的應用程序在「do_stuff」函數中有錯誤,你將不會完成一半的插入操作。所以它可以防止一個特定的和合理的常見類型的錯誤

相關問題