Как проверить аргумент TextIO?Python

Программы на Python
Anonymous
Как проверить аргумент TextIO?

Сообщение Anonymous »

Я только начинаю разбираться с подсказками типов Python и не понимаю, как реализовать проверку аргументов для следующей сигнатуры функции:

Код: Выделить всё

def read_file(file: Union[str, PathLike, TextIO]) -> str:
Моя первоначальная попытка реализации на Python была следующей:

Код: Выделить всё

def read_file(file: Union[str, PathLike, TextIO]) -> str:
try:
with open(file) as fileIO:
return read_file(fileIO)
except TypeError:
return file.read()
Хотя это кажется вполне допустимой питоновской реализацией read_file, проверка типов прошла через все это. Это и понятно, поскольку open не принимает ни один из возможных типов, кроме TypeIO и сужать тип нечем (хотя удивительно, что кроме TypeError: не рассматривается) .
Поэтому я отказался от «просить прощения» и вместо этого попытался явно проверить аргумент:

Код: Выделить всё

def read_file(file: Union[str, PathLike, TextIO]) -> str:
if isinstance(file, TextIO):
return file.read()
else:
with open(file) as fileIO:
return read_file(fileIO)
Это переворачивает всю логику и проверяет, является ли файл TextIO, поэтому средство проверки типов полностью удовлетворено. Проблема в том, что это на самом деле не имеет смысла во время выполнения, поскольку TextIO на самом деле не является базовым классом, который можно проверить, а скорее типом, который существует только для подсказок типов.
Здесь я начал сильно запутываться, поскольку понял, что на самом деле понятия не имею, как проверить, является ли что-то TextIO во время выполнения. Я перерыл всевозможные кроличьи норы, чтобы проверить, является ли переменная путевой или файловой, но мне кажется, что я здесь упускаю что-то фундаментальное. Я имею в виду, если средство проверки типов может заранее знать, что что-то является TextIO, то как может быть сложно сузить тип в реализации?
Это должно быть что-то это делается во всех видах библиотек, но большинство найденных мной реализаций используют неопределенные проверки для чтения, итерации и т. д., возможно, для обратной совместимости, но я стремлюсь к Python 3.9+, поэтому надеялся, что к настоящему времени это возможно. будет лучшим решением.
ПРИМЕЧАНИЕ. В качестве пояснения приведены комментарии и существующие ответы. Я не спрашиваю, как правильно открывать текстовые файлы. Я также не спрашиваю, как использовать подсказки типов в целом: я понимаю, что вам следует использовать сужение типов, чтобы обеспечить удобство проверки типов.
Мой вопрос: какие функции или выражения вы можете использовать в своем коде для сужения типа, в частности, подсказок типа TextIO, чтобы компилятор был рад отбросить этот тип для переменной? попробуйте... за исключением того, что не работает, проверка, является ли значение экземпляром TextIOBase или TextIO, также не работает.

Подробнее здесь: https://stackoverflow.com/questions/774 ... o-argument

Вернуться в «Python»