python i locale

Jacek Konieczny jajcus w bnet.pl
Pon, 3 Lis 2003, 19:10:43 CET


On Mon, Nov 03, 2003 at 05:16:37PM +0100, wrobell wrote:
> Odnośnie python-default_encoding.patch.
> 
> W C jest tak, że program używa locale, gdy zostanie użyta funkcja
> setlocale(""). Powyższy patch zmienia to.

Niezupełnie. Zmienia tylko domyślne kodowanie używane w niejawnej
konwersji z UnicodeType do StringType. Domyślnie używane jest
"us-ascii", a gdy łańcuch wejściowy zawiera znaki spoza tego zakresu
generowany jest wyjątego UnicodeError. To jest celowe zachowanie i
byłoby nawet właściwe, bo każda aplikacja powinna jawnie konwertować
stringi do właściwego kodowania, jednak jest masa błędynch programów
pythonowych, które przy domyślnej konfiguracji po prostu się na polskich
znaczkach wywalają.

Na początku uważałem domyślne zachowanie pythona za złe - dlatego
zrobiłem ten patch. Potem zrozumiałem jaki jest sens domyślnego
zachowania, ale uznałem, że warto patcha zachować - nie psuje on dobrze
działających programów, a pozwala uniknąć przykrych niespodzianek w
przypadku programów błędnych. Ostatnio jednak zastanawiam się, czy
jednak go nie wywalić. Dla użytkownika może być czasem przydatny, ale
przy pracy developera maskuje błędy w aplikacji. Więc może jednak go
usunąć?

Jest jeszcze jedna sprawa - czemu patch w globalnym site.py, a nie po
prostu analogiczna linijka w wadliwych programach zaraz po setlocale -
dlatego, że po wykonaniu site.py domyślnego kodowania nie da się już
zmienić - odpowiednia funkcja jest usuwana. Czyli albo w site.py, albo
nigdzie. Właściwa poprawka wadliwych programów, to używanie wszędzie
jawnych konwersji, jednak nie jest to proste, gdyż trudno znaleźć w
kodzie wszystkie miejsca gdzie występuje niejawna konwersja.
 
> Nie powinno być z Pythonem tak jak w przypadku języka C?

Powinno być. Jednak w C domyślnie nie ma obsługi unicodu którą by wiele
programów źle używało.

Pozdrowienia,
        Jacek



Więcej informacji o liście dyskusyjnej pld-devel-pl