Python có 2 cách chính format chuỗi cũ: toán tử % và phương thức .format(). (Python 3.6+ còn có f-string - tốt hơn cả hai).
Vấn đề của toán tử %
Toán tử % nhận một giá trị đơn hoặc một tuple. Điều này gây lỗi ngầm khi format tuple:
my_tuple = (1, 2, 3)
"My tuple: %s" % my_tuple
# TypeError: not all arguments converted during string formatting
Python hiểu my_tuple là 3 đối số riêng lẻ chứ không phải 1 tuple đơn. Phải gói lại:
"My tuple: %s" % (my_tuple,) # OK: tuple đơn chứa tuple
Ưu điểm của .format()
- Không có vấn đề tuple ambiguities.
- Cú pháp rõ ràng, mạnh mẽ hơn:
"{0} {1}".format(a, b),"{name}".format(name="value"). - Hỗ trợ format spec chi tiết:
"{:.2f}".format(3.14159). - Có thể truy cập attribute/item:
"{0.name}".format(obj).
Ví dụ so sánh
# % operator
"Hello %s, you have %d messages" % ("Alice", 5)
# .format()
"Hello {}, you have {} messages".format("Alice", 5)
"Hello {name}, you have {count} messages".format(name="Alice", count=5)
# f-string (Python 3.6+) - TỐT NHẤT
name = "Alice"
count = 5
f"Hello {name}, you have {count} messages"
Khuyến nghị
- Python 3.6+: Dùng f-string (nhanh nhất, dễ đọc nhất, an toàn).
- Python 3.0-3.5: Dùng
.format(). - Tránh: Toán tử
%(trừ logging module yêu cầu).