python: где требуется настоящий встроенный файловый объект? - PullRequest
5 голосов
/ 16 мая 2011

Из документации по питону на urllib.urlopen(), говоря о файловом объекте, функция возвращает в случае успеха:

(Однако это не встроенный файловый объект, поэтому его нельзя использовать в тех немногих местах, где требуется настоящий встроенный файловый объект.)

Что это за несколько мест, где требуется настоящий встроенный файловый объект?

NB. Это чисто из любопытства ... здесь нет никакой практической проблемы.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Как отмечалось в других ответах, на самом деле нигде не требуется объект file, но есть интерфейсы, которым требуются настоящие файловые дескрипторы уровня ОС, которые похожи на файлы типа StringIO не могу предоставить.

Модуль os имеет несколько методов, которые работают непосредственно с файловыми дескрипторами, как и модули select и mmap. Некоторые модули более высокого уровня полагаются на те, что находятся внутри, поэтому могут иметь некоторые ограничения при работе с файловыми объектами, которые не поддерживают метод fileno().

Однако я не знаю какой-либо последовательной документации об этих ограничениях (кроме очевидного API-интерфейса, который принимает числовые дескрипторы файлов, а не объекты). Это скорее вопрос «попробуй и посмотри, работает ли». Если что-то не работает, то это нужно держать в уме, чтобы проверить, как возможный виновник (особенно если фразы, такие как "no attribute named 'fileno'" или "invalid file descriptor", появляются в любых соответствующих сообщениях об ошибках).

2 голосов
/ 16 мая 2011

Вещи в модуле subprocess нуждаются в файловом объекте с атрибутом fileno для stdin, stdout и stderr, что только файлы с файловым дескриптором (реальные файлы) должны реализовывать .isatty() также должно быть реализовано только в реальных файлах, но я не знаю, где это необходимо.

0 голосов
/ 16 мая 2011

Например, f.fileno () не обязательно возвращает истинный дескриптор файла уровня ОС, который вы можете использовать с os.read ().

...