2017-11-25 138 views
0

我试图防止使用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)") 

还有什么其他选择...有什么建议吗?

回答

1

你可以使用getattr摆脱使用动态构造属性名称实例的属性:

ch_width = getattr(self, 'ch%s_label' % channel_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如果某个对象没有该属性,就像您期望的那样。

+0

@ snakecharmerb ..感谢您使用'getattr'的明确例子。我正在深入讨论'functools partial',但是这使用默认的内置代码更加pythonic。干杯。 ...它的工作原理是:-) – ZF007

相关问题