HOWTO · Python

TypeError 해결: Python에서 문자열 형식 지정 중에 일부 인수가 변환되지 않음

이 글에서는 Python의 `%` 연산자가 숫자의 나머지 계산과 구식 문자열 형식 지정에 각각 어떻게 쓰이는지 설명합니다. 형식 문자열의 자리표시자보다 전달한 값이 많거나, 자리표시자가 없는 문자열에 값을 전달하면 `TypeError: not all arguments converted during string formatting`가 발생할 수 있습니다. 입력값의 자료형과 자리표시자 및 값의 개수를 확인하고, 각 형식 지정 방식에 맞게 식을 수정하는 방법을 알아봅니다.

이 페이지의 내용

오류 TypeError: not all arguments converted during string formatting는 대개 Python이 %를 구식 문자열 형식 지정으로 처리했지만, 문자열의 형식 지정자가 일부 값을 사용하지 않았다는 뜻입니다. 같은 연산자는 숫자의 나머지를 구하는 데도 쓰이므로 피연산자의 자료형과 위치가 중요합니다. %의 왼쪽에 문자열이 있으면 문자열 형식 지정이 적용됩니다. 먼저 어떤 연산이 수행되는지 확인한 다음, 각 자리표시자에 호환되는 값이 있는지 살펴보세요. 아래 예제에서는 두 경우를 구분하고 한 가지 형식 지정 방식을 일관되게 선택하는 방법을 보여줍니다.

이 TypeError의 의미

숫자끼리 %를 사용하면 나머지가 반환됩니다. 왼쪽 피연산자가 문자열이면 %는 구식 문자열 형식 지정을 적용합니다. %s, %d 같은 자리표시자는 해당 문자열에 삽입할 값을 나타냅니다. 따라서 식의 의미는 오른쪽 피연산자가 숫자처럼 보이는지가 아니라 왼쪽 피연산자에 따라 달라집니다.

"19" 같은 값은 여전히 문자열입니다. "19" % 10에서는 Python이 왼쪽 값을 형식 문자열로 해석합니다. 10을 사용할 자리표시자가 없으므로 TypeError: not all arguments converted during string formatting 오류가 발생합니다. 나머지를 계산하려면 먼저 문자열을 정수로 변환하세요. 메시지에 문자열 값을 넣으려는 것이라면 형식 지정 자리표시자를 사용하면 됩니다.

% 연산자가 어떻게 쓰이는지 확인하기

input()에서 받은 텍스트나 따옴표로 감싼 문자열에 %를 적용하면 이 오류가 발생할 수 있습니다. 입력값을 숫자로 계산하려면 나머지 연산 전에 int()로 변환하세요. 반대로 문자열 형식 지정이 목적이라면 문자열을 왼쪽에 두고 값에 맞는 자리표시자를 추가하세요.

다음 예제를 실행해 보세요.

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

message = "%s scored %d points." % ("Mina", 18)
print(message)

이 예제는 이름과 정수를 형식화해 Mina scored 18 points.라는 문자열을 만듭니다.

숫자의 나머지를 구하려면 계산 전에 입력값을 변환해야 합니다. 다음 예제는 변환하지 않은 문자열에서 발생하는 오류 메시지를 잡은 뒤 숫자 결과를 보여줍니다.

age_text = "19"
try:
    age_text % 10
except TypeError as error:
    print(type(error).__name__ + ": " + str(error))

age = int(age_text)
print(age % 10)

int() 호출은 숫자로 된 문자를 정수로 변환합니다. 문자열 형식 지정자가 아니라 변환 함수입니다. 숫자가 아닌 내용이 들어 있는 문자열은 이렇게 변환할 수 없으므로, 신뢰할 수 없는 입력이라면 먼저 검증하거나 변환 오류를 처리하세요.

형식 지정자와 값 맞추기

구식 문자열 형식 지정에서는 각 자리표시자에 호환되는 값이 필요합니다. 오른쪽에 튜플을 전달하면 값이 순서대로 자리표시자에 대응합니다. 자리표시자보다 값이 많으면 사용되지 않은 값 때문에 대상 TypeError가 발생할 수 있습니다. 값이 부족하면 Python은 다른 형식 지정 오류를 보고합니다. 값의 개수가 맞지 않는 모든 경우에 같은 메시지가 나오는 것은 아닙니다.

예를 들어 %s 자리표시자 두 개에는 값 두 개가 필요합니다. 남는 값이 필요 없다면 제거하고, 결과에 포함해야 한다면 자리표시자를 추가하세요. 문자열에는 %s, 정수에는 %d를 사용합니다. 개수가 어긋난 모든 경우가 같은 원인이라고 가정하지 말고 값에 맞는 지정자를 선택하세요.

한 번에 한 가지 문자열 형식 지정 방식 사용하기

% 형식 지정은 %s나 %d 같은 자리표시자를 처리합니다. .format() 메서드는 {} 같은 중괄호 자리표시자를 처리합니다. 중괄호만 있는 문자열은 % 형식 지정에서 일반 문자이므로, {0}이 포함된 문자열은 %에 전달된 값을 사용하지 않습니다.

식 하나에는 한 가지 방식을 선택하세요. .format()을 쓸 때는 템플릿에 메서드를 호출하고 값을 전달합니다. %를 쓸 때는 템플릿에 일치하는 퍼센트 자리표시자를 넣고 오른쪽에 값을 제공합니다. Python 버전이 지원한다면 f-string도 사용할 수 있습니다. 중괄호 템플릿에 %를 적용하면서 두 종류의 자리표시자가 모두 처리되리라고 기대하지 마세요.

수정한 식 확인하기

식을 왼쪽에서 오른쪽으로 읽으며 왼쪽 피연산자의 자료형을 확인하고, %가 나머지 연산인지 문자열 형식 지정인지 판단한 다음, 자리표시자 수와 전달한 값의 수를 비교하세요. 그런 다음 수정한 식만 간단히 실행해 결과를 확인합니다. 대상 오류 메시지가 계속 나오면 값이 남는지, 숫자가 필요한 곳에 문자열을 사용했는지 살펴보세요. 메시지가 달라졌다면 새 오류를 별도로 진단하세요.

자세한 내용은 구식 문자열 형식 지정을 다루는 Python 입력과 출력 문서를 참조하세요.