The C standard defines the locale as a program-wide property that may be relatively expensive to change. On top of that, some implementation are broken in such a way that frequent locale changes may cause core dumps. This makes the locale somewhat painful to use correctly.
Initially, when a program is started, the locale is the "C" locale, no matter what the user's preferred locale is. The program must explicitly say that it wants the user's preferred locale settings by calling setlocale(LC_ALL, "").
It is generally a bad idea to call setlocale() in some library routine, since as a side effect it affects the entire program. Saving and restoring it is almost as bad: it is expensive and affects other threads that happen to run before the settings have been restored.
If, when coding a module for general use, you need a locale independent version of an operation that is affected by the locale (e.g. string.lower(), or certain formats used with time.strftime())), you will have to find a way to do it without using the standard library routine. Even better is convincing yourself that using locale settings is okay. Only as a last resort should you document that your module is not compatible with non-"C" locale settings.
The case conversion functions in the string and strop modules are affected by the locale settings. When a call to the setlocale() function changes the LC_CTYPE settings, the variables string.lowercase, string.uppercase and string.letters (and their counterparts in strop) are recalculated. Note that this code that uses these variable through `from ... import ...', e.g. from string import letters, is not affected by subsequent setlocale() calls.
The only way to perform numeric operations according to the locale is to use the special functions defined by this module: atof(), atoi(), format(), str().
guido@python.org