Eryk Sun <eryk...@gmail.com> added the comment:

> I mean,os.path.join('3', '{:3')  return  '{:3' in windows, However, 
> os.path.join('3', '{:3') return  '3/{:3'in linux, output result not 
> '3' in windows, why?

The implementation of ntpath.join handles "{:" as a drive. Thus "{:3" is a 
drive-relative path, i.e. "3" is relative to the current working directory on 
drive "{:". 

In particular, for each joined component, ntpath.join calls ntpath.splitdrive, 
which splits at the second character if it's a colon, regardless of the first 
character. For example:

    >>> ntpath.splitdrive('{:3')
    ('{:', '3')

As demonstrated in my previous post, the Windows file API supports drive names 
that use any basic multilingual plane (BMP) character, including symbol 
characters such as "{". So the long-standing behavior of ntpath.splitdrive in 
this regard is generally right. Except it shouldn't allow the first character 
to be a path separator, i.e. the following result is nonsense:

    >>> ntpath.splitdrive('/:/spam')
    ('/:', '/spam')

> with path '{:3' you open file with name '3' in the current 
> directory of drive '{'

The drive name would be "{:", not "{". It's a common usage, for example, to 
call "C:" the "C" drive, but the drive name actually includes the colon. This 
differs from the usage of colon in file streams, in which the colon is a 
delimiter that's not part of the name.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue41565>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to