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

Python TypeError: 문자열 포맷팅 중 모든 인수가 변환되지 않는 오류 해결 방법

Python은 규칙에 매우 엄격한 언어입니다. Python의 핵심 기능 중 하나는 프로그램이 개발자가 의도한 대로 정확히 동작하도록 코드를 꼼꼼하게 검사해 준다는 점입니다. 문자열을 다루다 보면 "not all arguments converted during string formatting"(문자열 포맷팅 중 일부 인수가 변환되지 않았습니다)이라는 오류 메시지를 만나게 될 수 있습니다.

이 가이드에서는 이 오류가 왜 발생하는지 살펴보고, 실제로 오류가 자주 발생하는 두 가지 대표적인 상황을 통해 해결 방법까지 함께 알아보겠습니다.

문제: typeerror: not all arguments converted during string formatting

TypeError는 특정 타입의 값에 대해 실행할 수 없는 작업을 수행하려고 할 때 발생하는 오류입니다. 이 경우의 TypeError는 문자열 값과 관련이 있습니다.

Python은 문자열을 포맷팅할 수 있는 다양한 방법을 제공합니다. 이를 통해 문자열 안에 값을 삽입하거나 문자열 끝에 값을 연결할 수 있습니다.

가장 널리 사용되는 문자열 포맷팅 방식은 다음 두 가지입니다.

  • % 연산자 사용 (구식 방식)
  • {} 연산자와 .format() 함수 사용

그런데 이 두 가지 문법을 섞어서 사용하면 오류가 발생합니다.

예제 1: 문자열 포맷팅 문법 혼용하기

베이커리에서 판매하는 제품의 가격을 5% 인상하여 계산하는 프로그램을 작성해 보겠습니다.

먼저 사용자로부터 제품 이름과 제품 가격, 두 가지 정보를 입력받습니다. input() 문을 사용합니다.

name = input("Enter the name of the product: ")
price = input("Enter the price of the product: ")

다음으로, price 값에 1.05를 곱해 새로운 가격을 계산합니다. 이는 5% 가격 인상을 의미합니다.

increase = round(float(price) * 1.05, 2)

round() 문을 사용해 increase 값을 소수점 둘째 자리까지 반올림합니다. 마지막으로 문자열 포맷팅을 활용해 새로운 가격을 콘솔에 출력합니다.

print("The new price of {} is ${}. " % name, str(increase))

이 코드는 name과 increase 값을 문자열에 삽입하려고 합니다. 문자열과 병합하기 위해 increase를 문자열로 변환했습니다. 변환 전 increase는 부동소수점 숫자입니다. 코드를 실행해 결과를 확인해 보겠습니다.

Traceback (most recent call last):
  File "main.py", line 6, in <module>
	print("The new price of {} is {}" % name, str(discount))
TypeError: not all arguments converted during string formatting

코드의 마지막 줄에서 오류가 발생했습니다.

문제의 원인은 문자열 포맷팅 문법을 혼용했기 때문입니다. {}와 % 연산자를 동시에 사용했는데, 이 둘은 서로 다른 종류의 문자열 포맷팅에 사용되는 문법입니다.

이 문제를 해결하려면 코드의 마지막 줄을 아래 두 줄 중 하나로 교체하면 됩니다.

print("The new price of {} is ${}.".format(name, str(increase)))

print("The new price of %s is $%s." % (name, str(increase)))

첫 번째 코드는 .format() 문법을 사용합니다. {} 자리가 .format() 문에 지정된 순서대로 값으로 대체됩니다.

두 번째 코드는 구식 % 문자열 포맷팅 기법을 사용합니다. %s 자리가 % 연산자 뒤 괄호 안에 묶인 값들로 대체됩니다.

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

Enter the name of the product: Babka
Enter the price of the product: 2.50
The new price of Babka is $2.62.

코드가 성공적으로 인수들을 문자열에 삽입했습니다.

예제 2: 나머지(모듈로) 연산자 혼동하기

Python에서 퍼센트 기호(%)는 나머지(modulo) 계산과 문자열 포맷팅, 두 가지 용도로 사용됩니다. 나머지란 나눗셈을 수행한 후 남는 값을 의미합니다.

퍼센트 기호를 문자열에 사용하면 포맷팅으로 처리되고, 숫자에 사용하면 나머지 계산으로 처리됩니다. 따라서 나머지 계산을 하려는 값이 문자열로 저장되어 있으면 오류가 발생합니다.

숫자가 홀수인지 짝수인지 판별하는 프로그램을 살펴보겠습니다.

number = input("Please enter a number: ")
mod_calc = number % 2

if mod_calc == 0:
	print("This number is even.")
else:
	print("This number is odd.")

먼저 사용자에게 숫자를 입력받습니다. 그다음 나머지 연산자를 사용해 number를 2로 나눈 나머지를 계산합니다.

나머지 연산 결과가 0이면 if문의 내용이 실행되고, 그렇지 않으면 else문의 내용이 실행됩니다.

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

Please enter a number: 7
Traceback (most recent call last):
  File "main.py", line 2, in <module>
	mod_calc = number % 2
TypeError: not all arguments converted during string formatting

또 다른 TypeError가 발생했습니다. 이 오류는 number가 문자열이기 때문에 발생합니다. input() 메서드는 항상 문자열을 반환합니다. 따라서 나머지 계산을 수행하려면 number를 부동소수점 숫자나 정수로 변환해야 합니다.

float() 함수를 사용해 number를 부동소수점 숫자로 변환할 수 있습니다.

mod_calc = float(number) % 2

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

Please enter a number: 7
This number is odd.

코드가 정상적으로 동작합니다!

마무리

"not all arguments converted during string formatting" 오류는 Python이 문자열 포맷팅 작업에 모든 인수를 삽입하지 못할 때 발생합니다. 문자열 포맷팅 문법을 서로 섞어서 사용하거나, 문자열에 대해 나머지 연산을 수행하려고 할 때 이 오류가 나타납니다.

참고로 최신 Python 프로젝트에서는 f-string(f"...")을 사용하는 것이 가독성과 성능 면에서 권장되므로, 가능하다면 f-string 포맷팅으로 통일해 사용하는 것도 좋은 습관입니다.

이제 여러분도 전문 소프트웨어 엔지니어처럼 이 흔한 Python 오류를 손쉽게 해결할 준비가 되었습니다!