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)

โปรดทราบว่าด้วยการจัดรูปแบบแบบเก่าคุณต้องระบุอาร์กิวเมนต์หลายตัวโดยใช้ tuple:

'%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:%การจัดรูปแบบไบต์ นี่ทำให้ฉันคิดว่า%ซากศพจะมาอีกนาน
cfi

7
%กระชับยิ่งขึ้น ดีใจที่ได้อยู่กับเรา
Lenar Hoyt

3
ฉันเห็นด้วย มีความกระชับมากขึ้นและการลบจะไม่เพิ่มประโยชน์ให้กับภาษา
chevydog

@LenarHoyt คุณรู้สึกยังไงกับ f-strings? ฉันไม่สามารถจินตนาการได้เลยว่า"'%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)

การสร้าง tuple ซิงเกิลที่มี tuple ที่น่าสนใจเป็นรายการเดียวเช่นส่วน (thetuple,) เป็นบิตสำคัญที่นี่


ฉันอยากจะแปลง tuple เป็นสตริงโดยใช้หนึ่งในข้อความต่อไปนี้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' และไม่มีการเยื้อง หากคุณวางไว้ในเงื่อนไขแรก (โดยให้การเยื้องสี่จากระยะขอบ) มันจะขัดแย้งกันเพราะความยาวของชื่อไม่สามารถเท่ากันและแตกต่างในเวลาเดียวกัน

    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 และส่งผ่าน tuples ไปยังตัวระบุอาร์กิวเมนต์ของ% s ในทั้งสองกรณีเยื้องได้รับการแก้ไขเพื่อให้มาก / น้อยกว่าการตรวจสอบอยู่นอกเมื่อตรงกับความยาว นอกจากนี้ยังมีการเปลี่ยนแปลงในภายหลังหากคำสั่งเป็น elif ดังนั้นพวกเขาจะเรียกใช้หากคำสั่งระดับเดียวกันก่อนหน้านี้เป็นเท็จ

การจัดรูปแบบสตริงด้วย. 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 และ 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))

2

ใน python 3.7 ขึ้นไปมีวิธีใหม่และง่าย นี่คือไวยากรณ์:

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

เอาท์พุท:

Hello, Eric. You are 74.

1

สำหรับฉันเมื่อฉันเก็บค่าหลายค่าไว้ในการเรียกใช้การพิมพ์ครั้งเดียวโซลูชันคือการสร้างตัวแปรแยกต่างหากเพื่อเก็บข้อมูลเป็น tuple จากนั้นเรียกใช้ฟังก์ชันการพิมพ์

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

0

ฉันพบข้อผิดพลาดเช่นกัน

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

แต่รายการ args ทำงานได้ดี

ฉันใช้ mysqlclient python lib lib ดูเหมือนจะไม่ยอมรับ tuple args ที่จะผ่านรายการ args ชอบ['arg1', 'arg2'] จะทำงาน


0

แบบสอบถาม django raw 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.