2017-11-25 255 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

相關問題