Wpisz wskazówkę dotyczącą pliku lub obiektu podobnego do pliku?


116

Czy jest jakaś poprawna wskazówka dotycząca typu pliku lub obiektu podobnego do pliku w Pythonie? Na przykład, w jaki sposób mógłbym wskazać wartość zwracaną przez tę funkcję?

def foo():
    return open('bar')

Odpowiedzi:


160

Użyj typów typing.TextIOlub typing.BinaryIOdla plików otwieranych odpowiednio w trybie tekstowym lub binarnym.

Z dokumentów :

klasa typing.IO

Przestrzeń nazw opakowania dla typów strumieni we / wy.

Definiuje typ ogólny IO[AnyStr]i aliasy TextIOoraz BinaryIOodpowiednio dla IO[str]i IO[bytes]. Reprezentują one typy strumieni we / wy, takie jak zwracane przez open().


Generalnie może typ.IO jako opis typu?
Yongwei Wu

2
Żadne z nich nie działa dla mnie: def f() -> IO: return open('test')podaje „Oczekiwany typ IO”, zamiast tego otrzymuje „TextIOWrapper [str]” w PyCharm.

@Marein a co z IO[str]?
Wayne Werner

Obawiam się tego samego. Zauważyłem również, że iteracja po wierszach w pliku daje "Oczekiwany 'collections.iterable'".

1
Przedrukowano numer @ Marein w społeczności PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

15

Krótka odpowiedź:

  • Musisz być wyraźny. To from typing import TextIOnie jest sprawiedliwe from typing import *.
  • Służy IOdo oznaczania pliku bez określania jego rodzaju
  • Użyj TextIOlub BinaryIOjeśli znasz typ
  • Obecnie nie można określić, czy ma być otwierana do zapisu ani kodowana.

Jako przykład:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

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

daje błąd inspekcji (w PyCharm) wynoszący Expected type 'BinaryIO', got 'TextIO' instead

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.