2010-05-17 8 views
7

Al perfilar nuestro código que se sorprendió al descubrir millones de llamadas a
C: \ Python26 \ lib \ codificaciones \ utf_8.py: 15 (recepción)¿Puedo desactivar conversiones unicode de Python implícitas para encontrar mis errores de cadenas mixtas?

empecé depuración y encontró que a través de nuestra base de código que hay muchos pequeños errores, generalmente comparando una cadena a unicode o agregando un sting y un unicode. Python decodifica graciosamente las cadenas y realiza las siguientes operaciones en Unicode.

Qué amable. ¡Pero caro!

soy fluido en Unicode, después de haber leído y Joel SpolskyDive Into Python ...

Trato de mantener nuestras partes internas de código sólo en Unicode.

Mi pregunta - ¿Puedo desactivar este comportamiento pitón de chico bueno? Al menos hasta que encuentre todos estos errores y los arregles (usualmente agregando un u'u ')?

Algunos de ellos son extremadamente difíciles de encontrar (una variable que a veces es una cadena ...).

Python 2.6.5 (y no puedo cambiar a 3.x).

Respuesta

10

lo siguiente debe funcionar:

>>> 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) en el fragmento anterior es sólo necesario en este caso ya que normalmente sys.setdefaultencoding se supone que ir en un archivo sitecustomize.py en el directorio de Python site-packages (es recomendable hacer eso).

+0

Oh wow. Lo amo. ¿Puedes explicar un poco más cómo 'reload()' hace su magia? ¿Cómo y por qué anula la configuración 'sitecustomize.py'? – jcdyer

+2

En mi Apple Python 2.6 compilación (pero he visto esto en otro lugar ...) 'site.py' (en su dir de lib de std python; ejecutado una vez automágicamente en el inicio de Python) contiene (cerca del final):' if hasattr (sys, "setdefaultencoding"): del sys.setdefaultencoding'. Esto hace que este atributo no esté disponible en 'sys' a menos que elija explícitamente' recargar (sys) '(o descomente la eliminación). Solía ​​estar disponible directamente en Pythons iirc anterior. – ChristopheD

+1

Muy bueno, ¡gracias! Pydev y Pylint te odian, ¡pero funciona! ... y encontré un camión cargado de "errores" en pocos minutos, ¡algunos de ellos en el código fuente de Python! (No son exactamente errores porque el código funciona, simplemente funciona un poco mejor después de solucionarlo). Archivos CSV: split (u '\ t') necesitaba el pequeño 'u'. Las claves del diccionario no son exactamente unicode en 2.6 ... - ¿quién tendría thunk?!?! ¡Gracias! –

Cuestiones relacionadas