ㅍㅍㅋㄷ

Python class 명을 변수로 받아 동적 import 하기 본문

Programming/Python

Python class 명을 변수로 받아 동적 import 하기

클쏭 2016. 5. 12. 18:38

Class 명을 변수로 받아 동적으로 import (Python Dynamic import)


 python 의 모듈을 import 할때는 보통 파일 초기에 선언하여 사용하는게 일반적이다. 그런데, 모듈을 처음부터 import 하지 않고 로직에 따라 (모듈 명을 변수로 받아) 이것을 이용해 모듈을 import 하고 싶은 경우가 있다. 


 이런 경우 모듈과 class 명을 문자열로 받아 동적으로 import 하는 방법을 소개한다. 


 방법은 간단하다. importlib 패키지를 사용하거나 __import__() 함수를 이용하면 된다. 


 사실 importlib와 __import__() 함수는 큰 차이가 없다. importlib는 import 구문(statement)을 수행하는 package 일 뿐이며, __import__() 함수는 import 구문을 구성하는 expression 이기 때문이다. 즉, __import__() 함수는 importlib 보다 low level로 호출하는 것 뿐이다.




 

importlib


import 하고 싶은 module명을 module_name 이라는 변수로 받았다고 하자. 

이런 경우 importlib를 이용해 아래 처럼 간단히 이용할 수 있다. 


import importlib


def load_module_func(module_name):

mod = importlib.import_module(module_name)

return mod


mod 란 변수을 통해 module 안에 class를 호출이 가능하다.





__import__()


 importlib 보다 좀 더 low level 로 __import__ 를 이용해서도 구현이 가능하다. 물론 이걸 사용하면, importlib 패키지 자체를 import 하는 과정은 생략해도 된다. __import__() 는 built-in 함수이기 때문에 그냥 사용하면 된다. 


def load_module_func(module_name):

mod = __import__('%s' %(module_name), fromlist=[module_name])

return mod 



그럼 import 된 module 내부의 class 도 변수명으로 접근이 가능할까?

getattr() 이라는 함수를 이용하면 class 또한 변수명으로 접근이 가능하다. 






getattr()


 getattr() 은 지정한 object의 속성을 문자열 형태로 접근이 가능하도록 하는 함수이다. 이것을 이용하면 모듈의 class에 변수를 이용하여 접근이 가능하다. built-in 함수이기 때문에 특별히 참조할 필요는 없고 그냥 사용하면 된다. 


def load_module_func(module_name, class_name):

mod = __import__('%s' %(module_name), fromlist=[module_name])

cls = getattr(mod, class_name)(class_args)


cls.func1()

cls.func2(arg1, arg2)

...




참고

  • https://docs.python.org/3/library/importlib.html
  • https://docs.python.org/2/library/functions.html#getattr


Comments