Tipo suggerimento per un file o un oggetto simile a un file?


106

Esiste un suggerimento di tipo corretto da utilizzare per un file o un oggetto simile a un file in Python? Ad esempio, come faccio a digitare il suggerimento sul valore di ritorno di questa funzione?

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

Risposte:


146

Utilizzare i tipi typing.TextIOo typing.BinaryIOper i file aperti rispettivamente in modalità testo o in modalità binaria.

Dai documenti :

classe typing.IO

Spazio dei nomi wrapper per i tipi di flusso I / O.

Definisce il tipo IO[AnyStr]e gli alias generici TextIOe BinaryIOrispettivamente per IO[str]e IO[bytes]. Questi rappresentano i tipi di flussi di I / O come restituiti da open().


In generale, magari digitando.IO come descrizione del tipo?
Yongwei Wu

2
Nessuno di questi sembra funzionare per me: def f() -> IO: return open('test')dà "Tipo previsto 'IO', ottenuto invece 'TextIOWrapper [str]'" in PyCharm.

@Marein di cosa IO[str]?
Wayne Werner

Lo stesso temo. Sto anche notando che l'iterazione sulle righe in un file restituisce "Expected 'collections.iterable'".

1
Riprodotto il numero di Marein nella comunità di PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

11

La risposta breve:

  • Devi essere esplicito. Non è from typing import TextIOsolo from typing import *.
  • Utilizzare IOper indicare un file senza specificare di che tipo
  • Usa TextIOo BinaryIOse conosci il tipo
  • Al momento non è possibile specificarne l'apertura per la scrittura o la sua codifica.

Come esempio:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

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

dà un errore di ispezione (in PyCharm) di Expected type 'BinaryIO', got 'TextIO' instead

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.