ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python 내장함수 getattr
    Python 2022. 5. 19. 11:01

     

    프로젝트를 진행하던 중에 마주했던 어려움이 있어서 이렇게 글을 남깁니다. 상황은 아래와 같습니다.

     

    어떤 클래스의 메서드에 접근해서 값을 가져와야 하는 로직이었는데 문제는 값이 여러개인 리스트여서 리스트 안에 있는 변수들을 for loop을 통해서 하나씩 가져와서 접근해야 하는 상황이었습니다.

    코드를 보시는게 이해가 빠르실거 같네요.

     

    def run(self, job_id):
        # 접근하고자 하는 클래스를 인스턴스화 한 것이 task_executor
        task_executor = TaskExecutor()
        
        job = self.read_job_detail(job_id)
    
        task_list = ['read', 'drop', 'write']
    
        if task := job['task_list'][task_list[-1]]:
            task_list.append(*task)
        print(task_list)
        
        '''
        1차로 작성했던 방법
        for task in task_list:
            task_executor.task(job)
        '''
        
        for task in task_list:
            task_function = getattr(task_executor, task)
            task_function(job)

     

    1차로 작성했던 방법을 보시면 task 변수의 값이 매번 바뀔 것이기에 문자열 자체인 task 값이 아니라 변수의 값이 들어갈 것이라고 생각하고 썼는데 아래의 에러가 발생했습니다.

     

    객체에 변수로 접근할 수 있을줄 알았는데...

     

    아래의 리뷰나라 글에서 getattr의 사용법을 정확하게 한 문장으로 정리해준 것이 있어 가져와봤습니다.

    메소드 이름을 입력하는 대신 문자열을 기반으로 메소드를 호출 할 수 있습니다.

    사용법은 아래와 같습니다.

    getattr(object, string(문자열), default값)

     

    저의 경우에는 object 자리에 객체를 실체화한 인스턴스를 넣었고 문자열에는 변수명을 넣어서 값이 바뀔 때마다 그에 맞는 메서드에 접근할 수 있도록 해줬으며 default값(선택사항)을 설정해주면 만약 해당하는 값이 없을 경우 default 값이 리턴될 것입니다.

     

    만약 default 값을 설정하지 않았는데 문자열에 해당하는 메서드(attribute - 속성)가 없다면 에러가 발생합니다.

     

     

    사용법은 object.attribute 를 활용할 수 없는 경우에 쓰면 유용하니 참고하지면 좋을것 같아 공유드립니다~!

     

     

     

     

    <참고 자료>

    http://daplus.net/python-getattr-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C/

     

     

     

    댓글

Designed by Tistory.