Mam skrypt, który tworzy wyjście z sys.stdout.write()
i sys.stderr.write()
. Niedawno opublikowałem kilka pytań dotyczących innych aspektów skryptu i zauważyłem, że ludzie publikujący odpowiedzi wydają się preferować print('some text', file=sys.stdout)
. Moją podstawową troską o wynik jest po prostu to, że może być przekierowany przez powłokę, albo do pliku, albo jako wejście do innego programu. Czy ktoś mógłby wyjaśnić (lub skierować mnie do istniejącego wyjaśnienia) różnice między print()
i sys.stdout.write
, przypadki, w których należy je stosować i racjonalne dla tych konwencji?print() vs sys.stdout.write(): które i dlaczego?
Odpowiedz
"Czy ktoś mógłby wyjaśnić (lub skierować mnie do istniejącego wyjaśnienia) różnice między print() i sys.stdout.write, przypadki, w których każdy powinien być używany i racjonalnym dla tych konwencji? "
Cóż, myślę, że cisza słysząca o funkcji print() Python3 jest taka, że praktycznie istnieje tylko jedna różnica: użycie. Zacytuję PEP-3105: [1]
Podpis dla print()
jest:
def wydrukować (* args, wrzesień =”” end = '\ n', file = None)
połączenie takie jak:
druku (a, b, c, plik = sys.stderr)
będzie odpowiednikiem dzisiejszego:
print >> sys.stderr, a, b, c
natomiast opcjonalne SEP i końcowe argumenty określić, co jest drukowany pomiędzy i po argumentach, odpowiednio .
Funkcja miękkiego obszaru (pół-tajny atrybut na plikach używanych do sygnalizowania drukowania, czy wstawić spację przed pierwszym elementem) zostanie usunięta. W związku z tym, że nie będzie to bezpośrednie tłumaczenie na dzisiejszy:
print "a", druk
który nie zostanie wydrukowany przestrzeń pomiędzy "A", a linią.
Tak więc, przytaczając dyskusję Guido van Rossuma na temat problemu w 2005 r. [1]: Istnieje wyraźna nieliniowość w łatwości użytkowania druku, gdy zdecydujesz, że nie chcesz mieć spacji między przedmiotami; musisz albo przełączyć się na używanie sys.stdout.write()
, albo musisz zebrać wszystkie elementy w ciągu znaków.Nie jest to proste przekształcenie, za co trzeba, aby pozbyć się spacji przed przecinkami w ten prosty przykład:
print "x =", x, ", y =", y, ", z =", z
jeśli był to funkcja wbudowana, że wbudowany funkcja towarzysząca, która zrobiła coś podobnego bez wstawiania spacji i dodanie nowej linii byłoby logiczną rzeczą do zrobienia (lub dodaniem parametrów słów kluczowych do kontrolowania tego zachowania, ale ja wolę drugą funkcję); ale tylko druku w obecnym brzmieniu, trzeba by przełączyć się na coś takiego
print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z)
lub
print "x = %s, y = %s, z = %s" % (x, y, z)
z których żaden nie jest bardzo atrakcyjna. (I nie mów mi, że obowiązuje to nic wielkiego - nie są w to przykład, ale są one w innych sytuacjach.)
Dobre pytanie niedzielę rano pamięci pasa w dół ; Dlaczego ta widoczna redundancja? Ponieważ jest pythonically bardziej poprawne pisanie kodu wyższego poziomu:
7th Zen Pythona: "Czytelność liczy"
Możliwa duplikat [Python - Różnica między sys.stdout.write i Print] (https: //stackoverflow.com/questions/3263672/python-the-difference-between-sys-stdout-write-and-print) –