Tipphinweis für eine Datei oder ein dateiähnliches Objekt?

95

Gibt es einen korrekten Typhinweis für eine Datei oder ein dateiähnliches Objekt in Python? Wie würde ich beispielsweise den Rückgabewert dieser Funktion tippen?

def foo():
    return open('bar')
Mark Amery
quelle

Antworten:

136

Verwenden Sie entweder die Typen typing.TextIOoder typing.BinaryIOfür Dateien, die im Textmodus bzw. im Binärmodus geöffnet wurden.

Aus den Dokumenten :

Klasse typing.IO

Wrapper-Namespace für E / A-Stream-Typen.

Dies definiert die generische Art IO[AnyStr]und Aliase TextIOund BinaryIOfür jeweils IO[str]und IO[bytes]. Diese repräsentieren die Arten von E / A-Streams, wie sie von zurückgegeben werden open().

Wayne Werner
quelle
Generell vielleicht tippen.IO als Typbeschreibung?
Yongwei Wu
2
Keines davon scheint für mich zu funktionieren: def f() -> IO: return open('test')Gibt in PyCharm "Erwarteter Typ 'IO', stattdessen 'TextIOWrapper [str]'" an.
@Marein was ist mit IO[str]?
Wayne Werner
Das gleiche fürchte ich. Ich stelle auch fest, dass das Durchlaufen der Zeilen in einer Datei "Erwartete 'Sammlungen.iterable'" ergibt.
1
Reproduziert @ Mareins Ausgabe in der PyCharm-Community 2017.2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett
9

Die kurze Antwort:

  • Sie müssen explizit sein. Das ist from typing import TextIOnicht nur so from typing import *.
  • Verwenden Sie IOdiese Option, um eine Datei zu bezeichnen, ohne anzugeben, welche Art
  • Verwenden Sie TextIOoder BinaryIOwenn Sie den Typ kennen
  • Sie können derzeit nicht angeben, dass es zum Schreiben oder zur Codierung geöffnet werden soll.

Als Beispiel:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

with open('x') as f:
    binf(f)

gibt einen Inspektionsfehler (in PyCharm) von aus Expected type 'BinaryIO', got 'TextIO' instead

Charles Merriam
quelle