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

如何在python pyqt5中从主窗口管理第二个窗口

如何在 Python 3 (Ubuntu 14.04) 中安装 PyQt5

Python PyQt5如何更改最小化图标

Python - PyQt5 如何将文件作为输入?

如何正确地将 ComboBox 的模型从 python (pyQt5) 传递给 QML?