(original) (raw)

imp.cache_from_source() (and thus also imp.source_from_cache()) has special semantics compared to how os.path.join() works. For instance, if you look at test_imp you will notice it tries to use the same path separator as is the farthest right in the path it is given::


self.assertEqual(imp.cache_from_source('\\foo\\bar/baz/qux.py', True), '\\foo\\bar\\baz/__pycache__/qux.{}.pyc'.format(self.tag))

But if you do the same basic operation using ntpath, you will notice it simply doesn't care::


>>> ntpath.join(ntpath.split('a\\\\b/c/d.py')\[0\], '\_\_pycache\_\_', 'd.cpython-32.pyc')
'a\\\\b/c\\\\\_\_pycache\_\_\\\\d.cpython-32.pyc

Basically imp.cache\_from\_source() goes to a bunch of effort to reuse the farthest right separator when there is an alternative separator \*before\* and path splitting is done. But if you look at ntpath.join(), it doesn't even attempt that much effort.

Now that we can reuse os.path.join() (directly for source\_from\_cache(), indirectly through easy algorithmic copying in cache\_from\_source()) do we want to keep the "special" semantics, or can I change it to match what ntpath would do when there can be more than one path separator on an OS (i.e. not do anything special)?