Tại sao phương thức 'định dạng' không được sử dụng rộng rãi hơn trong Python?


8

Có lẽ tôi đang thiếu một cái gì đó ở đây, sau khi tìm kiếm tôi không thể tìm thấy câu trả lời.

Tôi đã khám phá khá nhiều dự án Python và một điều tôi nhận thấy là phần lớn trong số họ tiếp tục sử dụng %toán tử để định dạng chuỗi thay vì .format()phương thức mới hơn, được đề xuất . Có một lý do cho điều này? nó có vẻ như là một thay đổi nhỏ, trừ khi tôi thiếu một cái gì đó hoàn toàn.

Ví dụ:

# count how many times the % operator technique is used
find . -name "*.py" -exec grep -HE "\"[^\"]+\"\s\%\s\w+|'[^']+'\s\%\s\w+" {} \; | wc -l

# and the same for format()
find . -name "*.py" -exec grep -HE "\w+\.format\(" {} \; | wc -l

# Results:
#
#               % operator        format()
# iPython          670               63
# Django           977               8
# Tornado          91                0
# requests         25                1

Không có lý do thực sự cho câu hỏi này, chỉ tò mò.

Cố lên các chàng trai!


2
Mọi người thích gõ ít hơn, và cũng có mã được viết trước khi có một .format()phương thức?
Wooble

FWIW, cái cũ %hiệu quả hơn và ít dài dòng hơn cho việc thay thế chuỗi đơn giản. Tôi sử dụng nó hầu hết các lần và khi tôi cần định dạng mạnh hơn tôi sẽ sử dụng.format
bgusach

Câu trả lời:


16

Ba khuynh hướng cực kỳ mạnh mẽ kết hợp với nhau để tạo ra hiệu ứng này:

  1. Thoải mái: "Tôi biết cách làm theo cách cũ, học theo cách mới sẽ nỗ lực hơn."
  2. nỗ lực / hiệu ứng đánh đổi: "Phương thức cũ đã biến mất chưa? Nó thậm chí còn bị phản đối? Không? Sau đó, không có trường hợp kinh doanh nào thay đổi điều này. Thay vào đó hãy tạo mã mới."
  3. An toàn: "Bạn có chắc chắn cách làm mới được đề xuất là hoàn toàn tương đương không? Không? Vậy thì tốt hơn hãy để lại mã cũ - bạn có thể đưa ra các khiếm khuyết."

Trên thực tế, cả ba đều khá hợp lý (điều đầu tiên ít nhất là như vậy, vì việc học tập liên tục là điều mà nhân viên thông tin nên phát triển mạnh).

( Chỉnh sửa: Như được chỉ ra dưới đây có một điểm thứ tư: không biết rằng phương thức mới thậm chí còn tồn tại! Điều này ít hợp lý hơn, nhưng thực sự có thể là phương pháp phổ biến nhất.)


4
+1 có lẽ có 4. không biết rằng thậm chí còn có một cách mới
jk.

1
@jk. +1 Tôi không biết định dạng () tồn tại.
Joe Z.

+1, nhưng bao gồm điểm thứ 4 đó. Tôi nhận thấy hết lần này đến lần khác trên SO rằng bất cứ khi nào tôi chỉ ra .format()phương thức hoặc format()chức năng mà mọi người không biết chúng tồn tại .
Martijn Pieters

1
Tôi muốn thêm rằng formatkhông tương đương %. Ví dụ: bằng cách sử dụng, %bạn có thể sử dụng *để chỉ định độ rộng trường tối thiểu (ví dụ: '%.*f' % (7, 2.34)định dạng dấu phẩy 2.34có ít nhất 7chữ số), trong khi với formatbạn không thể làm điều này. Và có lẽ tồn tại những thứ khác formatcó thể làm trong khi %không thể.
Bakuriu

3
Câu trả lời chính xác. Ngoài ra, @Bakuri có thể với format, mặc dù nó không ngắn gọn - "{0:.{1}f}".format(2.34, 7). Tôi không tìm thấy bất cứ điều gì %có thể làm điều đó formatkhông thể.
Matt

6

Ngoài các lý do khác, tôi sẽ thêm tính tương thích và tính nhất quán lạc hậu. Thường thì bạn cần phải viết các tập lệnh có thể chạy trên máy tính của người khác, những người không sẵn sàng hoặc không thể nâng cấp lên Python mới nhất và tốt nhất. Vì vậy, bạn viết cho mẫu số chung thấp nhất. Vào thời điểm đủ, người dùng của bạn đã nâng cấp lên phiên bản Python gần đây, có lẽ bạn đã quên những tính năng xuất hiện trong phiên bản Python nào. Trừ khi chúng là các tính năng đặc biệt có giá trị, nó có thể không đáng để dành thời gian nghiên cứu, xem xét và quyết định xem liệu bây giờ có an toàn để sử dụng từng tính năng hay không. Phương thức định dạng là một API đẹp để sử dụng trong mã mới, nhưng trường hợp giới thiệu nó với cơ sở mã đã sử dụng% rộng rãi thì không quá mạnh.


2

Khi phát triển phần mềm cho mục đích sử dụng của riêng bạn, việc sử dụng các phiên bản mới hơn của thư viện và công cụ phát triển của bạn thường mang lại lợi ích cho bạn. Tuy nhiên, các dự án bạn đang xem là các thư viện và công cụ phát triển được chia sẻ với cộng đồng. Trong những trường hợp này, bạn muốn thận trọng trong các tính năng bạn yêu cầu để có được cơ sở được cài đặt rộng nhất và thu hút được nhiều người tham gia vào dự án nhất.

Các format()phương pháp đã không được thêm vào cho đến khi việc phát hành Python 3,0 / 2,6 trong năm 2008. Điều đó có vẻ như một thời gian dài trước đây nhưng hãy nhớ rằng những người hiếm khi sử dụng phiên bản đầu tiên của phần mềm. Chúng ta hãy đặt nó trong bối cảnh khi nó trở nên có sẵn trong hai trong số các bản phân phối Linux 'nghiêm trọng' hơn. RHEL 5.x vẫn sử dụng Python 2.4 và được hỗ trợ cho đến năm 2017 - 6.x có Python 2.6 nhưng chưa được phát hành cho đến năm 2010. Trong trại Debian họ không có Python 2.6 cho đến khi loạt 6.x trở nên ổn định trong 2011.

Vì vậy, mặc dù có thể có ý nghĩa, nếu bạn đang bắt đầu một dự án như Django (ban đầu được phát hành vào năm 2005), để chuẩn hóa phương pháp mới, có rất ít giá trị trong việc quay lại và thay đổi tất cả 1000 lần xuất hiện của phương thức cũ mà không có đã chính thức bị phản đối. Nó làm cho công việc, tạo ra khả năng giới thiệu các lỗi và không cần thiết phải tăng các yêu cầu hệ thống.


0

Ngoài câu trả lời của @ KilianFoth; chuyển một dự án lớn sang phiên bản phần mềm phía trên có quá nhiều việc phải làm. Và việc thay đổi cách sử dụng không được chấp nhận có tầm quan trọng ít nhất trong quá trình nâng cấp.

Có lẽ họ đang sử dụng định dạng mới trong các phần được viết lại hoàn toàn và không thay đổi cách sử dụng hiện có trên phần còn lại.

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.