Подтвердить что ты не робот

Правильный способ аннотировать "тип файла" в Python

В современных версиях Ppython можно проводить статический анализ типов с использованием аннотаций функций, согласно PEP 484. Это легко сделать с помощью модуля ввода.

Теперь мне интересно, как бы я дал "подсказку типа" для "файлового потока".

def myfunction(file: FILETYPE):
    pass

with open(fname) as file:
    myfunction(file)

Что бы я вставил как FILETYPE?

Использование print(type(file)) возвращает <class '_io.TextIOWrapper'>, что не совсем понятно.

Разве нет общего типа "файл"?

4b9b3361

Ответ 1

Я думаю, что вы хотите io.IOBase, "[t] он абстрактный базовый класс для всех классов ввода/вывода, действующих на потоках байтов."

Обратите внимание, что это также включает потоки в памяти, такие как io.StringIO и io.BytesIO. Подробнее читайте в документации по модулю io.

Ответ 2

Вы можете использовать typing.IO, typing.TextIO и typing.BinaryIO для представления различных типов потоков ввода/вывода. Цитировать документацию:

class typing.io

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

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

    Эти типы также доступны непосредственно как typing.IO, typing.TextIO и
    typing.BinaryIO.

Ответ 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) может избежать циклического импорт.