我试图防止使用eval
基于示例how-to-avoid-eval-in-python-for-string-conversion使用ast
。挑战在于有十二个这样的self.ch%s_label
被创建,但它的变量根据GUI中的用户输入而改变。python/Pyqt5 - 如何避免使用ast和获取ValueError时的eval:试图提高代码安全性时使用格式错误的字符串
我的代码:
import ast ...etc.
....
channel_no += 1
ch_width = eval('self.ch%s_label.frameGeometry().width()' % (channel_no))
当我把它变成:
ch_width = ast.literal_eval('self.ch%s_label.frameGeometry().width()' % (channel_no))
我会得到错误:
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
更改代码(使用关““)保留错误:
ch_width = ast.literal_eval("'self.ch%s_label.frameGeometry().width()' % (channel_no)")
还有什么其他选择...有什么建议吗?
@ snakecharmerb ..感谢您使用'getattr'的明确例子。我正在深入讨论'functools partial',但是这使用默认的内置代码更加pythonic。干杯。 ...它的工作原理是:-) – ZF007