2013-09-05 8 views
6

Ich verwende colander zu validieren (und Deserialisierung JSON-Daten) Eingabe für einige Web-Services.Catch leere Liste mit Sieb

Ich möchte eine Regel zu einem Sieb-Schema hinzufügen, um eine leere Liste zu fangen, aber ich kann nicht herausfinden, wie es geht.

Jetzt habe ich das folgende Beispiel, einen Aufruf der Funktion f() mit zwei verschiedenen Datensätzen demonstriert. Gerne möchte ich später die colander.Invalid Ausnahme auslösen wegen der leeren events Liste

import colander 

def f(data): 
    class EventList(colander.SequenceSchema): 
     list_item = colander.SchemaNode(colander.Int()) 

    class Schema(colander.MappingSchema): 
     txt = colander.SchemaNode(colander.String()) 
     user = colander.SchemaNode(colander.String()) 
     events = EventList() 

    try: 
     good_data = Schema().deserialize(data) 
     print 'looks good' 
    except colander.Invalid as e: 
     print "man, your data suck" 


good_data = {'txt' : 'BINGO', 
      'user' : 'mogul', 
      'events' : [11, 22, 33]} 
f(good_data) 

bad_data = {'txt' : 'BOOM', 
      'user' : 'mogul', 
      'events' : []} 
f(bad_data) 

Verbesserungsvorschläge?

Antwort

8

Haben Sie versucht, den colander.Length Validator zu verwenden?

Versuchen Sie Ihr Schema mit ändern:

events = EventList(validator=colander.Length(min=1)) 

Für bad_data diese erhöhen sollte:

Invalid: {'events': u'Shorter than minimum length 1'} 
+1

BANG! Spot auf. Danke, Mann! Irgendwann probierte ich das fast aus, konnte es aber nicht richtig machen. Wo ist der Spendenbierknopf, wenn Sie ihn brauchen? – mogul