TypeError : 문자열 형식을 지정하는 동안 모든 인수가 변환되는 것은 아닙니다


192

프로그램은 두 가지 이름을 취해야하며 길이가 같으면 같은 단어인지 확인해야합니다. 같은 단어이면 "이름이 같습니다"라고 인쇄됩니다 . 길이가 같지만 글자 가 다른 경우 "이름이 다르지만 길이는 같습니다"라고 인쇄됩니다 . 내가 문제가있는 부분은 맨 아래 4 줄에 있습니다.

#!/usr/bin/env python
# Enter your code for "What's In (The Length Of) A Name?" here.
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
    if name1 == name2:
        print ("The names are the same")
    else:
        print ("The names are different, but are the same length")
    if len(name1) > len(name2):
        print ("'{0}' is longer than '{1}'"% name1, name2)
    elif len(name1) < len(name2):
        print ("'{0}'is longer than '{1}'"% name2, name1)

이 코드를 실행하면 다음이 표시됩니다.

Traceback (most recent call last):
  File "program.py", line 13, in <module>
    print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting

모든 제안은 높이 평가됩니다.

답변:


210

다른 형식 기능을 혼합하고 있습니다.

구식 %형식은 다음 과 같은 형식의 %코드를 사용합니다 .

'It will cost $%d dollars.' % 95

새로운 스타일의 {}서식은 {}코드와 .format방법을 사용합니다.

'It will cost ${0} dollars.'.format(95)

구식 형식에서는 튜플을 사용하여 여러 인수를 지정해야합니다.

'%d days and %d nights' % (40, 40)

귀하의 경우 {}형식 지정자를 사용하고 있으므로 .format다음을 사용하십시오 .

"'{0}' is longer than '{1}'".format(name1, name2)

17
python 3.6에서 :f"'It will cost ${your_variable} dollars."
JinSnow

51

문자열 형식에 오류가 있습니다.

'%'연산자를 사용하여 기존 문자열 형식을 사용하는 올바른 방법은 printf 스타일 형식 문자열을 사용하는 것입니다 (Python 설명서 : http://docs.python.org/2/library/string.html#format- 문자열 구문 ) :

"'%s' is longer than '%s'" % (name1, name2)

그러나 '%'연산자 는 앞으로 더 이상 사용되지 않을 것입니다 . 새로운 PEP 3101 방식은 다음과 같습니다.

"'{0}' is longer than '{1}'".format(name1, name2)

9
scnr : "미래에 더 이상 사용되지 않을 것입니다"(Python 3.5). 이전 '%'구문은 3.1 에서 더 이상 사용되지 않으며 3.2 로깅 모듈{} 에서만 새로운 스타일로 형식을 지정하는 방법을 배웠습니다 . 그리고 갑자기 3.5는 PEP 461 : %bytes for format을 가져옵니다 . 이로 인해 %오랫동안 유골 이 남아 있다고 생각합니다 .
cfi

7
%더 간결합니다. 우리와 함께있어 기쁘다.
Lenar Hoyt 2016 년

3
동의합니다. %는 더 간결하며 제거하면 언어에 도움이되지 않습니다.
chevydog

@LenarHoyt f- 현은 어떻습니까? 나는 그것이 "'%s' is longer than '%s'" % (name1, name2)더 간결 하다고 상상할 수 없다f"'{name1}' is longer than '{name2}'"
Mark Moretto

44

나를 위해,이 오류는 문자열 형식 방법으로 튜플을 전달하려고 할 때 발생했습니다.

이 질문 / 답변에서 해결책을 찾았습니다.

링크에서 정답을 복사하여 붙여 넣기 (내 작품이 아님) :

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

관심있는 튜플을 유일한 항목, 즉 (튜플) 부분으로 사용하여 싱글 톤 튜플을 만드는 것이 여기서 핵심입니다.


차라리 다음 문장 중 하나를 사용하여 튜플을 문자열로 변환하려고합니다. print("this is a tuple: %s" % str(thetuple))또는print("this is a tuple: %s" % repr(thetuple))
AlexG

12

제 경우에는 단일 %s입력 값이 필요 없기 때문 입니다.


@ParisNakitaKejser, 그래서 단일 % s에 대한 입력 매개 변수를 얻는 방법은 무엇입니까?
Jatin Patel-JP

6

다른 두 가지 대답 외에도 마지막 두 가지 조건에서 들여 쓰기가 잘못되었다고 생각합니다. 조건은 하나의 이름이 다른 이름보다 길며 'elif'로 시작하고 들여 쓰기없이 시작해야합니다. 첫 번째 조건 내에 넣으면 (여백에서 4 개의 들여 쓰기를함으로써) 이름의 길이가 동시에 같고 다를 수 없기 때문에 모순이됩니다.

    else:
        print ("The names are different, but are the same length")
elif len(name1) > len(name2):
    print ("{0} is longer than {1}".format(name1, name2))

3

다른 답변 중 일부에서 지적한 것처럼 문제의 조합이 있습니다.

  1. nneonneo가 지적한 것처럼 다른 문자열 형식화 방법을 혼합하고 있습니다.
  2. GuyP가 지적했듯이 들여 쓰기도 꺼져 있습니다.

.format 예제와 튜플을 % s의 인수 지정자에 전달했습니다. 두 경우 모두 들여 쓰기가 길이가 일치 할 때 수표가 너무 크거나 작게 수정되었습니다. 또한 후속 if 문을 elif로 변경하여 이전의 동일한 수준 명령문이 False 인 경우에만 실행됩니다.

.format으로 문자열 형식화

name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
    if name1 == name2:
        print ("The names are the same")
    else:
        print ("The names are different, but are the same length")
elif len(name1) > len(name2):
    print ("{0} is longer than {1}".format(name1, name2))
elif len(name1) < len(name2):
    print ("{0} is longer than {1}".format(name2, name1))

% s 및 튜플을 사용한 문자열 형식화

name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
    if name1 == name2:
        print ("The names are the same")
    else:
        print ("The names are different, but are the same length")
elif len(name1) > len(name2):
    print ("%s is longer than %s" % (name1, name2))
elif len(name1) < len(name2):
    print ("%s is longer than %s" % (name2, name1))

2

파이썬 3.7 이상에서는 새롭고 쉬운 방법이 있습니다. 구문은 다음과 같습니다.

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

산출:

Hello, Eric. You are 74.

1

나를 위해 단일 인쇄 호출 내에 많은 값을 저장하면서 솔루션은 별도의 변수를 만들어 데이터를 튜플로 저장 한 다음 인쇄 기능을 호출하는 것이 었습니다.

x = (f"{id}", f"{name}", f"{age}")
print(x) 

0

오류가 발생했습니다.

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

그러나 목록 인수는 잘 작동합니다.

mysqlclient python lib를 사용합니다. lib는 튜플 인수를 허용하지 않는 것 같습니다. 목록 인수를 전달 ['arg1', 'arg2'] 하면 작동합니다.


0

장고 원시 SQL 쿼리보기

"SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)

models.py

class VehicleDamage(models.Model):
    requestdate = models.DateTimeField("requestdate")
    vendor_name = models.CharField("vendor_name", max_length=50)
    class Meta:
        managed=False

views.py

def location_damageReports(request):
    #static date for testing
    date_from = '2019-11-01'
    date_to = '2019-21-01'
    vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
    damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
    data={"data": damage_report.data}
    return HttpResponse(json.dumps(data), content_type="application/json")

참고 : Python 3.5 및 django 1.11 사용

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.