파이썬에서 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:
            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을 사용하는 방식이 좋지 않으며 안전성이 떨어지는 방식으로 알려져있는 것 같더라고요. 그 이유와 함께 위의 클래스를 더 좋은 방식으로 정의할 방법을 알려주세요.

  • 2016년 06월 19일에 작성됨

조회수 104


1 답변


좋아요
0
싫어요
채택취소하기

우선, 말씀하신대로 eval은 좋지 않은 프로그래밍 습관입니다. 몇가지 이유를 말씀드리자면 :

  1. 대부분의 경우 더 좋은 방식의 대안이 있으며,
  2. 매우 위험하고 안전하지 못하고,
  3. 디버깅을 어렵게 만들며
  4. 느리기 때문입니다.

위 클래스의 경우, setattr을 대신 사용할 수 있습니다 :

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가 흔히 잘못된 방식으로 사용되기 때문입니다.

  • 2016년 06월 20일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close