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

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

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

Ответ 1

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

От документы:

класс typing.io

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

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

Ответ 2

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

Ответ 3

Для тех, кто не очень знаком с типом намека на Python 3, ищем быстрый пример. Либо это:

from typing import TextIO # or IO or BinaryIO

def myfunction(file: TextIO ):
    pass

или в качестве рекомендации по общей рекомендации по эффективной практике (хотя для этого конкретного случая это необязательно):

from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from typing import TextIO # or IO or BinaryIO

def myfunction(file: 'TextIO'):
    pass

Второй подход позволит избежать импорта класса во время выполнения. Хотя python все равно придется импортировать TYPE_CHECKING во время выполнения, рекомендуется избегать импортирования классов только для намека типа: (1) не выполняется (просто разобран) и (2) он может избежать циклического импорта, Хотя в этом конкретном случае он ничего не добавляет, всегда лучше привыкнуть к нему и избегать будущих проблем.

Обратите внимание, что во втором утверждении цитаты вокруг имени класса 'TextIO' требуются