Почему os.normpath не сворачивает ведущую двойную косую черту?

В Unix os.path.normpath сворачивает несколько косых черт в одну, за исключением случаев, когда в начале пути появляются ровно две косые черты. Почему исключение?

Для иллюстрации я получаю следующие преобразования:

//double/slash/stays -> //double/slash/stays
/double/slash//gone// -> /double/slash/gone/
double//slash//gone/ -> double/slash/gone
///triple/slash/gone -> /triple/slash/gone
////quad/slash/gone -> /quad/slash/gone

Мне это кажется странным. Я могу смутно представить, что это полезно для монтирования SMB или URL-адресов, но я не думаю, что меня это волнует. Есть ли какая-то скрытая мудрость в поведении Python, или я должен сам свернуть ведущий //?

[update] С учетом приведенного ниже ответа кажется, что лучше всего не сворачивать //, а либо просто принять его, либо рассматривать как ошибку.


person Adrian Ratnapala    schedule 19.10.2011    source источник


Ответы (1)


Потому что POSIX позволяет обрабатывать путь, начинающийся с двух косых черт, способом, определяемым реализацией. Другими словами, //foo не обязательно означает то же самое, что и /foo во всех системах POSIX.

Из IEEE Std 1003.1:

Путь, начинающийся с двух последовательных косых черт, может интерпретироваться способом, определяемым реализацией, хотя более двух начальных косых черт следует рассматривать как одну косую черту.

См. также это сообщение об ошибке (которое было закрыто как недействительное).

person Laurence Gonsalves    schedule 19.10.2011
comment
Можете ли вы привести пример этого? Мне очень интересно посмотреть, как я могу реализовать это в своей системе Linux;) - person Blender; 19.10.2011
comment
Насколько я знаю, Linux не использует этот факт. Определяемая реализацией означает, что реализация может делать все, что захочет, в том числе обрабатывать двойную косую черту так же, как одинарную косую черту. - person Laurence Gonsalves; 19.10.2011
comment
Интересно. Теперь скрыта мудрость POSIX, а не Python. Кто-то где-то в мире Unix должен использовать (или когда-то планировал использовать) префикс //, а затем лоббировал POSIX, чтобы сделать это странное правило. Есть идеи, какова цель или была? - person Adrian Ratnapala; 19.10.2011
comment
@AdrianRatnapala Я действительно не знаю, для чего это используется. Я всегда подозревал, что он предназначен для таких вещей, как виртуальные файловые системы (например: //ftp/хост/путь), удаленные файловые системы (например: //имя хоста/путь) или, возможно, даже какая-то странная система резервного копирования или контроля версий ( например: //метка времени/путь). Единственное, что я видел на практике, это пути UNC в Windows. Однако пути Windows в целом не совместимы с POSIX, поэтому я предполагаю, что это просто совпадение. - person Laurence Gonsalves; 19.10.2011