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

파이썬 TypeError: 'module' 객체는 호출할 수 없습니다 오류 완벽 해결 가이드

파이썬 모듈은 초보 개발자에게 혼란스러울 수 있으며, 특히 직접 모듈을 정의할 때 더욱 그렇습니다. "TypeError: 'module' object is not callable" 오류는 파이썬 개발자들이 클래스와 모듈을 다룰 때 가장 흔히 겪는 실수 중 하나입니다.

이 가이드에서는 이 오류가 무엇을 의미하는지, 왜 발생하는지 설명하고, 실제 예제 코드를 통해 해결 방법까지 단계별로 살펴보겠습니다.

문제 상황: TypeError: 'module' object is not callable

파이썬에서 확장자가 ".py"로 끝나는 모든 파일은 모듈(module)입니다.

모듈은 함수, 변수, 클래스를 메인 프로그램 외부에 정의할 수 있게 해주는 파이썬의 핵심 구성 요소입니다. 덕분에 코드를 여러 파일로 분리하고 체계적으로 관리할 수 있습니다.

하지만 모듈은 반드시 올바른 방식으로 임포트(import)해야 합니다. 잘못된 방식으로 사용하면 파이썬은 다음과 같은 오류를 반환합니다:

TypeError: 'module' object is not callable

이 오류는 모듈을 함수처럼 호출하려고 할 때 발생합니다.

예제 시나리오

"cakes"라는 이름의 모듈을 정의해 보겠습니다. 이 모듈에는 텍스트 파일의 내용을 읽어오는 read_file 함수 하나가 포함되어 있습니다.

모듈의 이름은 파일명에 의해 결정됩니다. 모듈 이름을 "cakes"로 만들기 위해 cakes.py 파일에 다음과 같이 코드를 작성합니다:

def read_file():
	all_cakes = []
	with open("cakes.txt", "r") as cake_file:
		cake_list = cake_file.readlines()
		for c in cake_list:
			all_cakes.append(c.replace("\n", ""))

	return all_cakes

이 함수는 "cakes.txt" 파일의 내용을 읽어옵니다. 그런 다음 파일의 각 줄을 순회하면서 "all_cakes"라는 리스트에 한 줄씩 추가합니다.

replace() 메서드는 개행 문자("\n")를 빈 값으로 대체하여 모든 줄바꿈을 제거하는 역할을 합니다. 마지막으로 함수는 "all_cakes" 리스트를 반환합니다.

이제 app.py 파일을 열고 아래 코드를 입력합니다:

import cakes

cake_list = cakes()
print(cake_list)

이 코드는 "cakes" 모듈을 사용해 "cakes.txt" 파일의 내용을 읽고, 찾은 모든 케이크 목록을 출력하려고 합니다.

코드를 실행해 보겠습니다:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
	cakes = cakes()
TypeError: 'module' object is not callable

오류가 발생했습니다. 원인이 무엇일까요?

해결 방법

먼저 app.py 파일의 임포트 문을 살펴보겠습니다:

import cakes

여기서 우리는 "cakes" 모듈 전체를 임포트했습니다. 이 모듈에는 cakes.py 파일에서 선언한 모든 변수, 클래스, 함수가 포함되어 있습니다.

그다음 코드 줄을 보겠습니다:

cake_list = cakes()

문제는 바로 이 부분입니다. "cakes" 모듈에는 함수가 하나만 있지만, 우리는 어떤 함수를 호출할 것인지 지정하지 않았습니다. 파이썬 입장에서는 모듈 자체가 호출되었기 때문에 어떤 함수를 실행해야 하는지 알 수 없어 오류를 발생시키는 것입니다.

이 오류를 해결하려면 모듈 자체가 아니라, 참조하려는 함수의 이름을 명확하게 호출해야 합니다:

import cakes

cake_list = cakes.read_file()
print(cake_list)

코드를 다시 실행해 보겠습니다:

['Cinnamon Babka', 'Chocolate Cupcake']

이번에는 코드가 성공적으로 케이크 목록을 반환합니다.

app.py 파일에서 우리는 cakes.read_file()을 호출했습니다. 파이썬은 "cakes" 모듈이 저장된 cakes.py 파일을 확인하고 read_file() 함수를 찾아 실행합니다.

함수의 실행 결과는 "cake_list" 변수에 할당되고, 해당 리스트가 콘솔에 출력됩니다.

대안: 함수를 직접 임포트하기

또 다른 방법은 read_file 함수를 프로그램에 직접 임포트하는 것입니다:

from cakes import read_file

cake_list = read_file()
print(cake_list)

실행 결과는 동일합니다:

['Cinnamon Babka', 'Chocolate Cupcake']

이 코드 역시 "cakes" 모듈의 read_file() 함수를 실행합니다. 차이점은 이번에는 모듈 전체가 아닌 read_file 함수 하나만 임포트했다는 점입니다.

주목할 점은 함수를 직접 임포트한 후에는 더 이상 cakes.read_file() 형태로 호출할 필요가 없다는 것입니다. read_file() 함수를 코드에 바로 가져왔기 때문에 read_file()만으로 간단히 호출할 수 있습니다.

마무리

파이썬 모듈의 코드는 별도의 파일에 존재합니다. 모듈에서 함수와 값을 가져오는 방법이 여러 가지 있기 때문에 실수하기 쉽습니다.

모듈을 다룰 때는 접근하려는 함수, 클래스, 변수를 올바르게 참조해야 합니다. 특정 함수를 사용하려면 모듈 자체를 호출하는 것이 아니라, 모듈 내에서 호출하려는 정확한 함수를 지정해야 한다는 점을 기억하세요.

이제 여러분도 프로 개발자처럼 이 파이썬 TypeError를 손쉽게 해결할 수 있습니다!