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。干杯而且它在非正常情况下工作:-)