파이썬에서 문자열로 모듈의 함수를 호출하는 방법
파이썬을 사용하다 보면 함수 이름이 문자열 형태로 주어지고, 이 이름을 이용해 실제 함수를 호출해야 하는 경우가 있습니다. 예를 들어 설정 파일이나 사용자 입력으로 받은 함수 이름을 실행해야 할 때가 대표적입니다. 이럴 때 가장 표준적이고 안전한 방법은 내장 함수 getattr()을 사용하는 것입니다.
getattr() 기본 사용법
getattr(객체, '이름') 형태로 호출하면 객체에 존재하는 속성이나 메서드를 문자열 이름으로 가져올 수 있습니다. 모듈 역시 하나의 객체이므로, 모듈에 정의된 함수도 같은 방식으로 접근할 수 있습니다.
import fibo # 문자열 'baz'에 해당하는 함수를 가져옴 func = getattr(fibo, 'baz') # 함수 호출 result = func() print(result)
위 코드는 fibo 모듈 안에 정의된 baz 함수를 문자열 이름으로 찾아 호출합니다. 만약 해당 이름의 속성이 존재하지 않으면 AttributeError가 발생하므로, 세 번째 인자로 기본값을 지정하면 더 안전하게 처리할 수 있습니다.
# 함수가 없을 경우 None 반환
func = getattr(fibo, 'baz', None)
if func is not None:
func()
else:
print("함수를 찾을 수 없습니다.")
getattr()의 다양한 활용
getattr()은 모듈 수준의 함수뿐만 아니라 다음과 같은 상황에서도 유용하게 사용됩니다.
- 인스턴스에 바인딩된 메서드:
getattr(obj, 'method_name')() - 클래스 메서드와 정적 메서드:
getattr(MyClass, 'classmethod_name') - 모듈의 변수나 상수 접근:
getattr(module, 'CONSTANT_NAME')
현재 모듈 내부의 함수를 호출하는 방법
같은 파일(모듈) 안에 정의된 함수를 문자열로 호출하려면 globals() 딕셔너리를 활용할 수 있습니다.
def hello():
print("Hello, World!")
# 문자열로 함수 이름 참조
func_name = "hello"
globals()[func_name]() # Hello, World! 출력
사용 시 주의 사항
문자열로 함수를 동적으로 호출하는 것은 매우 편리하지만, 외부 입력값을 그대로 함수 이름으로 사용하면 의도하지 않은 코드가 실행될 보안 위험이 있습니다. 반드시 허용된 함수 이름 목록(화이트리스트)을 검증한 후 호출하는 것이 안전합니다.
정리하면, 파이썬에서 문자열로 된 함수 이름으로 모듈의 함수를 호출하려면 getattr(모듈, '함수이름')을 사용하면 됩니다. 필요하다면 반환된 함수 객체에 인자를 전달해 호출할 수 있으며, 이는 파이썬의 동적인 특성을 잘 보여주는 강력한 기능입니다.