2014-07-02 31 views
7

Zgodnie z Tim Peters, "Powinien istnieć jeden - a najlepiej tylko jeden - czysty sposób na zrobienie tego". W Pythonie, wydaje się, że trzy sposoby drukowania informacji:Trzy sposoby drukowania w języku Python - kiedy używać każdego?

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

Pytanie: Are tam polityka najlepszych praktyk, że stan, gdy każdy z tych trzech różnych metod druku powinny być wykorzystywane w programie?

+0

Czy chcesz go użyć do logowania? Następnie sugerowałbym moduł logowania: https://docs.python.org/3/library/logging.html – RvdK

+0

Myślę, że 'print' to jedyny oczywisty sposób (powiedzmy, że nie znasz Pythona i pochodzisz z perla , co możesz spróbować?). Można to również powiedzieć o magicznych metodach. –

+0

@NoctisSkytower jest poprawne, powinieneś również wpisać "wydrukuj" jakiś tekst "". Zwróć uwagę na brakujące nawiasy. – RvdK

Odpowiedz

6

Należy zauważyć, że oświadczenie Tim jest całkowicie poprawny: nie jest tylko jeden oczywisty sposób to zrobić: print(). Pozostałe dwie wymienione możliwości mają inne cele.

Jeśli chcemy podsumować cele trzech alternatyw:

  • print jest funkcja wysokiego poziomu, które pozwalają, aby napisać coś na standardowe wyjście (lub inny plik). Zapewnia prosty i czytelny interfejs API, z pewnymi fantazyjnymi opcjami dotyczącymi rozdzielania pojedynczych elementów, dodawania terminatora itp. To właśnie chcesz robić przez większość czasu.

  • sys.stdout.write to tylko metoda obiektów plików. Tak więc prawdziwym punktem sys.stdout jest to, że możesz go przekazać tak, jakby był jakimkolwiek innym plikiem. Jest to przydatne, gdy mamy do czynienia z funkcją, która oczekuje pliku i chcemy, aby był on drukowany bezpośrednio na stdout.

    Innymi słowy nie powinieneś w ogóle używać sys.stdout.write. Po prostu przekazujesz około sys.stdout kodu, który oczekuje pliku.

    Uwaga: w python2 zdarzały się sytuacje, w których przy użyciu printoświadczenie wytwarzanego kodu gorszego niż nazywając sys.stdout.write. Jednak funkcja print pozwala zdefiniować separator i terminator, a tym samym omija niemal wszystkie te narożne przypadki.

  • os.write jest niskiego poziomu wywołanie do zapisu do pliku. Musisz ręcznie zakodować zawartość, a także musisz jawnie przekazać deskryptor pliku. Jest przeznaczony do obsługi tylko kodu niskiego poziomu, który z jakiegoś powodu nie może zostać zaimplementowany nad interfejsami wyższego poziomu. Prawie nigdy nie chcesz wywoływać tego bezpośrednio, ponieważ nie jest to wymagane i ma gorsze API niż reszta.

Pamiętaj, że jeśli masz kod, który należy zanotować rzeczy na pliku, to lepiej zrobić:

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

niż:

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

Bo to jest bardziej suchy. Używając print musisz za każdym razem powtarzać file=. To jest w porządku, jeśli musisz pisać tylko w jednym miejscu , ale jeśli masz 5/6 różnych zapisów, to łatwiej jest po prostu wywołać metodę write bezpośrednio.

2

Dla mnie druku jest właściwa droga, aby wydrukować na standardowe wyjście, ale:

Jest dobry powód sys.stdout.write istnieje - Wyobraźmy sobie klasę, która generuje jakieś wyjście tekstową i chcesz to zrobić napisz do stdout i plik na dysku lub ciąg znaków. W idealnej sytuacji klasa naprawdę nie powinna przejmować się typem wyjściowym, do którego pisze. Klasie można łatwo nadać obiekt pliku i tak długo, jak obiekt ten obsługuje metodę zapisu, klasa może używać metody write do wyprowadzania tekstu.

1

Dwie z tych metod wymagają importowania całych modułów. Na podstawie tego samego, print() jest najlepszą opcją standardowego użytkowania.

sys.stdout jest przydatny, gdy stdout może się zmienić. Daje to trochę mocy do obsługi strumienia.

os.write jest przydatna dla konkretnych zadań pisemnych os (bez blokowania pisze na przykład)

To pytanie zostało zadane kilka razy na tej stronie dla sys.stdout porównaniu z nadrukiem:

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

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

przykładem korzystania os.write (bez blokowania plików pisze wykazano w poniższym pytaniu). Funkcja może być użyteczna tylko w niektórych systemach operacyjnych, ale nadal musi pozostać przenośna, nawet jeśli niektóre systemy operacyjne nie obsługują różnych/specjalnych zachowań.

How to write to a file using non blocking IO?