J'ai une classe qui gonfle des objets à partir de lignes trouvées dans une base de données (ou une autre source, par exemple MongoDB, un fichier CSV, etc.). Pour définir les propriétés de l'objet, il fait quelque chose comme self.__dict__.update(**properties)
ou obj.__dict__.update(**properties)
.
Est-ce considéré comme Pythonic? Est-ce un bon modèle que je devrais continuer à utiliser, ou est-ce considéré comme une mauvaise forme?
Réponses:
En Python 3.3, un nouveau type a été ajouté
types.SimpleNamespace()
, et dans la documentation il est décrit ainsi:Notez la
__init__
méthode du type; vous ne pouvez pas obtenir une meilleure approbation de la technique que la documentation Python.la source
SimpleNamespace
soit assez différent de la plupart des types, il n'a pas d'ensemble d'attributs fixe.__dict__
. C'est le dictionnaire contenant la table des symboles du module. La modification de ce dictionnaire changera en fait le symbole du module , mais l'affectation directe à l'__dict__
attribut n'est pas possible (vous pouvez écrirem.__dict__['a'] = 1
, ce qui définitm.a
être 1, mais vous ne pouvez paswritem.__dict__ = {}
). La modification__dict__
directe n'est pas recommandée ", c'est ce qui m'a initialement incité à poser cette question.globals()
fonction renvoie le même espace de noms, et il existe généralement de meilleures façons de résoudre les problèmes que de définir des globaux de manière dynamique, d'où l'avertissement.