2010-11-18 9 views
0

Ich habe eine Datenbank mit Fragen, und einige dieser Fragen bedürfen einer speziellen Validierung. Also fügte ich meinem Modell ein Feld namens py_validation hinzu und wenn diese Fragen beantwortet wurden, validiere ich sie, indem ich den Code ausführe, der in py_validation gespeichert ist. Wenn ich den Code in das interpereter einfügen, funktioniert es richtig, aber wenn ich es in exec übergeben, schlägt es mit dem Fehler:Warum wird beim Aufruf von exec() ein Syntaxfehler angezeigt?

Traceback (most recent call last): 
    File "<string>", line 2, in <fragment> 
invalid syntax: <string>, line 2, pos 31 

Der Code sieht so aus:

# This code relies on the field type being a char field 
if len(value.split('\n')) < 5: 
    raise ValidationError(_("You must specify at least 5 widgets, one per line")) 
super(CharField, self).validate(value) 

Ich rufe es verwendet:

def do_py_validate(field, value): 
    exec field.py_validation 

, so dass Variablenwert im lokalen Bereich während der Ausführung ist. Es macht nicht wirklich Sinn, dass der Code, der gut funktioniert, bei Ausführung so bailt.

Antwort

5

Stellt sich heraus, um eine einfache Antwort zu haben. Die Zeichenkette enthielt \ r Zeichen, die Python nicht glücklich schluckte. Die Antwort kam, als ich versuchte, herauszufinden, wie man ein dateiähnliches Objekt zum Lesen der Zeichenfolge erstellt. Die Lösung lautet:

def do_py_validate(field, value): 
    exec field.py_validation.replace('\r', '') 

Diese fast so viel Spaß wie die Programmierung in Whitespace war.

Verwandte Themen