2017-09-27 3 views
0

Actuellement, je suis à jour un élément de la liste d'achats comme ci-dessousComment mettre à jour un objet dans une plus pythonique façon

cependant
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() 

I, pense qu'il pourrait y avoir une meilleure façon de le faire. Toute aide serait appréciée.

+0

Le fait que vous essayez de mettre à jour tout à la fois, et en utilisant une chaîne « Aucun » en tant que valeur de l'indicateur compliquent les choses. Pourquoi ne pas avoir un setter séparé pour chacun? Ou passer dans un dictionnaire? – Carcigenicate

+0

Il s'agit d'une API Flask et j'utilise la chaîne "None" pour indiquer que l'utilisateur ne souhaite pas mettre à jour ce champ. Si j'utilise des setters pour chacun d'entre eux, doivent-ils tous vérifier si la valeur est égale à "None" ?? –

+0

Cela fait mal. Vous devez définir chaque variable, même si cette variable est définie sur "Aucun". De cette façon, lorsque vous essayez d'accéder à une variable, elle ne tombe pas en panne. – ddg

Répondre

0

Cela fera ce que vous voulez. Il a le même comportement que votre fonction d'exemple, tout en étant plus concis.

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

Si vous voulez des paramètres optionnels avec des valeurs par défaut, alors vous devriez le faire.

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

Vous pouvez combiner ces deux approches:

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

Le problème est que je ne sais pas à l'avance quelles valeurs l'utilisateur veut mettre à jour. il peut vouloir mettre à jour le prix pendant qu'un autre peut vouloir mettre à jour le nom –