TypeError: tidak semua argumen dikonversi selama pemformatan string python

192

Program ini seharusnya menggunakan dua nama, dan jika panjangnya sama, harus memeriksa apakah kata-katanya sama. Jika itu kata yang sama itu akan mencetak "Nama-nama itu sama" . Jika mereka memiliki panjang yang sama tetapi dengan huruf yang berbeda itu akan mencetak "Nama-nama berbeda tetapi panjangnya sama" . Bagian saya mengalami masalah adalah di 4 baris bawah.

#!/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)

Ketika saya menjalankan kode ini akan ditampilkan:

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

Setiap saran sangat dihargai.

pengguna2652300
sumber

Jawaban:

210

Anda sedang mencampur berbagai fungsi format.

%Pemformatan gaya lama menggunakan %kode untuk memformat:

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

{}Pemformatan gaya baru menggunakan {}kode dan .formatmetode

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

Perhatikan bahwa dengan pemformatan gaya lama, Anda harus menentukan beberapa argumen menggunakan tuple:

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

Dalam kasus Anda, karena Anda menggunakan {}penentu format, gunakan .format:

"'{0}' is longer than '{1}'".format(name1, name2)
nneonneo
sumber
17
dalam python 3.6:f"'It will cost ${your_variable} dollars."
JinSnow
51

Kesalahan ada di pemformatan string Anda.

Cara yang benar untuk menggunakan pemformatan string tradisional menggunakan operator '%' adalah dengan menggunakan string format printf-style (dokumentasi Python untuk ini di sini: http://docs.python.org/2/library/string.html#format- string-syntax ):

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

Namun, operator '%' mungkin akan usang di masa mendatang . Cara PEP 3101 baru dalam melakukan sesuatu adalah seperti ini:

"'{0}' is longer than '{1}'".format(name1, name2)
leonh
sumber
9
scnr: "mungkin akan ditinggalkan di masa depan" tidak terjadi sejauh ini (Python 3.5). Sintaks '%' yang lama tidak ditinggalkan dalam 3.1 dan hanya dalam 3.2 logging modul mempelajari cara memformat dengan gaya baru{} . Dan tiba-tiba 3,5 membawa PEP 461: %format untuk byte . Ini membuat saya berpikir %sisa - sisa untuk waktu yang lama datang.
cfi
7
%lebih ringkas. Senang tinggal bersama kami.
Lenar Hoyt
3
Saya setuju. % lebih ringkas dan menghapus tidak akan bermanfaat bagi bahasa.
chevydog
@LenarHoyt Bagaimana perasaan Anda tentang f-string? Saya tidak bisa membayangkan itu "'%s' is longer than '%s'" % (name1, name2)lebih ringkas daripadaf"'{name1}' is longer than '{name2}'"
Mark Moretto
44

Bagi saya, kesalahan ini disebabkan ketika saya mencoba untuk memasukkan tuple ke metode format string.

Saya menemukan solusi dari pertanyaan / jawaban ini

Menyalin dan menempelkan jawaban yang benar dari tautan (BUKAN PEKERJAAN SAYA) :

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

Membuat singleton tuple dengan tuple of interest sebagai satu-satunya item, yaitu bagian (thetuple,), adalah bagian kunci di sini.

Nick Brady
sumber
Saya lebih suka mengkonversi tuple menjadi string menggunakan salah satu dari pernyataan berikut: print("this is a tuple: %s" % str(thetuple))atauprint("this is a tuple: %s" % repr(thetuple))
AlexG
12

Dalam kasus saya, itu karena saya hanya perlu satu %s, saya kehilangan input nilai.

ParisNakitaKejser
sumber
@ParisNakitaKejser, jadi bagaimana cara mendapatkan param input untuk% s tunggal?
Jatin Patel - JP
6

Selain dua jawaban lainnya, saya pikir lekukan juga salah dalam dua kondisi terakhir. Syaratnya adalah bahwa satu nama lebih panjang dari yang lain dan mereka harus mulai dengan 'elif' dan tanpa lekukan. Jika Anda menempatkannya dalam kondisi pertama (dengan memberinya empat lekukan dari margin), itu berakhir menjadi kontradiktif karena panjang nama tidak dapat sama dan berbeda pada saat yang sama.

    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))
GuyP
sumber
3

Ada kombinasi masalah yang ditunjukkan dalam beberapa jawaban lainnya.

  1. Seperti yang ditunjukkan oleh nneonneo Anda mencampur metode Pemformatan String yang berbeda.
  2. Seperti yang ditunjukkan oleh GuyP, lekukan Anda juga tidak aktif.

Saya telah memberikan contoh .format dan juga tuple lewat ke specifier argumen dari% s. Dalam kedua kasus lekukan telah diperbaiki sehingga lebih besar / kurang dari cek di luar dari saat panjang cocok. Juga mengubah pernyataan if ke elif sehingga mereka hanya berjalan jika pernyataan level sebelumnya yang sama adalah False.

Pemformatan String dengan .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))

Memformat String dengan% s dan tupel

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))
Trevor Benson
sumber
2

Dalam python 3.7 dan di atasnya ada cara baru dan mudah. di sini adalah sintaks:

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

Keluaran:

Hello, Eric. You are 74.
Shani
sumber
1

Bagi saya, ketika saya menyimpan banyak nilai dalam satu panggilan cetak, solusinya adalah membuat variabel terpisah untuk menyimpan data sebagai tuple dan kemudian memanggil fungsi cetak.

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

Saya menemukan kesalahan juga,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Tetapi list args bekerja dengan baik.

Saya menggunakan mysqlclient python lib. Lib sepertinya tidak menerima tuple args. Untuk lulus daftar, args seperti ['arg1', 'arg2'] akan bekerja.

Victor Choy
sumber
0

django query sql mentah dalam tampilan

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

Catatan: menggunakan python 3.5 dan Django 1.11

Vinay Kumar
sumber