os.path.join с подклассом str - PullRequest
       0

os.path.join с подклассом str

5 голосов
/ 07 октября 2011

Кто-нибудь знает, почему функция os.path.join не работает с подклассами str?

(я использую Python3.2 x64 и Python2.7 x86 в Windows, и результат тот же)

Это код, который у меня есть

class Path(str):
    def __add__(self, other):
        return Path(os.path.join(self, other))

p = Path(r'C:\the\path')
d = p + 'some_file.txt'

и результат, который я хочу:

'C:\\the\\path\\some_file.txt'

но вывод равен \\some_file.txt независимо от значения self.

Я знаю, что могу сделать либо str(self), либо сохранить его как self.path и использовать позже, но почему os.join.path не принимает подкласс str и не вызывает ошибку (например, когда вы используете число или любой другой тип строки)?

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Похоже, что os.path.join использует метод построения в __add__, это можно проверить, поместив оператор печати в метод __add__.

>>> class Path(str):
...     def __add__(self, other):
...             print 'add'
...             return Path(os.path.join(str(self), other))
... 
>>> p = Path(r'/the/path')
>>> p + 'thefile.txt'
add
>>> class Path(str):
...     def __add__(self, other):
...             print 'add'
...             return Path(os.path.join(self, other))
... 
>>> p = Path(r'/the/path')
>>> p + 'file.txt'
add
add
# add printed twice

Самое простое решение: Изменение

return Path(os.path.join(self, other))

до

return Path(os.path.join(str(self), other))

Работает.

0 голосов
/ 08 октября 2011

В случае сомнений проверьте исходный код (Python32 \ Lib \ ntpath.py). Соответствующие биты:

"" "Соедините два или более компонента имени пути, вставив, при необходимости," \ ". Если какой-либо компонент является абсолютным путем, все предыдущие компоненты пути будут отброшены. " "" (выделение добавлено)

В нижней части функции join пытается поместить \ между двумя фигурами, используя path += '\\' + b (где b равно some_file.txt) - что сначала добавляет \ и some_file.txt (которые являются простыми строками), затем добавляет это к Path(r'c:\the\path'), вызывая Path.__add__(r'c:\the\path', r'\some_file.txt'), что будет снова вызывать os.path.join ...

Заметили ли вы теперь ведущий \ в имени файла? Вот почему начальная часть пути теряется.

Вызов os.path.join с str(self) (или self.path) работает, потому что тогда os.path.join вызывается только один раз, а не дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...