带有str子类的os.path.join

时间:2011-10-07 01:21:44

标签: python string path python-3.x

有人知道为什么os.path.join函数不能用于str的子类吗?

(我在Windows上使用Python3.2 x64和Python2.7 x86,结果相同)

那是我的代码

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 个答案:

答案 0 :(得分:1)

看起来os.path.join使用__add__方法中的构建,可以通过在__add__方法中放置一个print语句来验证。

>>> 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))

有效。

答案 1 :(得分:0)

如有疑问,请查看源代码(Python32 \ Lib \ ntpath.py)。相关位:

“”“加入两个或多个路径名组件,根据需要插入”\“。如果任何组件是绝对路径,则将丢弃所有先前的路径组件。”“”(强调添加)

在功能join的底部尝试使用\path += '\\' + bb)在两个部分之间放置some_file.txt - 首先添加\some_file.txt(简单字符串),然后通过调用Path(r'c:\the\path')将其添加到Path.__add__(r'c:\the\path', r'\some_file.txt')再次调用{ {1}} ...

您是否注意到文件名中的前导os.path.join?这就是道路的最初部分迷失的原因。

使用\(或os.path.join)调用str(self)有效,因为self.path仅被调用一次而不是两次。