TypeError: không phải tất cả các đối số được chuyển đổi trong python định dạng chuỗi


192

Chương trình được cho là có hai tên và nếu chúng có cùng độ dài thì nên kiểm tra xem chúng có cùng một từ không. Nếu đó là cùng một từ, nó sẽ in "Tên giống nhau" . Nếu chúng có cùng độ dài nhưng với các chữ cái khác nhau, nó sẽ in "Tên khác nhau nhưng cùng độ dài" . Phần tôi gặp vấn đề nằm ở 4 dòng dưới cùng.

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

Khi tôi chạy mã này, nó sẽ hiển thị:

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

Bất kỳ đề xuất đều được đánh giá cao.

Câu trả lời:


210

Bạn đang trộn các chức năng định dạng khác nhau.

Định %dạng kiểu cũ sử dụng %mã để định dạng:

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

Định {}dạng kiểu mới sử dụng {}mã và .formatphương thức

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

Lưu ý rằng với định dạng kiểu cũ, bạn phải chỉ định nhiều đối số bằng cách sử dụng một tuple:

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

Trong trường hợp của bạn, vì bạn đang sử dụng công {}cụ xác định định dạng, hãy sử dụng .format:

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

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

51

Lỗi là ở định dạng chuỗi của bạn.

Cách chính xác để sử dụng định dạng chuỗi truyền thống bằng cách sử dụng toán tử '%' là sử dụng chuỗi định dạng kiểu printf (Tài liệu Python cho việc này tại đây: http://docs.python.org/2/l Library / chuỗi.html # format- chuỗi cú pháp ):

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

Tuy nhiên, toán tử '%' có thể sẽ không được chấp nhận trong tương lai . Cách làm PEP 3101 mới là như thế này:

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

9
scnr: "có thể sẽ không được chấp nhận trong tương lai" đã không xảy ra cho đến nay (Python 3.5). Cú pháp '%' cũ không bị phản đối trong 3.1 và chỉ trong mô-đun ghi nhật ký{} 3.2 mới biết cách định dạng với kiểu mới . Và đột nhiên 3.5 mang lại PEP 461: %định dạng cho byte . Điều này khiến tôi nghĩ rằng phần %còn lại trong một thời gian dài sắp tới.
cfi

7
%ngắn gọn hơn Vui mừng nó ở lại với chúng tôi.
Lenar Hoyt

3
Tôi đồng tình. % ngắn gọn hơn và loại bỏ sẽ không mang lại lợi ích gì cho ngôn ngữ.
chevydog

@LenarHoyt Bạn cảm thấy thế nào về chuỗi f? Tôi không thể tưởng tượng điều đó "'%s' is longer than '%s'" % (name1, name2)ngắn gọn hơnf"'{name1}' is longer than '{name2}'"
Mark Moretto

44

Đối với tôi, lỗi này xảy ra khi tôi đang cố gắng chuyển một tuple vào phương thức định dạng chuỗi.

Tôi tìm thấy giải pháp từ câu hỏi / câu trả lời này

Sao chép và dán câu trả lời đúng từ liên kết (KHÔNG PHẢI LÀ CÔNG VIỆC CỦA TÔI) :

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

Tạo một bộ dữ liệu đơn lẻ với bộ dữ liệu quan tâm là mục duy nhất, tức là phần (thetuple,), là bit chính ở đây.


Tôi thà chuyển đổi tuple thành một chuỗi bằng một trong các câu sau: print("this is a tuple: %s" % str(thetuple))hoặcprint("this is a tuple: %s" % repr(thetuple))
AlexG

12

Trong trường hợp của tôi, đó là vì tôi chỉ cần một %s, tôi thiếu các giá trị đầu vào.


@ParisNakitaKejser, vậy làm thế nào để có được thông số đầu vào cho% s?
Jatin Patel - JP

6

Ngoài hai câu trả lời khác, tôi nghĩ rằng các vết lõm cũng không chính xác trong hai điều kiện cuối. Điều kiện là một tên dài hơn tên kia và chúng cần bắt đầu bằng 'elif' và không có vết lõm. Nếu bạn đặt nó trong điều kiện đầu tiên (bằng cách cho nó bốn vết lõm từ lề), thì cuối cùng nó sẽ mâu thuẫn vì độ dài của các tên không thể bằng nhau và khác nhau cùng một lúc.

    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

Có một sự kết hợp của các vấn đề như được chỉ ra trong một vài câu trả lời khác.

  1. Như được chỉ ra bởi nneonneo, bạn đang trộn các phương thức Định dạng Chuỗi khác nhau.
  2. Như GuyP đã chỉ ra, vết lõm của bạn cũng bị tắt.

Tôi đã cung cấp cả ví dụ về .format cũng như chuyển các bộ dữ liệu cho trình xác định đối số của% s. Trong cả hai trường hợp, vết lõm đã được cố định sao cho lớn hơn / nhỏ hơn các kiểm tra nằm ngoài thời gian khớp. Cũng thay đổi sau đó nếu các câu lệnh thành elif để chúng chỉ chạy nếu câu lệnh cùng mức trước đó là Sai.

Định dạng chuỗi với .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))

Định dạng chuỗi với% s và một 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

Trong python 3.7 trở lên có một cách mới và dễ dàng. đây là cú pháp:

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

Ra ngoài:

Hello, Eric. You are 74.

1

Đối với tôi, vì tôi đang lưu trữ nhiều giá trị trong một lệnh in, giải pháp là tạo một biến riêng để lưu dữ liệu dưới dạng một tuple và sau đó gọi hàm in.

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

0

Tôi cũng gặp lỗi

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Nhưng danh sách args hoạt động tốt.

Tôi sử dụng lib python mysqlclient. Các lib trông như không chấp nhận tuple args. Để vượt qua danh sách args như ['arg1', 'arg2'] sẽ làm việc.


0

django truy vấn sql thô trong xem

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

mô hình

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

lượt xem

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

Lưu ý: sử dụng python 3.5 và django 1.11

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.