2 Stimmen

Ist eval() immer falsch?

Ich weiß, dass eval() und exec() vermieden werden sollten, aber in dieser Situation scheint es die beste Wahl zu sein: Ich erhalte Werte aus Kontrollkästchen und Textfeldern in wxPython und füge sie in meine Konfigurationsklasse ein. Hier ist, wie ich eval() verwende:

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(eval('self.m_checkBox_'+key+'.GetValue()'))

Es gibt keine Sicherheitsprobleme, weil es keine Benutzereingaben gibt, die ausgewertet werden müssen, und es scheint mir ziemlich klar zu sein. Gibt es eine bessere Möglichkeit, dies zu tun?

6voto

Sam Mussmann Punkte 5813

Wie wäre es damit:

config = wx.Config()
checkBoxes = {'option_1': m_checkBox_option_1, 
              'option_2': m_checkBox_option_2}
for checkbox in checkBoxes:
    config.Write(checkbox, str(checkBoxes[checkbox].Value()))

6voto

Brighid McDonnell Punkte 4209

Die anderen Antworten haben gute Arbeit geleistet, indem sie alternative Lösungen für das vorliegende Problem vorschlugen, also werde ich mir die größere Frage ansehen, die Sie gestellt haben, und Sie auf die Worte eines klugen Entwicklers verweisen, der schrieb ausführlich über die Probleme von eval .


Wenn ich sehe eval Eine dunkle Wolke legt sich über den umgebenden Code, und ich beobachte die ganze Sache mit Argwohn und Misstrauen, bis ich mich vergewissert habe, dass ihre Verwendung gerechtfertigt ist.

[...]

eval ist eine schlechte Idee, weil Fast jedes Mal, wenn ich gesehen habe, dass sie verwendet wurde, hat sie unvorhergesehene und unnötige Probleme verursacht.

Die wichtigen Teile sind "unvorhergesehen" und "unnötig". Unvorhergesehen, weil eval hat eine großer Stapel Eine Liste, an die ich mich nicht ohne Weiteres erinnern kann. Unnötig, weil die Alternativen zu eval in der Regel nicht viel mehr Arbeit bei der Umsetzung erfordern, während die Probleme, die durch eval sind subtil und ruchlos.

[...]

eval ist schlecht, weil es eine Menge subtiler Sicherheits- und Übersetzungsprobleme mit sich bringt, das Bytecode-Caching aushebelt, Syntax- und andere Fehler bis zur Laufzeit versteckt, schwer nachvollziehbare Aktionen aus der Ferne verursacht und die Syntaxhervorhebung aushebelt. Es macht Ihren Code einfach schlechter.


Sie sagten, Sie hätten darauf geachtet, dass Sie nicht auffliegen. eval() auf Benutzereingaben. Großartig! Das ist ein guter erster Schritt - aber wie in dem Zitat erwähnt, ist das noch lange nicht das Ende der Liste der Dinge, über die man sich Gedanken machen muss, wenn man eval() . Was diese Antwort und die anderen, die Sie bekommen haben, zusammenbringt, ist, dass eval() ist eine falsche Wirtschaft. Es handelt sich zumindest um das Entstehen von technischen Schulden. Wie bei der Optimierung sind die beiden Antworten auf die Frage "Soll ich die eval() ?" sind "du solltest nicht" und "du solltest nicht dennoch ."

5voto

Jakob Bowyer Punkte 32375
config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(getattr(self, 'm_checkBox_'+key).Value()))

-1voto

phihag Punkte 261131

Normalerweise gibt es eine bessere Möglichkeit, es zu schreiben. In diesem Fall ist es locals() obwohl Sie vielleicht lieber eine Liste von Kontrollkästchen-Objekten anstelle ihrer Namen und mehrerer Variablen hätten:

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(locals()['m_checkBox_' + key].Value()))

-1voto

Victor Gavro Punkte 1247
config.Write(key, str(locals()['m_checkBox_%s' % key].Value()))

Verwenden Sie locals() für Einheimische, globals() für Globals, getattr(obj, attr_name) um attr von obj nach attr_name zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X