2014-07-02 13 views
7

Theo Tim Peters, "Phải có một-- và tốt nhất là chỉ có một - cách rõ ràng để thực hiện điều đó". Trong Python, dường như có ba cách để in thông tin:Ba cách để in bằng Python - khi nào cần sử dụng?

print('Hello World', end='') 
sys.stdout.write('Hello World') 
os.write(1, b'Hello World') 

Câu hỏi: Có chính sách thực hành tốt nhất mà nhà nước khi mỗi một trong ba phương pháp khác nhau in ấn nên được sử dụng trong một chương trình?

+0

Bạn có muốn sử dụng nó để đăng nhập không? Sau đó, tôi sẽ đề nghị các mô-đun đăng nhập: https://docs.python.org/3/library/logging.html – RvdK

+0

Tôi nghĩ rằng 'in' là cách rõ ràng duy nhất (nói rằng bạn không biết python và bạn đến từ perl , bạn có thể thử gì?). Điều này cũng có thể nói cho các phương pháp ma thuật. –

+0

@NoctisSkytower chính xác, bạn cũng nên liệt kê 'in' một số văn bản "'. Lưu ý các dấu ngoặc còn thiếu. – RvdK

Trả lời

6

Lưu ý rằng tuyên bố của Tim là hoàn toàn chính xác: có chỉ có một cách rõ ràng để làm điều đó: print(). Hai khả năng khác mà bạn đề cập có các mục tiêu khác nhau.

Nếu chúng ta muốn tóm tắt các mục tiêu của ba lựa chọn:

  • print là chức năng cao cấp cho phép bạn viết một cái gì đó để thiết bị xuất chuẩn (hoặc một tập tin khác). Nó cung cấp một API đơn giản và dễ đọc, với một số tùy chọn ưa thích về cách các mục đơn lẻ được tách ra, hoặc cho dù bạn muốn thêm hay không một terminator vv Đây là những gì bạn muốn làm hầu hết thời gian.

  • sys.stdout.write chỉ là phương pháp của đối tượng tệp. Vì vậy, điểm thực của sys.stdout là bạn có thể truyền nó xung quanh như thể nó là bất kỳ tệp nào khác. Điều này rất hữu ích khi bạn phải đối phó với một hàm đang mong đợi một tệp và bạn muốn nó in văn bản trực tiếp trên stdout.

    Nói cách khác, bạn không nên sử dụng sys.stdout.write. Bạn chỉ cần vượt qua khoảng sys.stdout để mã mong đợi một tệp.

    Lưu ý: trong python2 có một số trường hợp sử dụng mã vạch print sản xuất mã tồi tệ hơn gọi số sys.stdout.write. Tuy nhiên, chức năng print cho phép bạn xác định dấu phân tách và dấu kết thúc và do đó tránh hầu như tất cả các trường hợp góc này.

  • os.writemức thấp gọi để ghi vào tệp. Bạn phải mã hóa nội dung theo cách thủ công và bạn cũng phải chuyển qua bộ mô tả tệp một cách rõ ràng. Điều này có nghĩa là chỉ xử lý mã mức thấp, vì một lý do nào đó, không thể triển khai trên đầu các giao diện cấp cao hơn. Bạn hầu như không bao giờ muốn gọi trực tiếp điều này, bởi vì nó không bắt buộc và có API tệ hơn so với phần còn lại.

Lưu ý rằng nếu bạn có mã mà nên viết ra những điều trên một tập tin, nó tốt hơn để làm:

my_file.write(a) 
# ... 
my_file.write(b) 
# ... 
my_file.write(c) 

Thần:

print(a, file=my_file) 
# ... 
print(b, file=my_file) 
# ... 
print(c, file=my_file) 

Bởi vì đó là hơn DRY. Sử dụng print bạn phải lặp lại file= mọi lúc. Điều này là tốt nếu bạn phải viết chỉ trong một vị trí của mã, nhưng nếu bạn có 5/6 viết khác nhau thì đơn giản hơn nhiều là chỉ cần gọi trực tiếp phương thức write.

2

Đối với tôi in là đúng cách để in ra stdout, nhưng:

Có một lý do chính đáng tại sao sys.stdout.write tồn tại - Hãy tưởng tượng một lớp học mà tạo ra một số lượng văn bản và bạn muốn làm cho nó ghi vào hoặc stdout và tệp trên đĩa hoặc chuỗi. Lý tưởng nhất là lớp học thực sự không nên quan tâm đến loại đầu ra mà nó đang viết. Lớp có thể đơn giản được đưa ra một đối tượng tệp, và miễn là đối tượng đó hỗ trợ phương thức ghi, lớp đó có thể sử dụng phương thức ghi để xuất văn bản.

1

Hai trong số các phương pháp này yêu cầu nhập toàn bộ mô-đun. Chỉ dựa trên điều này, print() là tùy chọn sử dụng tiêu chuẩn tốt nhất.

sys.stdout hữu ích khi stdout có thể thay đổi. Điều này mang lại khá nhiều sức mạnh cho việc xử lý luồng.

os.write là hữu ích cho os nhiệm vụ viết cụ thể (không chặn viết ví dụ)

Câu hỏi này đã được hỏi một số lần trên trang web này cho sys.stdout vs in:

Python - The difference between sys.stdout.write and print

print() vs sys.stdout.write(): which and why?

Một ví dụ cho việc sử dụng os.write (không chặn tập viết thể hiện trong câu hỏi dưới đây). Chức năng này chỉ có thể hữu ích trên một số hệ điều hành nhưng nó vẫn phải được lưu động ngay cả khi một số hệ điều hành nhất định không hỗ trợ các hành vi khác nhau/đặc biệt.

How to write to a file using non blocking IO?

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