Programing

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

crosscheck 2020. 5. 23. 10:17
반응형

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


이 프로그램은 두 가지 이름을 취해야하며 길이가 같은 경우 동일한 단어인지 확인해야합니다. 같은 단어이면 "이름이 같습니다"라고 인쇄됩니다 . 길이가 같지만 글자 가 다른 경우 "이름이 다르지만 길이는 같습니다"라고 인쇄됩니다 . 내가 문제가있는 부분은 맨 아래 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

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


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

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

'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)

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

'%'연산자를 사용하여 기존 문자열 형식을 사용하는 올바른 방법은 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)

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

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

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

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

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


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


다른 두 가지 대답 외에도 마지막 두 가지 조건에서 들여 쓰기가 잘못되었다고 생각합니다. 조건은 한 이름이 다른 이름보다 길며 '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))

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

  1. As pointed out by nneonneo you are mixing different String Formatting methods.
  2. As pointed out by GuyP your indentation is off as well.

I've provided both the example of .format as well as passing tuples to the argument specifier of %s. In both cases the indentation has been fixed so greater/less than checks are outside of when length matches. Also changed subsequent if statements to elif's so they only run if the prior same level statement was False.

String Formatting with .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))

String Formatting with %s and a tuple

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))

I encounter the error as well,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

But list args work well.

I use mysqlclient python lib. The lib looks like not to accept tuple args. To pass list args like ['arg1', 'arg2'] will work.


django raw sql query in view

"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")

Note: using python 3.5 and django 1.11

참고URL : https://stackoverflow.com/questions/18053500/typeerror-not-all-arguments-converted-during-string-formatting-python

반응형