Modellazione di una domanda oggetto REST (Python)

2

Ho un'API REST che voglio modellare in una classe in modo da poter accedere alle proprietà usando la notazione a punti (notazione elenco JS). Ho definito esplicitamente le proprietà sulla mia classe utilizzando i tag @property rispetto alle proprietà note del JSON restituito, ma poiché sto modellando un'API di terza parte, ho bisogno di un modo per aggiungere anche dinamicamente le proprietà se non sono presenti nella classe . Non voglio ereditare dal dizionario perché non funziona bene con le proprietà definite. Sembrano tornare come None il più delle volte. Inoltre, non voglio che gli utenti abbiano due modi per ottenere le informazioni (cercando di seguire lo zen di python). La notazione dei punti va bene, non è necessario essere in grado di accedere ai dati tramite i nomi KEY.

L'utilizzo di setattr potrebbe essere una possibile posizione in fase di esecuzione, ma penso di aver bisogno di un passaggio aggiuntivo perché il compilatore genera un errore non implementato se una proprietà non esiste sulla classe. Devo implementare __setattr__ e __setattribute__ sull'oggetto per evitare questo errore e restituire solo None se la proprietà non esiste.

Devo solo supportare la sola lettura.

Grazie

    
posta code base 5000 18.04.2016 - 13:31
fonte

2 risposte

1

Quello che ho fatto è stato usare self.__dict__.update(json) che copia gli elementi nel dettato JSON nel dict dell'oggetto e quindi appaiono come proprietà dell'oggetto. Il client può quindi utilizzare la notazione a punti per accedervi o modificarli.

    
risposta data 18.04.2016 - 14:17
fonte
1

Puoi espandere ciò che intendi aggiungendo dinamicamente le proprietà? Suppongo che sia necessario farlo mentre il codice è in esecuzione, piuttosto che modificare semplicemente i file sorgente?

Se è così, puoi controllare le tuple con nome come parte del modulo delle raccolte Python

link

Puoi creare una classe dinamicamente come questa

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

e quindi creare oggetti da quella classe

record = EmployeeRecord('Bob', 34, 'manager', 'IT', 'Senior')
print record.name
print record.age

Puoi racchiudere questo codice nel codice che recupera la struttura dati dall'API e crea dinamicamente la classe ogni volta in base alla struttura dati corrente.

    
risposta data 21.04.2016 - 18:30
fonte

Leggi altre domande sui tag