본문 바로가기

컴린이 일기장/Today I Learned

[TIL] Python getattr()과 import_module

반응형

[주절주절]

나는 아직 익숙하지 않은 코딩 스타일인데 종종 이런 것들을 이용해서 코딩하시는 분들이 있다. 1년에 1~2번 만날까말까이다보니 매번 헤매어서 정리해둔다!

 

[Today I Learned]

# getattr

>>> getattr(object, name[,default])

__builtin__ 모듈에 포함된 함수로, object에 존재하는 속성의 값을 가져온다. 세번째  인자로 default 값을 넘겨줄 경우 존재하지 않는 속성을 가져오려는 경우도 커버할 수 있다. 

class Number:
	def __init__(self):
    	self.x = 10
        self.y = 20
        
n = Number()

print(getattr(n, 'x')) # 10
print(getattr(n, 'z')) # Attribute error : 'Number' Object has no attribute 'z'
print(getattr(n, 'z', 'NO!')) # NO!

구현해놓은 여러 클래스 중, 넘겨받은 인자 이름에 해당하는 클래스(ex. 모델)를 반환하고 싶을 때 if문을 사용하게 되는데, getattr을 이용하면 긴 if문을 한 줄로 줄일 수 있다. 

 

# 모듈 & 패키지

모듈 : 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일(원칙적으로 .py 확장자)

+ if __name__ == "__main__"

: 위와 같은 문법으로 묶어두지 않은 코드는 import할때 모두 실행되게 된다. 따라서 단순히 import할 때는 실행되지 않았으면 하는 코드들은 위의 문법으로 묶어두어야 한다.

패키지 : 특정한 주제를 가진 모듈을 모아 구성한 것. 

 

# import_module

Python 모듈을 import 할 때는 파일 초기에 선언해 사용하는 것이 일반적이지만, 사용자의 input에 따라 다르게 선언하고 싶을 때 (ex. args에 따라)는 동적으로 모듈을 import하기도 한다.

importlib이라는 패키지에서 불러와 다음과 같이 이용할 수 있다.

import importlib

dataset_module = getattr(import_module("dataset"), args.dataset)

getattr 함수까지 한 번에 해석하자면, dataset.py 모듈을 import하고, 해당 모듈의 args.dataset class를 불러오라는 뜻이 된다.

 

[질문 노트]

Q. 개인적으로는 가독성은 조금 떨어진다는 생각도. 좋은 코드란 무엇일까? 

반응형