-1
votes

en utilisant ** kwargs dans __init__

Je suis dans le problème suivant:

for key,value in kwargs:
   self.key = value


4 commentaires

Ê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 , s'il n'y a pas de données utiles.


C'est un peu d'une mauvaise idée. Une partie de l'idée de définir une classe est que vous savez quels attributs une instance aura sans avoir à recourir à l'introspection. Mieux vaut affirmer qu'une instance sera attributs nationalité et sports , mais la valeur de chacun pourrait être Aucun ou Liste vide ou similaire si aucune valeur n'est explicitement donnée à l'instanciation.


(Cela dit, en utilisant ** kwargs pour une classe qui prend en charge l'héritage coopératif via super est une bonne idée très 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


3 Réponses :


2
votes

Vous devez passer des kwargs non décomptables à étudiant code> et utiliser setattr (objet, nom, valeur) code> pour définir les valeurs: xxx pré>

Sortie: P>

{'lastname': 'Johnson', 'Sports': ['volleyball', 'skiing'], 'firstname': 'John', 'Nationality': 'Middle-Earth'}


2 commentaires

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" et ainsi de suite. Et s'il y a un nombre fini d'arguments facultatifs, rendant le nom __ init __ nom de méthode et donnez-leur des valeurs par défaut raisonnables (comme Aucun ) 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.



2
votes

Vous pouvez l'utiliser dans le __ init __ code> Méthode: xxx pré>

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>

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'])


1 commentaires

Grande solution. Le contrôle supplémentaire si k in soi .__ dict __ 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



0
votes

Je recommande d'indiquer à l'avant sur quels attributs une instance peut avoir et utiliser des valeurs sentinelles telles que Aucun pour indiquer le manque de valeur "réelle" sur l'élimination de l'attribut. Par exemple: xxx

puis xxx

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, xxx

puis xxx


0 commentaires