Rastreando conversiones implícitas de Unicode en Python 2

Tengo un gran proyecto donde en varios lugares se usaron conversiones Unicode implícitas problemáticas (coersiones) en forma de, por ejemplo:

someDynamicStr = "bar" # could come from various sources

# works
u"foo" + someDynamicStr
u"foo{}".format(someDynamicStr)

someDynamicStr = "\xff" # uh-oh

# raises UnicodeDecodeError
u"foo" + someDynamicStr
u"foo{}".format(someDynamicStr)

(Posiblemente otras formas también).

Ahora me gustaría rastrear esos usos, especialmente aquellos en código utilizado activamente.

Sería genial si pudiera reemplazar fácilmente elunicode constructor con un contenedor que verifica si la entrada es de tipostr y elencoding/errors los parámetros se establecen en los valores predeterminados y luego me notifica (imprime el rastreo o similar).

/editar:

Si bien no está directamente relacionado con lo que estoy buscando, me encontré con este truco gloriosamente horrible sobre cómo hacer que la excepción de decodificación desaparezca por completo (solo la decodificación, es decir,str aunicode, pero no al revés, verhttps://mail.python.org/pipermail/python-list/2012-July/627506.html)

No planeo usarlo, pero podría ser interesante para esos problemas de lucha con una entrada Unicode no válida y en busca de una solución rápida (pero piense en los efectos secundarios):

import codecs
codecs.register_error("strict", codecs.ignore_errors)
codecs.register_error("strict", lambda x: (u"", x.end)) # alternatively

(Una búsqueda en internet paracodecs.register_error("strict" reveló que aparentemente se usa en algunos proyectos reales).

/ editar # 2:

Para conversiones explícitas, hice un fragmento con la ayuda deuna publicación SO en monkeypatching:

class PatchedUnicode(unicode):
  def __init__(self, obj=None, encoding=None, *args, **kwargs):
    if encoding in (None, "ascii", "646", "us-ascii"):
        print("Problematic unicode() usage detected!")
    super(PatchedUnicode, self).__init__(obj, encoding, *args, **kwargs)

import __builtin__
__builtin__.unicode = PatchedUnicode

Esto solo afecta a las conversiones explícitas utilizando elunicode() constructor directamente, así que no es algo que necesito.

/ editar # 3:

La amenaza "¡Método de extensión para los tipos incorporados de Python!"me hace pensar que en realidad podría no ser fácilmente posible (al menos en CPython).

/ editar # 4:

Es bueno ver muchas buenas respuestas aquí, lástima que solo pueda dar la recompensa una vez.

Mientras tanto, me encontré con una pregunta algo similar, al menos en el sentido de lo que la persona intentó lograr:¿Puedo desactivar las conversiones implícitas Unicode de Python para encontrar mis errores de cadenas mixtas? Sin embargo, tenga en cuenta que lanzar una excepciónno He estado bien en mi caso. Aquí estaba buscando algo que pudiera indicarme las diferentes ubicaciones del código problemático (por ejemplo, imprimiendo algo) pero no algo que pudiera salir del programa o cambiar su comportamiento (porque de esta manera puedo priorizar qué arreglar).

En otra nota, las personas que trabajan en el proyecto Mypy (que incluye a Guido van Rossum) también podrían encontrar algo similar útil en el futuro, ver las discusiones enhttps://github.com/python/mypy/issues/1141 y más recientementehttps://github.com/python/typing/issues/208.

/ edit # 5

También me encontré con lo siguiente, pero aún no tenía tiempo para probarlo:https://pypi.python.org/pypi/unicode-nazi