파이썬에서 eval을 이용하는 것이 나쁜 습관인가요?

조회수 3929회

노래의 정보를 쉽게 저장하기 위해 아래와 같은 클래스를 만들어 사용하고 있습니다.

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)