2014-07-02 1 views
7

Nach Tim Peters, "Es sollte eine - und vorzugsweise nur eine - offensichtliche Möglichkeit geben." In Python scheint es drei Möglichkeiten, um Informationen zu drucken:Drei Möglichkeiten zum Drucken in Python - Wann soll ich sie verwenden?

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

Frage: Gibt es Best-Practice-Richtlinien, den Staat, wenn jede dieser drei verschiedenen Druckverfahren sollte in einem Programm verwendet werden?

+0

Möchten Sie es für die Protokollierung verwenden? Dann würde ich das Logging-Modul vorschlagen: https://docs.python.org/3/library/logging.html – RvdK

+0

Ich denke, 'print' ist der einzige offensichtliche Weg (sagen Sie, Sie wissen nicht, Python und Sie kommen aus Perl , was könntest du versuchen?). Dies kann auch für magische Methoden gesagt werden. –

+0

@NoctisSkytower richtig, Sie sollten auch "drucken" einige Text "'. Notieren Sie die fehlenden Klammern. – RvdK

Antwort

6

Beachten Sie, dass die Aussage von Tim vollkommen richtig ist: Es ist nur eine offensichtliche Art und Weise, es zu tun: print(). Die anderen beiden Möglichkeiten, die Sie erwähnen, haben unterschiedliche Ziele.

Wenn wir die Ziele der drei Alternativen zusammenfassen wollen:

  • print ist die High-Level-Funktion, die Sie etwas schreiben lassen (eine andere Datei oder) nach stdout. Es bietet eine einfache und lesbare API, mit einigen fantastischen Optionen, wie die einzelnen Elemente getrennt werden, oder ob Sie einen Terminator hinzufügen oder nicht möchten. Dies ist, was Sie die meiste Zeit tun möchten.

  • sys.stdout.write ist nur eine Methode der Dateiobjekte. Der wirkliche Punkt von sys.stdout ist, dass Sie es weitergeben können, als wäre es eine andere Datei. Dies ist nützlich, wenn Sie mit einer Funktion arbeiten müssen, die eine Datei erwartet, und Sie möchten, dass sie den Text direkt auf stdout ausgibt.

    Mit anderen Worten sollten Sie sys.stdout.write überhaupt nicht verwenden. Sie gehen einfach um sys.stdout zu Code, der eine Datei erwartet.

    Hinweis: in python2 gibt es einige Situationen, wo waren die printAnweisung schlechter Code erzeugt als sys.stdout.write aufrufen. Mit der Funktion print können Sie jedoch Separator und Terminator definieren und damit fast alle diese Fälle vermeiden.

  • os.write ist ein low-level Aufruf zum Schreiben in eine Datei. Sie müssen den Inhalt manuell codieren, und Sie müssen den Dateideskriptor explizit übergeben. Dies soll nur niedrigen Code behandeln, der aus irgendeinem Grund nicht über die höheren Schnittstellen implementiert werden kann. Sie möchten dies fast nie direkt aufrufen, da es nicht benötigt wird und eine schlechtere API als der Rest hat.

Beachten Sie, wenn Sie Code haben, die Dinge auf eine Datei aufschreiben sollte, ist es besser zu tun:

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

als:

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

Weil es trocken ist. Mit print müssen Sie immer file= wiederholen. Dies ist in Ordnung, wenn Sie nur in eine Stelle des Codes schreiben müssen, aber wenn Sie 5/6 verschiedene Schreibvorgänge haben, ist es viel einfacher, die write Methode direkt aufzurufen.

2

Für mich Druck ist der richtige Weg zu stdout drucken, aber:

Es gibt einen guten Grund, warum sys.stdout.write existiert - eine Klasse Stellen Sie sich vor, die einige Textausgabe erzeugt, und Sie wollen es machen Schreiben Sie entweder in stdout und Datei auf Festplatte oder in eine Zeichenfolge. Idealerweise sollte sich die Klasse nicht darum kümmern, an welchen Ausgabetyp sie schreibt. Die Klasse kann einfach ein Dateiobjekt erhalten, und solange dieses Objekt die Schreibmethode unterstützt, kann die Klasse die write-Methode verwenden, um den Text auszugeben.

1

Zwei dieser Methoden erfordern den Import ganzer Module. Nur auf dieser Grundlage ist print() die beste Standardverwendungsoption.

sys.stdout ist nützlich, wenn stdout sich ändern kann. Dies gibt ziemlich viel Kraft für das Stream-Handling.

os.write ist für OS-spezifische Schreibaufgaben (nicht blockierende schreibt zum Beispiel) nützlich

Diese Frage einige Male auf dieser Seite für sys.stdout vs. Print gefragt wurde:

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

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

Ein Beispiel für die Verwendung von os.write (nicht blockierende Datei in der Frage unten gezeigt schreibt). Die Funktion ist möglicherweise nur bei einigen Betriebssystemen nützlich, muss aber trotzdem portabel bleiben, auch wenn bestimmte Betriebssysteme unterschiedliche/spezielle Verhaltensweisen nicht unterstützen.

How to write to a file using non blocking IO?

Verwandte Themen