Ich habe verwendet eval()
in der Vergangenheit (und auch heute noch von Zeit zu Zeit) für das Massieren von Daten bei schnellen und schmutzigen Operationen verwendet. Es ist ein Teil des Werkzeugkastens, der für die Erledigung einer Aufgabe verwendet werden kann, sollte aber NIEMALS für etwas verwendet werden, das Sie in der Produktion einsetzen wollen wie z. B. Befehlszeilen-Tools oder Skripte, und zwar aus den in den anderen Antworten genannten Gründen.
Sie können sich nicht darauf verlassen, dass Ihre Benutzer das Richtige tun - niemals. In den meisten Fällen werden sie es tun, aber Sie müssen damit rechnen, dass sie all die Dinge tun, an die Sie nie gedacht haben, und all die Fehler finden, die Sie nie erwartet haben. Dies ist genau der Punkt, an dem eval()
wird von einem Hilfsmittel zu einer Belastung.
Ein perfektes Beispiel dafür wäre die Verwendung von Django, wenn man eine QuerySet
. Die Parameter, die an eine Abfrage übergeben werden, akzeptieren Schlüsselwortargumente, die etwa so aussehen:
results = Foo.objects.filter(whatever__contains='pizza')
Wenn Sie Argumente programmatisch zuweisen, könnten Sie etwa so vorgehen:
results = eval("Foo.objects.filter(%s__%s=%s)" % (field, matcher, value))
Aber es gibt immer einen besseren Weg, der nicht mit eval()
was die Übergabe eines Wörterbuchs per Referenz bedeutet:
results = Foo.objects.filter( **{'%s__%s' % (field, matcher): value} )
Auf diese Weise ist es nicht nur leistungsmäßig schneller, sondern auch sicherer und pythonischer.
Die Moral von der Geschicht?
Verwendung von eval()
es ok für kleine Aufgaben, Tests und wirklich vorübergehende Dinge, aber schlecht für eine dauerhafte Nutzung, denn es gibt fast immer einen besseren Weg, dies zu tun!
1 Stimmen
Können Sie einige Zitate von "mehreren Stellen" anführen, um zu klären, auf welche Bemerkungen Sie sich stützen? Es ist wichtig zu wissen, was Sie gelesen haben, um zu dem Schluss zu kommen, dass sie gemieden werden sollten. Das ist kein einfaches Thema, und Sie müssen Ihre Informationsquelle angeben, um Ihre Frage zu klären.
0 Stimmen
Soweit ich mich erinnere (da ich diese Orte im Laufe der Jahre nicht mit Lesezeichen versehen habe), haben die Warnungen in der Regel die Form von "Natürlich könnten wir
eval()
um dieses Problem zu lösen, aber das wäre unanständig."0 Stimmen
Das jüngste Beispiel war wohl die Verwendung von
exec()
als Mittel zum Kontrollfluss innerhalb des Programms.1 Stimmen
Ähnlich: stackoverflow.com/questions/637421/is-eval-supposed-to-be-nasty/
0 Stimmen
Kommentare der Art "Benutze einfach nicht `eval" sind überall zu finden, und ich stoße täglich auf sie. Hier ist einer: stackoverflow.com/questions/8294618/