HOWTO · Python

TypeError 해결: Python에서는 정수가 필요합니다.

이 튜토리얼에서는 TypeError: Python에서 정수가 필요합니다.

이 페이지의 내용

TypeError: an integer is required 메시지는 Python 코드가 함수에 잘못된 타입의 값을 전달할 때 나타납니다. 함수는 정수를 요구했지만 문자열 같은 다른 값을 받은 경우입니다. 이 오류는 문자열의 문자를 chr()에 전달하는 반복문, 숫자 대신 텍스트로 전달된 설정 등 비슷한 수많은 호출에서 발생할 수 있습니다.

이 가이드는 이 메시지가 실제로 의미하는 바, 문제를 일으킨 값을 찾는 방법, 그리고 코드가 의도한 동작에 맞는 해결 방법을 선택하는 방법을 설명합니다.

“TypeError: an integer is required” 메시지의 의미

이 문구의 TypeError는 하나의 잘못된 인수를 보고합니다. 함수나 메서드가 매개변수 중 하나가 정수여야 한다고 선언했지만(유니코드 코드 포인트, 개수, 최대 길이, 파일 모드 등) 실제로 전달된 값은 정수가 아닌 경우입니다. 이 검사는 호출을 파싱할 때 수행되므로 함수는 실제 작업을 시작하기 전에 실패합니다.

어떤 함수가 예외를 발생시키는지와 실행 중인 Python 버전에 따라 같은 실패가 몇 가지 다른 문구로 표시될 수 있습니다. an integer is required, an integer is required (got type str), 'str' object cannot be interpreted as an integer 같은 메시지를 볼 수 있습니다. 세 메시지 모두 TypeError이며 의미도 같습니다. 인수의 타입이 매개변수가 요구하는 타입과 일치하지 않았다는 뜻입니다.

이 오류를 unsupported operand type(s) 계열 메시지와 혼동해서는 안 됩니다. "10" + 5 같은 식은 TypeError: can only concatenate str (not "int") to str를 발생시키는데, 이는 결합할 수 없는 두 피연산자를 설명하는 것으로 해결 방법도 다른 진단입니다. 역시 TypeError이긴 하지만 같은 오류는 아닙니다.

이 오류가 발생하는 이유

내장 함수와 표준 라이브러리의 C로 구현된 부분은 인수를 엄격하게 파싱합니다. 파서가 정수가 필요한 위치에서 문자열을 발견하면 호출이 즉시 중단됩니다. 가장 간단한 발생 예는 반드시 정수여야 하는 collections.deque의 maxlen 매개변수입니다:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from collections import deque

try:
    queue = deque([], "3")
except TypeError as error:
    print(f"{type(error).__name__}: {error}")
TypeError: an integer is required

같은 실수가 더 흔히 발생하는 경우는 문자열을 순회하는 반복문 안에서 chr()를 호출할 때입니다. 문자열을 순회하면 한 글자짜리 문자열이 생성되지만 chr()는 정수 코드 포인트를 유니코드 문자로 변환하므로 반복문이 생성하는 각 값이 거부됩니다:

try:
    for char in "42":
        print(chr(char))
except TypeError as error:
    print(f"{type(error).__name__}: {error}")
TypeError: 'str' object cannot be interpreted as an integer

같은 종류의 버그지만 메시지 문구는 다릅니다. 두 경우 모두 해결은 같은 방식으로 시작합니다. 정수가 아닌 인수를 찾는 것입니다.

함수에 전달된 값을 진단하는 방법

트레이스백은 아래에서 위로 읽으세요. 마지막 줄은 예외 타입과 메시지를 알려주고, 바로 윗줄은 실패한 호출을 보여줍니다. 그다음에는 인수가 어디에서 왔는지(반복 변수, input(), 설정 파일, JSON 문자열 필드 등) 거슬러 올라가야 합니다. 텍스트로 읽은 값은 문자열로 전달되지만, JSON처럼 파싱된 형식은 이미 타입이 지정된 값을 생성할 수 있기 때문입니다.

메시지가 전달한 값을 직접 알려주지 않으면 repr()과 type()을 출력해 호출 위치에서 값을 확인하세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

for char in "42":
    print(f"{char!r} has type {type(char).__name__}; its code point is {ord(char)}")
'4' has type str; its code point is 52
'2' has type str; its code point is 50

이제 불일치가 명확해집니다. 반복문은 chr()에 문자열 '4'(타입 str)를 전달하지만, ord()는 실제로 필요한 정수인 코드 포인트 52를 보여줍니다. 인수의 실제 타입과 값을 알 수 있으면 적절한 해결 방법을 선택하기 쉽습니다.

입력값을 안전하게 수정하는 방법

의도한 결과에 맞는 해결 방법을 선택하세요.

  • 문자열의 숫자나 문자를 출력하려면 값을 직접 출력하세요. print(char)에는 chr() 호출이 전혀 필요하지 않습니다.
  • 특정 코드 포인트에 해당하는 문자를 얻으려면 chr()에 실제 정수를 전달하세요. ord()는 문자의 코드 포인트를 반환하고 int()는 숫자로 이루어진 문자열을 그 숫자로 변환합니다. 다음 예제를 실행해 보세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

for char in "42":
    print(char, "->", chr(ord(char)))
4 -> 4
2 -> 2

설정 파일이나 명령줄에서 오는 maxlen 같은 매개변수는 호출 전에 int()로 텍스트를 한 번 변환한 뒤 그 결과를 전달하세요.

int()는 정수처럼 보이는 문자열만 받아들입니다. 신뢰할 수 없는 입력은 str.isdigit()으로 먼저 검사해 잘못된 값이 변환 단계에 도달하지 않도록 하세요:

text = "53"

if text.isdigit():
    print(chr(int(text)))
else:
    print("not a whole number")
5

검사만으로 충분하지 않다면 변환 실패를 직접 처리하세요. 적합하지 않은 문자열에 int()를 사용하면 ValueError가 발생하며, 이는 처음 발생한 TypeError와는 다른 예외입니다:

try:
    number = int("10.5")
except ValueError as error:
    print(f"{type(error).__name__}: {error}")
ValueError: invalid literal for int() with base 10: '10.5'

수정 사항을 확인하고 관련 타입 오류를 방지하는 방법

코드를 다시 실행하고 남아 있는 트레이스백의 마지막 줄을 읽으세요. 타입 문제가 계속되는지 아니면 다른 버그로 넘어갔는지 알 수 있습니다. maxlen에 정수를 전달하면 앞의 실패가 정상적으로 동작하는 deque로 바뀝니다:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from collections import deque

queue = deque(["x", "y", "z"], maxlen=3)
queue.append("w")
print(list(queue))
['y', 'z', 'w']

다음 사항을 기억하세요.

  • 각 인수의 타입을 시그니처에 맞추세요. chr()는 정수 코드 포인트를 받고 ord()는 문자를 받으며 int()는 숫자 형태의 문자열을 정수로 바꿉니다.
  • int()에서 발생한 ValueError는 처음의 TypeError가 아닙니다. 한 예외를 잡아도 다른 예외가 숨겨지지 않으므로 각각 발생 지점에서 처리하세요.
  • can only concatenate 또는 unsupported operand type(s) 같은 메시지는 잘못된 인수가 아니라 표현식에서 타입을 섞어 사용했음을 설명하므로 다른 해결 방법이 필요합니다.

이 오류는 막다른 길이 아니라 방향을 알려주는 표지판입니다. 어떤 값이 잘못된 타입을 전달했는지 알면 필요한 변환이나 변환 없이 처리하는 올바른 방법이 보통 바로 보입니다.