2011-10-07 38 views
5

Có ai biết tại sao hàm os.path.join không hoạt động với các lớp con của str?os.path.join với str subclass

(Tôi đang sử dụng Python3.2 x64 và x86 Python2.7 trên Windows và kết quả là như nhau)

Đó là đoạn code tôi có

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' 

và kết quả tôi muốn:

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

nhưng đầu ra là \\some_file.txt bất kể giá trị của self.

Tôi biết tôi có thể thực hiện str(self) hoặc lưu trữ self.path và sử dụng sau, nhưng tại sao os.join.path không chấp nhận phân lớp str cũng không tăng lỗi (như khi bạn sử dụng một số hoặc bất kỳ loại chuỗi nào)?

Trả lời

0

Khi nghi ngờ, hãy kiểm tra nguồn (Python32 \ Lib \ ntpath.py). bit có liên quan:

"" "Tham gia hai hoặc nhiều thành phần tên đường dẫn, chèn '\' khi cần thiết Nếu bất kỳ thành phần là một đường dẫn tuyệt đối, tất cả các thành phần con đường trước đó sẽ bị loại bỏ.. ''" (nhấn mạnh thêm)

Hướng tới phía dưới của hàm join đang cố gắng đặt một \ giữa hai miếng sử dụng path += '\\' + b (nơi bsome_file.txt) - lần đầu tiên cho biết thêm \some_file.txt (mà là chuỗi đồng bằng), sau đó nói thêm rằng để Path(r'c:\the\path') bằng cách gọi Path.__add__(r'c:\the\path', r'\some_file.txt'), sẽ lần nữa gọi os.path.join ...

Bạn có nhận thấy \ hàng đầu hiện có trên tên tệp không? Đó là lý do tại sao phần đầu của con đường bị lạc.

Gọi os.path.join với str(self) (hoặc self.path) hoạt động vì sau đó os.path.join chỉ được gọi một lần thay vì hai lần.

1

Có vẻ như os.path.join sử dụng phương pháp xây dựng theo phương pháp __add__, điều này có thể được xác minh bằng cách đặt câu lệnh in theo phương thức __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 

giải pháp đơn giản nhất: Thay đổi

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

để

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

Nó hoạt động.

+1

Vâng, đó là những gì tôi vừa viết trong câu hỏi của tôi ... Tôi muốn biết nếu đó là một lỗi hoặc thực hiện CPython hoặc cái gì khác. BTW 'isinstance' sẽ trả về True trong trường hợp này – JBernardo

+0

Vâng, bạn đã đúng. Nó phải có 'string .__ class __.__ name__ == 'str'' –

+0

Không, trình thông dịch sẽ không kiểm tra chuỗi đó bởi vì tôi có thể thay đổi nó bất cứ lúc nào ... – JBernardo

Các vấn đề liên quan