2017-11-25 16 views
0

Ich versuche zu verhindern, eval basierend auf einem Beispiel how-to-avoid-eval-in-python-for-string-conversion mit ast zu verwenden. Die Herausforderung ist, dass es ein Dutzend dieser self.ch%s_label 's zu machen gibt, aber die Variable für es ändert sich basierend auf Benutzereingabe in der GUI.Python/Pyqt5 - wie Eval zu vermeiden, während mit ast und erhalten ValueError: fehlerhafte Zeichenfolge in Versuch, die Sicherheit des Codes zu verbessern

Mein Code:

import ast ...etc. 

.... 

channel_no += 1 

ch_width = eval('self.ch%s_label.frameGeometry().width()' % (channel_no)) 

Wenn ich es in ändern:

ch_width = ast.literal_eval('self.ch%s_label.frameGeometry().width()' % (channel_no)) 

Ich werde den Fehler:

File "c:\python\anac2\lib\ast.py", line 80, in literal_eval return _convert(node_or_string) File "c:\python\anac2\lib\ast.py", line 79, in _convert raise ValueError('malformed string') ValueError: malformed string

Ändern des Codes (mit Schließen "„) Behält den Fehler:

ch_width = ast.literal_eval("'self.ch%s_label.frameGeometry().width()' % (channel_no)") 

Welche anderen Optionen gibt es ... Irgendwelche Vorschläge?

Antwort

1

Sie könnten getattr verwenden das Attribut aus der Instanz zu erhalten, die dynamisch aufgebaut Attributnamen:

ch_width = getattr(self, 'ch%s_label' % channel_no).frameGeometry().width() Oder Schritt für Schritt:

channel_no = 5 
attr_name = 'ch%s_label' % channel_no 
attr = getattr(self, attr_name) 
ch_width = attr.frameGeometry().width() 

Mit getattr auf diese Weise auch bedeutet, dass Sie eine bekommen AttributeError wenn ein Objekt nicht wie erwartet das Attribut besitzt.

+0

@ snakecharmerb .. danke für das klare Beispiel der Verwendung von "getattr". Ich habe "functools partially" vertieft, aber das ist viel mehr Python mit dem eingebauten Standard-Code. Prost. ... und es funktioniert natürlich :-) – ZF007

Verwandte Themen