2017-11-25 31 views
0

을 사용하는 how-to-avoid-eval-in-python-for-string-conversion 예제를 기반으로 eval을 사용하지 못하게하려고합니다. 도전은 이러한 self.ch%s_label이 12 개 있지만 GUI의 사용자 입력에 따라 변수가 변경된다는 것입니다.python/Pyqt5 - ast와 getError를 사용하는 동안 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을 사용할 수 있습니다 :이 방법으로 getattr를 사용

channel_no = 5 
attr_name = 'ch%s_label' % channel_no 
attr = getattr(self, attr_name) 
ch_width = attr.frameGeometry().width() 

는 당신이 얻을 의미 : 단계에서

ch_width = getattr(self, 'ch%s_label' % channel_no).frameGeometry().width() 또는 단계 AttributeError 개체에 특성이없는 경우 예상대로 사용하십시오.

+0

@ snakecharmerb .. 'getattr'을 사용하는 분명한 예를 들어 주셔서 감사합니다. 나는'functools partial'을 심화시키고 있었지만, 이것은 기본 내장 코드를 사용하는 훨씬 더 파이썬 적이기도합니다. 건배. ... 그리고 그것은 오프 코스에서 작동합니다 :-) – ZF007