Подтвердить что ты не робот

Почему os.path.join выбрасывает аргументы?

Я изучаю Python, и я заметил что-то странное с одним из моих сценариев. Проведя небольшое тестирование, я обнаружил, что проблема связана с этим поведением:

>>> import os
>>> os.path.join('a','b')
'a/b'
>>> os.path.join('a','/b')
'/b'

Проверяя документацию, это, по сути, дизайн функции:

os.path. join (путь1 [, путь2 [,... ]])

Объединяйте один или несколько компонентов пути интеллектуально. Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если они есть), удаляются, а соединение продолжается....

Мой вопрос не почему мой script не удалось, а скорее, почему функция была разработана таким образом. Я имею в виду, по крайней мере, в Unix, a//b - вполне приемлемый способ обозначить путь, если не элегантный. Почему функция была разработана таким образом? Есть ли способ сказать, если один или несколько элементов пути были отброшены, не проверяя каждую строку пути с помощью os.path.isabs()?


Из любопытства я также проверил случай, когда компонент пути заканчивается символом os.sep:

>>> os.path.join('a/','b')
'a/b'

Это работает как ожидалось.

4b9b3361

Ответ 1

Один случай, когда полезно os.path.join('a', '/b') возвращать /b, будет, если вы попросите пользователя указать имя файла.

Пользователь может ввести либо путь относительно текущего каталога, либо полный путь, и ваша программа может обрабатывать оба случая, например:

os.path.join(os.getcwd(), filename)

In [54]: os.getcwd()
Out[54]: '/tmp'

In [55]: os.path.join(os.getcwd(), 'foo')
Out[55]: '/tmp/foo'

In [56]: os.path.join(os.getcwd(), '/foo/bar')
Out[56]: '/foo/bar'

Ответ 2

Подумайте, что вы пишете утилиту вроде cd, чтобы проверить новый каталог, вы бы использовали

os.path.join(currdir, newdir)

Если пользователь вводит /b, вы должны исключить его для первого аргумента. Это выполняется для большого количества вещей, используя текущий каталог.