Введите подсказку для файла или файлового объекта?

106

Есть ли какая-нибудь подсказка о правильном типе файла или файлового объекта в Python? Например, как мне набрать возвращаемое значение этой функции?

def foo():
    return open('bar')
Марк Эмери
источник

Ответы:

146

Используйте типы typing.TextIOили typing.BinaryIOдля файлов, открытых в текстовом или двоичном режиме соответственно.

Из документов :

класс typing.IO

Пространство имен оболочки для типов потоков ввода-вывода.

Это определяет общий тип IO[AnyStr]и псевдонимы TextIOи BinaryIOсоответственно для IO[str]и IO[bytes]. Они представляют типы потоков ввода-вывода, такие как возвращаемые open().

Уэйн Вернер
источник
В общем, возможно, набрав .IO в качестве описания типа?
Yongwei Wu
2
Ни один из них, похоже, не работает для меня: def f() -> IO: return open('test')дает «Ожидаемый тип 'IO', вместо этого получил 'TextIOWrapper [str]'» в PyCharm.
@Marein о чем IO[str]?
Wayne Werner
Боюсь тоже. Я также заметил, что повторение строк в файле дает «Expected 'collections.iterable'».
1
Воспроизведена проблема @ Marein в сообществе PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Жан-Франсуа Корбетт,
11

Краткий ответ:

  • Вы должны быть откровенны. Это from typing import TextIOне просто так from typing import *.
  • Используется IOдля обозначения файла без указания типа
  • Используйте TextIOили, BinaryIOесли вы знаете тип
  • В настоящее время вы не можете указать, что он будет открыт для записи или его кодировку.

Например:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

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

выдает ошибку проверки (в PyCharm) Expected type 'BinaryIO', got 'TextIO' instead

Чарльз Мерриам
источник