HOWTO · Python

TypeError: must be str, not int

Python에서 int가 아닌 must be str 오류를 수정하는 방법 알아보기

이 페이지의 내용

TypeError: must be str, not int는 텍스트를 기대하는 연산에 정수가 전달되었다는 뜻입니다. 흔한 원인은 +를 사용한 문자열 연결입니다. 파이썬은 두 피연산자가 모두 문자열이면 연결하지만, 숫자를 자동으로 텍스트로 바꾸지는 않습니다. 예를 들어 "Count: " + 3은 이 오류를 일으킵니다. 실수, 불리언 또는 다른 비문자열 값에서도 같은 문제가 생길 수 있습니다.

이 오류는 정수가 적절한 값인지가 아니라 연산에 사용된 피연산자의 유형에 관한 것입니다. 값을 바꾸기 전에 텍스트가 필요한지 산술 계산이 필요한지 판단하세요. 비교, 덧셈 또는 다른 계산을 위해 값이 숫자로 남아 있어야 한다면 숫자 상태로 유지하고 표시할 때만 형식을 지정하세요.

파이썬에서 TypeError: must be str, not int가 발생하는 이유

+ 연산자는 피연산자 유형에 따라 숫자를 더하거나 문자열을 연결할 수 있습니다. 한쪽 피연산자가 문자열이고 다른 쪽이 정수이면, 파이썬은 숫자의 자릿수를 덧붙이려는 것인지 숫자 계산을 하려는 것인지 추측할 수 없습니다. 임의로 변환하는 대신 유형이 맞지 않는다고 알립니다.

다음 간단한 예제는 오류가 발생하는 연산을 예외 처리해 스크립트가 계속 실행되도록 한 뒤, 오류 메시지를 출력합니다:

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

try:
    result = "Count: " + 3
except TypeError as error:
    message = f"{type(error).__name__}: {error}"
    print(message)
TypeError: can only concatenate str (not "int") to str

원하는 텍스트를 만들려면 먼저 정수를 변환하세요. 수정한 식은 "Count: " + str(3)이며, 평가 결과는 Count: 3입니다.

문자열의 내장 join() 메서드에도 관련 규칙이 있습니다. 입력 iterable의 요소는 문자열이어야 하며, 이 메서드는 정수를 대신 변환해 주지 않습니다. 이미 텍스트인 조각들을 연결할 때 사용하고, 값의 문자열 표현이 필요한 경우에만 의도적으로 변환하세요.

문자열을 연결하기 전에 값 확인하기

텍스트와 다른 값을 결합하는 식을 찾은 다음, 그 식 바로 앞에서 각 피연산자를 확인하세요. type(value).__name__은 실행 중인 값의 유형을 알려 주며, 값을 출력하거나 살펴보면 실제 내용도 확인할 수 있습니다. 다음 예제를 실행해 보세요:

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

label = "Order"
number = 1923
print(f"{label} #{number}")

예제는 다음을 출력합니다:

Order #1923

유형이 다른 식을 진단하려면 결합 직전에 두 피연산자의 값과 유형을 모두 출력하세요. 다음 예제는 예외를 처리한 뒤 오류 메시지와 진단 값을 함께 출력합니다:

label = "Count: "
count = 3
print(f"left={label!r} ({type(label).__name__})")
print(f"right={count!r} ({type(count).__name__})")
try:
    message = label + count
except TypeError as error:
    error_message = f"{type(error).__name__}: {error}"
    print(error_message)
left='Count: ' (str)
right=3 (int)
TypeError: can only concatenate str (not "int") to str

left 행은 값이 'Count: '인 str을 나타내고, right 행은 값이 3인 int를 나타냅니다. 이 정수가 문자열과 직접 연결할 수 없는 피연산자입니다. 마지막 행에는 발생한 TypeError 메시지가 표시됩니다.

식이 실패하면 주변 프로그램의 모든 값을 바꾸지 말고 + 양쪽을 모두 확인하세요. 변수 이름만으로는 문자열이 아닌 값이 드러나지 않을 수 있고, 입력, 파일 또는 API에서 읽은 값의 유형이 예상과 다를 수도 있습니다. 오류에 표시된 int는 정수 피연산자가 있음을 알려 주지만, 어떤 변수가 그 값을 제공하는지는 식을 살펴봐야 알 수 있습니다.

텍스트가 필요할 때 str()로 값 변환하기

보고서의 레이블이나 메시지처럼 결과가 텍스트여야 할 때 str(value)를 호출하세요. 이 함수는 문자열 표현을 반환하며, 변환된 결과에는 원래 유형이 보존되지 않습니다. 표시할 때는 유용하지만, 이후 코드에서 값을 숫자로 더하거나 비교하거나 처리해야 한다면 적절한 해결책이 아닙니다.

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

count = 1923
message = "Count: " + str(count)
print(message)
Count: 1923

리스트와 다른 객체에 str()를 사용하면 사람이 읽기 위한 표현이 만들어집니다. 이는 저장이나 데이터 교환에 적합하다고 보장되는 직렬화 형식이 아닙니다. 사용자 정의 객체에 __str__() 메서드가 정의되어 있으면 그 표현을 사용하고, 그렇지 않으면 파이썬은 일반적인 표현 동작으로 대체합니다. 변환 결과가 매끄러운 문장이나 다른 프로그램이 안전하게 해석할 형식이라고 가정하지 마세요.

텍스트와 값을 결합할 때 f 문자열 사용하기

리터럴 텍스트와 값으로 하나의 메시지를 만들 때는 f 문자열이 가장 명확한 방법인 경우가 많습니다. 문자열 앞에 f를 붙이고 중괄호 안에 식을 넣으세요. 파이썬이 각 값을 문자열에 맞게 형식화하므로, 일반적인 표시 목적이라면 별도로 str()를 호출할 필요가 없습니다.

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

count = 1923
price = 12.5
message = f"Count: {count}; price: {price}"
print(message)
Count: 1923; price: 12.5

중괄호 안의 식은 형식화 과정에서 평가됩니다. 읽기 쉬운 정도로 식을 단순하게 유지하고, 복잡한 계산은 먼저 이름이 있는 변수에 저장하세요. str()를 사용할 때와 마찬가지로 형식화 결과는 텍스트입니다. 프로그램에서 숫자 연산이 더 필요하다면 원래 숫자 변수도 보존하세요.

데이터에 맞는 해결책 선택하기

원하는 결과가 메시지라면 str() 또는 f 문자열을 사용하세요. 레이블과 여러 값을 결합할 때는 f 문자열이 편리하고, 더 큰 연산의 일부로 문자열 변환이 필요할 때는 str()를 사용하세요. 값을 수학적으로 더해야 한다면 숫자의 자릿수를 텍스트에 이어 붙이지 말고, 숫자로 변환하거나 검증하세요.

join()를 사용할 때는 텍스트 목록이 필요한 경우에만 각 요소를 명시적으로 변환하세요. 생성기 식을 사용하면 중간 목록을 만들지 않고도 변환할 수 있습니다:

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

values = [1923, 12, 5]
text = ", ".join(str(value) for value in values)
print(text)

이렇게 하면 연결하기 전에 모든 요소가 표시용 문자열 표현으로 바뀝니다. 요소를 숫자로 유지해야 한다면 먼저 숫자 계산을 하고 마지막 결과의 형식을 지정하세요. 이렇게 구분하면 유형 불일치를 감추지 않고 데이터의 목적에 맞는 해결책을 선택할 수 있습니다.