12

Tôi có một số mã hoạt động tốt trong Python 2.7.Str.format() cho Python 2.6 đưa ra lỗi trong đó 2.7 không

Python 2.7.3 (default, Jan 2 2013, 13:56:14) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sys import stdout 
>>> foo = 'Bar' 
>>> numb = 10 
>>> stdout.write('{} {}\n'.format(numb, foo)) 
10 Bar 
>>> 

Nhưng trong 2.6 tôi nhận được ngoại lệ ValueError.

Python 2.6.8 (unknown, Jan 26 2013, 14:35:25) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sys import stdout 
>>> foo = 'Bar' 
>>> numb = 10 
>>> stdout.write('{} {}\n'.format(numb, foo)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: zero length field name in format 
>>> 

Khi nhìn qua các tài liệu (2.6, 2.7), tôi có thể thấy không có đề cập đến những thay đổi đã được thực hiện giữa hai phiên bản. Chuyện gì đang xảy ra ở đây?

Trả lời

22

Python 2.6 và trước đó (cũng như Python 3.0) đòi hỏi mà bạn đánh số các placeholders:

'{0} {1}\n'.format(numb, foo) 

Việc đánh số, nếu bỏ qua trong Python 2.7 và Python 3.1 trở lên, là tiềm ẩn, xem documentation:

Thay đổi trong phiên bản 2.7: Các specifiers luận vị trí có thể được bỏ qua, vì vậy '{} {}' tương đương với '{0} {1}'.

Việc đánh số ngầm là phổ biến; rất nhiều ví dụ ở đây trên Stack Overflow sử dụng nó vì nó dễ dàng hơn để whip lên một chuỗi định dạng nhanh theo cách đó. Tôi đã quên bao gồm chúng nhiều hơn một lần khi làm việc trên các dự án phải hỗ trợ 2.6.

+0

Cảm ơn bạn. Tôi đã bận rộn chỉ cần nhìn vào các tài liệu hướng dẫn cho các phương pháp riêng của mình mà tôi bị mất văn bản trong đầu. – Mogget

Các vấn đề liên quan