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')

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().


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.