본문 바로가기
파이썬

파이썬 'eval'을 사용하는 것이 왜 나쁜 습관입니까?

by º기록 2021. 1. 8.
반응형

내 노래의 데이터를 쉽게 저장하기 위해 다음 클래스를 사용하고 있습니다.

class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            exec 'self.%s=None'%(att.lower()) in locals()
    def setDetail(self, key, val):
        if key in self.attsToStore:
            exec 'self.%s=val'%(key.lower()) in locals()

이것이 if / else 블록을 작성하는 것보다 훨씬 더 확장 가능하다고 생각합니다. 그러나 eval 은 나쁜 습관으로 간주되어 사용하기에 안전하지 않은 것 같습니다. 그렇다면 누구든지 이유를 설명하고 위의 클래스를 더 잘 정의하는 방법을 보여줄 수 있습니까?

 

해결 방법

 

예, eval을 사용하는 것은 나쁜 습관입니다. 몇 가지 이유를 들자면 :


class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            setattr(self, att.lower(), None)
    def setDetail(self, key, val):
        if key in self.attsToStore:
            setattr(self, key.lower(), val)

수정 :

eval 또는 exec를 사용해야하는 경우가 있습니다. 그러나 그들은 드뭅니다. 귀하의 경우에 eval을 사용하는 것은 확실히 나쁜 습관입니다. eval과 exec가 잘못된 장소에서 자주 사용되기 때문에 나쁜 습관을 강조하고 있습니다.

수정 2 :

OP 케이스에서 eval이 '매우 위험하고 안전하지 않다'는 의견에 동의하지 않는 것 같습니다. 이 특정 경우에는 사실 일 수 있지만 일반적으로는 그렇지 않습니다. 질문은 일반적이었고 내가 나열한 이유는 일반적인 경우에도 사실입니다.

수정 3 : 재주문 된 포인트 1 및 4

 

참조 페이지 https://stackoverflow.com/questions/1832940

 

 

반응형

댓글