2011-10-13 12 views
6

Sto scrivendo un'interfaccia per essere utilizzata da due applicazioni. Questa interfaccia deve utilizzare alcune classi DoSomethingRequest e DoSomethingResponse per eseguire la comunicazione.Convalida dell'oggetto modello Python

Esiste una libreria che esegue la convalida del modello, ad esempio come Django Model?

Io fondamentalmente vogliono essere in grado di dire qualcosa del tipo:
oggetto A deve avere una una proprietà "voci" di tipo "text" proprietà di tipo str(), una proprietà "numero" di tipo int(), elenco(). In un modo ASCIUTTO.

Sto cercando qualcosa di simile a quanto segue, o meglio:

class MyEmbeddedModelClass(EmbeddedModel): 
    text = TextField(required = True) 

class MyModel(Model): 
    text = TextField(required = True) 
    number = IntField(default = 0) 
    items = ListField(EmbeddedModel) 


a = MyModel() 
a.text = "aaaa" 
a.number = 1 
a.items = [ 
    MyEmbeddedModelClass("bbbb"), 
    MyEmbeddedModelClass("cccc"), 
    MyEmbeddedModelClass("dddd") 
] 
a.validate() 

So che posso scrivere il mio, ma io preferisco utilizzare una libreria, se disponibili, sono un po 'nuova per Questo.

+0

Perché non usare l'ORM di Django se ti piace? –

+1

@ChrisMorgan: Perché l'ORM di Django è specifico Relazionale, non c'è EmbeddedModel. L'ORM di Django ha anche molte cose extra di cui non ho bisogno. – Prody

risposta

3

Se si desidera applicare le interfacce, o utilizzare il design per contratto, allora probabilmente vuole la libreria zope.interface. Nonostante il nome, che riflette le sue origini in Zope, in realtà non è affatto legato a tale struttura ed è abbastanza utilizzabile al di fuori.

+1

Prody Penso che questo sia quello che stai cercando – llazzaro

2

Penso che i decoratori potrebbero essere usati per questo. controllare questo link

Combining Descriptors with Class Decorators for Validation

Per un approccio diverso check Duck typing

+1

L'ho già fatto, ma non mi piace il modo in cui devo ripetere il nome della proprietà quando si imposta il validatore. – Prody

+0

E la digitazione anatra? Penso che sia un approccio migliore in modo orientato agli oggetti. Ti affidi ad altri oggetti per usare il modo giusto il tuo oggetto. questo approccio diverso, rispetto al tuo, non è sicuro che ti piacerà. – llazzaro

+0

Mi piace la digitazione anatra, ma ho bisogno di trovare un modo per dire alle persone che usano questa interfaccia che "gli articoli" dovrebbero essere un elenco di istanze di tipo "MyEmbeddedModelClass' – Prody

0

Poiché python è dinamico, la convenzione è richiedere un oggetto a comportarsi come come un'istanza di una particolare classe piuttosto che imporre un tipo specifico.

Da qualche parte nel codice, preferibilmente nel punto in cui è necessario accedere a tali proprietà, ma il più presto possibile asserire che l'oggetto ha quelle proprietà e inoltre affermare che tali proprietà sono come ci si aspetta che siano.

Questo solleva un'eccezione AssertionError se l'oggetto o, indipendentemente dal tipo, se manca l'attributo 'someattribute':

assert(hasattr(o, 'someattribute')) 

Inoltre, se o.someattribute non è una stringa:

assert(isinstance(o.someattribute, basestring)) 
+0

Questo è esattamente quello che sto cercando di fare, ma voglio farlo in un metodo 'validate (self)' automaticamente. In questo caso, utilizzare le classi TextField/IntField/etc. – Prody

+0

Attenzione che gli asserti possono essere disabilitati, chiamando Python con il flag '' -O'', quindi non dovrebbero essere considerati affidabili per il controllo del flusso! Basta usarli come "controlli extra" per testare il tuo codice .. – redShadow

Problemi correlati