Bir dosya veya dosya benzeri nesne için ipucu yazın?


106

Python'da bir dosya veya dosya benzeri nesne için kullanılacak herhangi bir doğru tür ipucu var mı? Örneğin, bu işlevin dönüş değerini nasıl yazabilirim?

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

Yanıtlar:


147

Metin modunda veya ikili modda açılan dosyalar için sırasıyla typing.TextIOveya typing.BinaryIOtürlerini kullanın .

Gönderen docs :

sınıf typing.IO

G / Ç akış türleri için sarmalayıcı ad alanı.

Bu, genel türü IO[AnyStr]ve takma adları TextIOve BinaryIOsırasıyla IO[str]ve için tanımlar IO[bytes]. Bunlar, döndürülen gibi G / Ç akışlarının türlerini temsil eder open().


Genel olarak, tür açıklaması olarak.IO yazabilirsiniz?
Yongwei Wu

2
Bunların hiçbiri benim için işe yaramıyor gibi görünüyor: def f() -> IO: return open('test')PyCharm'da "Beklenen tür 'IO' veriyor, bunun yerine 'TextIOWrapper [str]' var".

@Marein ne dersiniz IO[str]?
Wayne Werner

Korkarım aynısı. Ayrıca, bir dosyadaki satırlar üzerinde yinelemenin "Beklenen 'collections.iterable'" verdiğini de fark ediyorum.

1
PyCharm topluluğu 2017.2'de @ Marein sorunu yeniden oluşturuldu: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

11

Kısa cevap:

  • Açık sözlü olmalısın. Bu from typing import TextIOsadece değil from typing import *.
  • IONe tür olduğunu belirtmeden bir dosyayı ifade etmek için kullanın
  • Türü biliyorsanız TextIOveya kullanınBinaryIO
  • Şu anda yazma veya kodlama için açılmasını belirtemezsiniz.

Örnek olarak:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

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

(PyCharm'da) bir denetim hatası veriyor Expected type 'BinaryIO', got 'TextIO' instead

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.