python/Pyqt5 - 如何在使用 ast 和获取 ValueError 时避免 eval:attemt 中的格式错误的字符串以提高代码安全性
Posted
技术标签:
【中文标题】python/Pyqt5 - 如何在使用 ast 和获取 ValueError 时避免 eval:attemt 中的格式错误的字符串以提高代码安全性【英文标题】:python/Pyqt5 - how to avoid eval while using ast and getting ValueError: malformed string in attemt to improve code safety 【发布时间】:2017-11-25 12:48:47 【问题描述】:我试图阻止使用eval
基于示例how-to-avoid-eval-in-python-for-string-conversion 使用ast
。挑战在于要制作十几个这样的self.ch%s_label
,但它的变量会根据用户在 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))
我会得到错误:
文件“c:\python\anac2\lib\ast.py”,第 80 行,在 literal_eval 中 返回 _convert(node_or_string) _convert 中的文件“c:\python\anac2\lib\ast.py”,第 79 行 raise ValueError('格式错误的字符串') ValueError: 格式错误的字符串
更改代码(使用关闭“”)保留错误:
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
,正如您所期望的那样。
【讨论】:
@snakecharmerb.. 感谢使用getattr
的清晰示例。我正在深入functools partial
,但这使用默认的内置代码更加pythonic。干杯。 ...而且它在偏离航线时工作:-)以上是关于python/Pyqt5 - 如何在使用 ast 和获取 ValueError 时避免 eval:attemt 中的格式错误的字符串以提高代码安全性的主要内容,如果未能解决你的问题,请参考以下文章
如何编写 Dockerfile 来运行 Python3 + PyQt5