Код: Выделить всё
def read_file(file: Union[str, PathLike, TextIO]) -> str:
Код: Выделить всё
def read_file(file: Union[str, PathLike, TextIO]) -> str:
try:
with open(file) as fileIO:
return read_file(fileIO)
except TypeError:
return file.read()
Поэтому я отказался от «просить прощения» и вместо этого попытался явно проверить аргумент:
Код: Выделить всё
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, то как может быть сложно сузить тип в реализации?
Это должно быть что-то это делается во всех видах библиотек, но большинство найденных мной реализаций используют неопределенные проверки для чтения, итерации и т. д., возможно, для обратной совместимости, но я стремлюсь к Python 3.9+, поэтому надеялся, что к настоящему времени это возможно. будет лучшим решением.
ПРИМЕЧАНИЕ. В качестве пояснения приведены комментарии и существующие ответы. Я не спрашиваю, как правильно открывать текстовые файлы. Я также не спрашиваю, как использовать подсказки типов в целом: я понимаю, что вам следует использовать сужение типов, чтобы обеспечить удобство проверки типов.
Мой вопрос: какие функции или выражения вы можете использовать в своем коде для сужения типа, в частности, подсказок типа TextIO, чтобы компилятор был рад отбросить этот тип для переменной? попробуйте... за исключением того, что не работает, проверка, является ли значение экземпляром TextIOBase или TextIO, также не работает.
Подробнее здесь: https://stackoverflow.com/questions/774 ... o-argument