python/Pyqt5-如何在使用ast和获取值时避免eval错误:attemt中的字符串格式错误以提高代码安全性
基于使用python/Pyqt5-如何在使用ast和获取值时避免eval错误:attemt中的字符串格式错误以提高代码安全性,python,eval,pyqt5,abstract-syntax-tree,Python,Eval,Pyqt5,Abstract Syntax Tree,基于使用ast的示例,我试图阻止使用eval。挑战在于有十几个这样的self.ch%s_标签,但是它的变量会根据用户在GUI中的输入而变化 我的代码: 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
ast
的示例,我试图阻止使用eval
。挑战在于有十几个这样的self.ch%s_标签
,但是它的变量会根据用户在GUI中的输入而变化
我的代码:
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))
我将获得错误:
ch_width = ast.literal_eval("'self.ch%s_label.frameGeometry().width()' % (channel_no)")
文件“c:\python\anac2\lib\ast.py”,第80行,文本值
返回\u转换(节点\u或字符串)
文件“c:\python\anac2\lib\ast.py”,第79行,在转换中
raise VALUERROR('格式错误的字符串')
ValueError:格式不正确的字符串
更改代码(使用关闭“”)会保留以下错误:
ch_width = ast.literal_eval("'self.ch%s_label.frameGeometry().width()' % (channel_no)")
还有什么其他选择。。。有什么建议吗?您可以使用
getattr
使用动态构造的属性名称从实例中获取属性:
ch\u width=getattr(self,'ch%s\u标签'%channel\u no.).frameGeometry().width()
或逐步:
channel_no = 5
attr_name = 'ch%s_label' % channel_no
attr = getattr(self, attr_name)
ch_width = attr.frameGeometry().width()
以这种方式使用
getattr
也意味着,如果对象没有该属性,您将获得一个AttributeError
,正如您所期望的那样。@snakecharmerb。。感谢您提供了使用getattr
的清晰示例。我正在深入研究functools-partial
,但是使用默认的内置代码更像python。干杯而且它在非正常情况下工作:-)