2010-07-24 7 views
8

Ich baue eine DSL für die Formularvalidierung in Python und eine der Anforderungen besteht darin, dass ein Feld größer oder kleiner als eine Konstante oder ein anderer Feldwert sein kann. Als Ergebnis versuche ich Operatoren wie <, >, <= und >= zu ihren entsprechenden Funktionen im Modul operator zu mappen, so dass sie während der Feldvalidierung aufgerufen werden können.Zuordnen von Vergleichsoperatoren zu Funktionsaufruf

Ich weiß, ich könnte nur ein Wörterbuch erstellen, um den Operator der Funktion zuzuordnen, aber gibt es einen schöneren Weg, es zu tun? Gibt es eine Möglichkeit, auf das integrierte Python-Mapping zuzugreifen?

+0

Ich bin mir nicht sicher, ob ich verstehe, was genau Sie erreichen wollen. Python "ordnet" diese Operatoren der klasseneigenen Implementierung von entsprechenden Methoden zu, wie '__cmp__',' __eq__', '__ne__' usw. und die genaue Zuordnung zur tatsächlichen Vergleichsfunktion hängt von der Klasse ab. –

+1

Absolut. Irgendwo in Python ist also eine Logik, die weiß, dass wenn sie '<' sieht, sie 'obj .__ lt__' aufrufen soll. Aber ich habe eine Zeichenfolge, "<" - wie kann ich sie in einen Funktions- oder Methodenaufruf konvertieren? –

+0

Können Sie ein In-Kontext-Beispiel angeben? –

Antwort

4

Soweit mir bekannt ist, gibt es kein integriertes Wörterbuch die Zeichenfolge ">" auf die Funktion Zuordnung operator.lt usw.

Wie andere haben darauf hingewiesen, der Python-Interpreter selbst Verwendung solcher nicht machen ein Wörterbuch, da der Prozess des Parsen und Ausführen von Python-Code zuerst die Zeichenfolge ">" in einen Token übersetzt, der diesen Operator darstellt, der dann in Bytecode übersetzt wird, und das Ergebnis der Ausführung dieses Bytecodes die Methode __lt__ direkt ausführt, anstatt über die operator.lt Funktion.

3

Das interne Python-Mapping von "<" zu __lt__ (und so weiter) ist nirgendwo in der Standardbibliothek verfügbar. Es gibt eine Menge über Pythons Interna, die nicht als Toolkit verfügbar gemacht werden. Ich bin mir überhaupt nicht sicher, wie solch ein Mapping erstellt werden würde. Was mappt auf __getitem__?

Sie müssen nur Ihr eigenes Mapping erstellen. Es sollte nicht schwierig sein.

Verwandte Themen