2010-05-17 8 views
7

Podczas profilowania kodu Byłem zaskoczony, aby znaleźć miliony wezwań do
C: \ Python26 \ lib \ kodowania \ utf_8.py: 15 (dekodowania)Czy mogę wyłączyć niejawne konwersje Unicode w Pythonie, aby znaleźć błędy w mieszanych łańcuchach?

zacząłem debugowanie i okazało się, że w całej naszej bazie kodu istnieją wiele drobnych błędów, zazwyczaj porównywanie napisów do unikodu lub dodawanie żądań i unikodu. Python łaskawie dekoduje łańcuchy i wykonuje następujące operacje w unicode.

Jak miło. Ale drogi!

jestem biegły w Unicode, po przeczytaniu Joel Spolsky i Dive Into Python ...

staram się utrzymać nasze wewnętrzne kodu tylko w Unicode.

Moje pytanie - czy mogę wyłączyć to pytone zachowanie miłego faceta? Przynajmniej dopóki nie znajdę tych wszystkich błędów i nie naprawię ich (zazwyczaj przez dodanie "u'u")?

Niektóre z nich są niezwykle trudne do znalezienia (zmienna, która jest czasem ciąg ...).

Python 2.6.5 (i nie mogę zmienić na 3.x).

Odpowiedz

10

Poniższa powinno działać:

>>> import sys 
>>> reload(sys) 
<module 'sys' (built-in)> 
>>> sys.setdefaultencoding('undefined') 
>>> u"abc" + u"xyz" 
u'abcxyz' 
>>> u"abc" + "xyz" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/undefined.py", line 22, in decode 
    raise UnicodeError("undefined encoding") 
UnicodeError: undefined encoding 

reload(sys) we fragmencie powyżej jest konieczne tylko tutaj, ponieważ normalnie sys.setdefaultencoding ma iść w pliku sitecustomize.py w Pythonie site-packages katalogu (jest to wskazane, aby to zrobić).

+0

Oh wow. Kocham to. Czy możesz wyjaśnić nieco więcej, jak 'reload()' robi swoją magię? W jaki sposób i dlaczego niweluje ustawienie 'sitecustomize.py'? – jcdyer

+2

W mojej kompilacji Apple Python 2.6 (ale widziałem to gdzie indziej ...) 'site.py' (w twoim std python lib dir; wykonywane raz automagicznie przy starcie Pythona) zawiera (pod koniec):' if hasattr (sys, "setdefaultencoding"): del sys.setdefaultencoding'. To sprawia, że ​​ten atrybut jest niedostępny w 'sys', chyba że wyraźnie wybierzesz' reload (sys) '(lub odkomentuj usuwanie). Kiedyś był dostępny bezpośrednio we wcześniejszych wersjach Pythona iirc. – ChristopheD

+1

Bardzo fajnie - dziękuję! Pydev i Pylint cię nienawidzą, ale działa! ... i znalazłem ciężarówkę "błędów" w kilka minut, niektóre z nich w kodzie źródłowym Pythona! (Nie są to dokładnie błędy, ponieważ kod działa, po poprawieniu działa trochę lepiej). Pliki CSV: split (u '\ t') potrzebowały małego "u". Klucze do słownika nie są dokładnie Unicode w 2.6 ... - którzy mieliby thunk?!?! Dziękujemy! –

Powiązane problemy