В версии Python3.6 запланирован (тем не менее об этом нигде прямо не говорится, кроме строчки "Python-Version") релиз нового волшебного метода __fspath__ (https://www.python.org/dev/peps/pep-0519). В описании сказано вроде бы ясно:
The goal is to facilitate the migration of users towards rich path objects while providing an easy way to work with code expecting str or bytes.
Цель - облегчить пользователям переезд на продвинутые объекты, представляющие файловые пути, при этом предоставляя удобный способ работы с кодом, который ожидает юникодных или байтовых строк.
Тем не менее, не совсем понятно несколько моментов:
Для кого это обновление? О каких пользователях идет речь? Каков будет типичный пример использования, будь то в библиотеках или в прикладных программах?
Обычно я, как обыкновенный пользователь, пишу что-то вроде:
project_path = os.path.realpath(os.path.dirname(__file__))
config_path = os.path.join(project_path, 'configs', 'sub_configs', 'my_super_config.ini')
conf = open(config_path, 'r', encoding="utf-8")
и не вижу повода создавать из-за этого отдельные классы, представляющие пути. Даже если это будут классы вроде ConfigPath, ConcreteProjectConfigPath, то не совсем представляется, куда и зачем можно впихнуть новый метод.
str(foo)e Но зачем вообще вызывать str?open(None)вполне себе ругается и проблем не вызывает. – andreymal Jun 14 '16 at 22:48open()ожидает str/bytes и поэтому path-like объекты необходимо в str/bytes конвертировать. Чтобы обычные filesystem функции (например такие как в importlib), которые уже работают со строками могли безопасно поддерживать path-like объекты (вместо небезопасногоstr(path),os.fspath()вызывается где-нибудь глубоко в кишках функций, вызываемых importlib) что позволит их более широко использовать. Использование специальных объектов вместо строк для путей может сделать код более читаемым, переносимым и иногда более эффективным и менее подверженному к ошибкам. – jfs Jun 14 '16 at 23:03os.scandir()или похожих path-like объектов, для примера из ссылки в ответе. Если сможете, тогда ваш комментарий не является просто безграмотным необоснованным и неспровоцированным оскорблением. – jfs Jun 15 '16 at 11:27os.scandir()возвращает именно их. А зачем он возвращает именно их, а не (байтовые) строки? Бегло пробежавшись по PEP 471, ответа я не обнаружил (кэширование — не наш случай). – andreymal Jun 15 '16 at 11:56os.fspath()не было бы (для str/bytes эта функция ничего не делает). Хотя, конечно, вы можете, если хотите, прямой вопрос про path-like объекты задать, но аргументы те же что и в моём ответе (можно более детально обсудить почему surrogateescape существует, или почему следует Unicode API использовать на Windows, или упомянуть другие path.py реализации, или почему os.DirEntry более переносимо, читаемо и эффективно). – jfs Jun 15 '16 at 12:45