La modifica di un __dict__ di un oggetto per impostarne le proprietà è considerata Pythonic?


12

Ho una classe che gonfia gli oggetti dalle righe trovate in un database (o un'altra fonte, ad esempio MongoDB, un file CSV, ecc.). Per impostare le proprietà dell'oggetto, fa qualcosa di simile a self.__dict__.update(**properties)o obj.__dict__.update(**properties).

Questo è considerato Pythonic? È un buon modello che dovrei continuare a usare o è considerato una cattiva forma?


1
Non so se è Pythonic, ma è certamente più comune farlo in Dunder Init.
user16764,

Risposte:


10

In Python 3.3 è stato aggiunto un nuovo tipo types.SimpleNamespace()e nella documentazione è descritto così:

Il tipo è approssimativamente equivalente al seguente codice:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

Nota il __init__metodo del tipo; non è possibile ottenere una migliore approvazione della tecnica rispetto alla documentazione di Python.


Sebbene SimpleNamespacesia abbastanza diverso dalla maggior parte dei tipi in quanto non ha un set fisso di attributi.

7
Bene, parlando della documentazione di Python, da docs.python.org/2/library/stdtypes.html "Un attributo speciale di ogni modulo è __dict__. Questo è il dizionario che contiene la tabella dei simboli del modulo. La modifica di questo dizionario cambierà effettivamente il simbolo del modulo tabella, ma l'assegnazione diretta __dict__all'attributo non è possibile (è possibile scrivere m.__dict__['a'] = 1, che definisce m.aessere 1, ma non è possibile writem.__dict__ = {}). La modifica __dict__diretta non è consigliata ", che è ciò che inizialmente mi ha spinto a porre questa domanda.
skyler,

@skyler: nota che menziona solo lo spazio dei nomi del modulo . La globals()funzione restituisce lo stesso spazio dei nomi e di solito ci sono modi migliori per risolvere i problemi rispetto all'impostazione dinamica dei globi, da cui l'avvertimento.
Martijn Pieters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.