2017-09-27 19 views
0

目前更新的對象,我更新一個購物清單的項目如下如何以更Python的方式

def update_item(self, name, price, quantity, shoppinglist): 
     # updates self If the variable is not equal to the name None 
     if name != "None": 
      self.name = name 
     if price != "None": 
      self.price = price 
     if quantity != "None": 
      self.quantity = quantity 
     if shoppinglist != "None": 
      self.shoppinglist_id = shoppinglist.id 
     db.session.commit() 

但是,我覺得有可能是一個更好的方式來做到這一點。任何幫助將不勝感激。

+0

你試圖一次更新的一切,並使用「無」字符串作爲指標值事情複雜的事實。爲什麼不爲每個人單獨設置一個?或通過字典? – Carcigenicate

+0

這是一個Flask API,我使用字符串「None」來表示用戶不想更新該字段。如果我爲每個應用使用setter,他們仍然會檢查值是否等於「None」? –

+0

這感覺很糟糕。您應該設置每個變量,即使該變量設置爲「無」。這樣,當你嘗試訪問一個變量時,它不會崩潰。 – ddg

回答

0

這會做你想做的。它與您的示例函數具有相同的行爲,但更簡潔。

def update_items(self, **kwargs): 
    assert set(kwargs) == {"name", "price", "quantity", "shoppinglist"} 

    for key, val in kwargs.items(): 
     if val!="None": 
      setattr(self, key, val) 

    db.session.commit() 

如果您需要帶有默認值的可選參數,那麼您應該這樣做。

def update_item(self, name=None, price=None, quantity=None, shoppinglist=None): 
    # updates self If the variable is not equal to the name None 
    if name is not None: 
     self.name = name 
    if price is not None: 
     self.price = price 
    if quantity is not None: 
     self.quantity = quantity 
    if shoppinglist is not None: 
     self.shoppinglist_id = shoppinglist.id 
    db.session.commit() 

您可以結合這兩種方法:

def update_items(self, **kwargs): 
    okay = {"name", "price", "quantity", "shoppinglist"} 

    for key, val in kwargs.items(): 
     if val in okay and val!="None": 
      setattr(self, key, val) 

    db.session.commit() 
+0

問題是我不知道用戶想更新什麼值。即他/她可能想要更新價格,而另一個可能想要更新名稱 –

相關問題