eval ist (nicht unbedingt) evil

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Benutzeravatar
phg-berlin
Beiträge: 58
Registriert: 12 Mär 2024, 20:22
Wohnort: Berlin
Kontaktdaten:

eval ist (nicht unbedingt) evil

Beitrag von phg-berlin » 11 Nov 2024, 13:59

Hallo liebes Forum,

Bisher habe ich hier im Forum meistens Fragen gestellt.
Heute möchte ich mal eine Antwort bzw. einen Tip/Trick vorstellen:

Bei javascript - und auch in Python - gibt es die Funktion eval. Für javascript existiert der Spruch "eval ist evil". Von der Benutzung dieser Funktion wird völlig zu Recht aus Sicherheitsgründen abgeraten. Diese Sicherheitsbedenken gelten meines Erachtens im Zusammenhang mit der folgenden Anwendung aber nicht:

In meinen Modellen kommt es häufig vor, dass ein bestimmter Aktor (Motor, LED, ...) mehrfach vorhanden ist und mit fast identischen Funktionen angesteuert wird. Da in den Blöcken der Name des Aktors nicht in einer Variablen angegeben werden kann, muss diese Funktion für jeden Aktor einzeln erzeugt werden:
eval_0.png
eval_0.png (53.44 KiB) 1450 mal betrachtet

Gezeigt wird der Code, der zwei LEDs zum Blinken bringt. Für jede weitere LED wird eine entsprechende Funktion benötigt. Diese können zwar leicht als Duplikate erzeugt werden. Falls Sie deutlich komplexer sind, blähen Sie das Programm aber sehr auf. Und änderungsfreundlich ist diese Lösung absolut nicht.

Dies kann durch Einsatz der eval-Funktion verhinder werden. Hierzu wird über die Zwischenablage der zugehörige Aufruf in einen Python-Aufruf eingetragen. Das wird dann wiederum als String in den eval-Aufruf eingebettet. Die laufende Nummer des Aktors wird dann durch den übergebenen Aufrufparameter ersetzt.

Im folgenden Programmfragment werden aus einer Schleife heraus mehrere LEDs zum Blinken gebracht.

eval_1.png
eval_1.png (49.84 KiB) 1450 mal betrachtet
Natürlich müssen die entsprechenden Aktoren in der Controllerkonfiguration vorhanden sein.

Nähere Angaben zur eval-Anweisung in Python werden von Google reichlich nachgewiesen.

Viel Spass beim Ausprobieren.

Horst

Antworten