Je suis dans le problème suivant:
for key,value in kwargs: self.key = value
3 Réponses :
Vous devez passer des kwargs non décomptables à Sortie: P> étudiant code> et utiliser
setattr (objet, nom, valeur) code> pour définir les valeurs:
{'lastname': 'Johnson', 'Sports': ['volleyball', 'skiing'], 'firstname': 'John', 'Nationality': 'Middle-Earth'}
Bien plus naturel que le déballage d'un dict comme celui-ci serait d'utiliser des mots-clés réels, tels que Nationality = "Middle-Terre" Code> et ainsi de suite. Et s'il y a un nombre fini d'arguments facultatifs, rendant le nom
__ init __ code> nom de méthode et donnez-leur des valeurs par défaut raisonnables (comme
Aucun code>) est probablement meilleur que d'utiliser
kwargs < / code> quand même.
Seattr () est exactement ce que je cherchais. La raison pour laquelle je ne peux pas utiliser la nationalité = "Middle-Terre", c'est que je reçois un dictionnaire d'un fichier JSON dans le.
Vous pouvez l'utiliser dans le Cependant, il n'est pas recommandé pour le code que nécessaire pour être réutilisable. S'il y a des fautes de frappe dans les paramètres de mots-clés, vous ne les attraperez pas. Des outils de vérification de code tels que Pylint ne reconnaissent pas les attributs de classe initialisés comme ça. Vous pouvez utiliser le motif suivant (surtout s'il existe de nombreux arguments Kewyord): P> __ init __ code> Méthode:
class Student:
def __init__(self, firstname, lastname, **kwargs):
self.firstname = str(firstname)
self.lastname = str(lastname)
self.nationality = None
self.sports = None
for k, v in kwargs.items():
if k in self.__dict__:
setattr(self, k, v)
else:
raise KeyError(k)
# this works
s=Student('John', 'Doe', sports=['socker'])
# this will give an error
s=Student('John', 'Doe', sprots=['socker'])
Grande solution. Le contrôle supplémentaire si k in soi .__ dict __ code> est très utile. Le rend plus erroné et permet toujours à l'utilisation de ** kwargs plutôt que de transmettre tous les arguments nommés un par un à init b>
Je recommande d'indiquer à l'avant sur quels attributs une instance peut avoir et utiliser des valeurs sentinelles telles que puis p> Si vous souhaitez analyser JSON qui peut avoir des noms de clés qui ne correspondent pas à vos noms de paramètres, Définir une méthode de classe pour faire le traitement pour obtenir des arguments appropriés. Par exemple, p> puis p> Aucun code> pour indiquer le manque de valeur "réelle" sur l'élimination de l'attribut. Par exemple:
Êtes-vous sûr de ne vouloir que définir certains attributs certains de l'heure, sur vos objets? Il est gênant de comprendre si un attribut existe. Il est beaucoup plus facile si vous pouvez attribuer une valeur par défaut, comme
Aucun code>, s'il n'y a pas de données utiles.
C'est un peu i> d'une mauvaise idée. Une partie de l'idée de définir une classe est que vous savez i> quels attributs une instance aura sans avoir à recourir à l'introspection. Mieux vaut affirmer qu'une instance sera i> attributs
nationalité code> et
sports code>, mais la valeur de chacun pourrait être
Aucun code> ou Liste vide ou similaire si aucune valeur n'est explicitement donnée à l'instanciation.
(Cela dit, en utilisant
** kwargs code> pour une classe qui prend en charge l'héritage coopératif via
super code> est une bonne idée très i> pour des raisons très différentes. )
D'accord avec les commentaires. Je sais que ce code ne gagnera pas un prix Nobel, mais mes questions étaient plus sur le concept. Savoir comment cela peut être fait, pourrait être utile s'il existe de nombreux attributs. là, je préférerais utiliser ** kwargs que des dizaines paramètres OP dans mon init b>