Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 문자열로 모듈의 함수를 호출하는 방법 – getattr() 완벽 가이드

파이썬에서 문자열로 모듈의 함수를 호출하는 방법

파이썬을 사용하다 보면 함수 이름이 문자열 형태로 주어지고, 이 이름을 이용해 실제 함수를 호출해야 하는 경우가 있습니다. 예를 들어 설정 파일이나 사용자 입력으로 받은 함수 이름을 실행해야 할 때가 대표적입니다. 이럴 때 가장 표준적이고 안전한 방법은 내장 함수 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(모듈, '함수이름')을 사용하면 됩니다. 필요하다면 반환된 함수 객체에 인자를 전달해 호출할 수 있으며, 이는 파이썬의 동적인 특성을 잘 보여주는 강력한 기능입니다.