[Python-Dev] os.path.normcase rationale?

Chris Withers chris at simplistix.co.uk
Fri Oct 8 10:41:50 CEST 2010

On 05/10/2010 12:04, Steven D'Aprano wrote:
> On Tue, 5 Oct 2010 07:21:15 pm Chris Withers wrote:
>> On 25/09/2010 04:25, Steven D'Aprano wrote:
>>> 1. Return the case of a filename in some canonical form which
>>> depends on the file system?
>>> 2. Return the case of a filename as it is actually stored on disk?
>> How do 1 and 2 differ?
> Case #1 imposes a particular canonical form, regardless of what is
> actually stored on disk. It is similar to normpath, except that we
> could have different canonical forms depending on what the file system
> was. normpath merely generalises from the operating system, and never
> looks at the file system.

Ah, okay, yeah, that's actually an anti-goal for me ;-)

> Case #2 says to actually look at the file and see what the file system
> considers it's name to be. Consider a NTFS file system. By default it
> is case-preserving and case-insensitive, although that can be changed.
> (Just because a file system is NTFS doesn't mean that will be
> case-insensitive. NTFS can also run in a POSIX mode which is
> case-sensitive. But I digress.)

Yeah, this is definitely where I think the missing use case lies...

>> FWIW, the use case that setuptools has (and
>> for which it currently incorrectly uses normpath) is number 2.
>>> 4. Return the case of a filename in some arbitrarily-chosen
>>> canonical form which does not depend on the file system?
>> This is what normpath does, but only if you're on Windows ;-)
> Not quite. macpath.normcase() also lowercases the path. So does the
> module for OS/2.

Interesting, since I develop on MacOS, Linux and Windows and only 
experienced the problem caused by setuptools normcase'ing distribution 
names on Windows. The MacOS case also isn't in the docs.

> In any case, Windows is not a file system. It is quite possible to have
> virtually any combination of case-destroying, case-preserving,
> -sensitive and -insensitive file systems on the one Windows system. Say,
> a FAT12 floppy, an NTFS partition, and an ext2 USB stick. Windows
> doesn't ship with native support for ext2, but that doesn't mean it
> can't be installed with third party drivers.

yes, exactly!

> normpath pays no attention to any of this, and just lowercases the path.
> At least that's cheap, and consistent, even if it solves the wrong
> problem :)

...and creates a few more along the way ;-)


Simplistix - Content Management, Batch Processing & Python Consulting
             - http://www.simplistix.co.uk

More information about the Python-Dev mailing list