Отслеживание неявных преобразований Юникода в Python 2

У меня есть большой проект, где в разных местах использовались неявные неявные преобразования Unicode (приведения) в форме, например:

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)

(Возможно, и другие формы.)

Теперь я хотел бы отследить это использование, особенно в активно используемом коде.

Было бы здорово, если бы я мог легко заменитьunicode конструктор с оберткой, который проверяет, имеет ли тип вводаstr иencoding/errors параметры устанавливаются в значения по умолчанию, а затем уведомляет меня (печатает трассировку или тому подобное).

/редактировать:

Хотя это не имеет прямого отношения к тому, что я ищу, я наткнулся на этот великолепно ужасный хак о том, как заставить исключение декодирования вообще исчезнуть (только одно декодирование, т.е.str вunicodeно не наоборотhttps://mail.python.org/pipermail/python-list/2012-July/627506.html).

Я не планирую его использовать, но это может быть интересно для тех, кто борется с ошибками ввода Unicode и ищет быстрое решение (но, пожалуйста, подумайте о побочных эффектах):

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

(Интернет-поиск дляcodecs.register_error("strict" показал, что, видимо, он используется в некоторых реальных проектах.)

/ редактировать № 2:

Для явных преобразований я сделал фрагмент с помощьюТАК пост на обезьянье патчинг:

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

Это влияет только на явные преобразования с использованиемunicode() конструктор напрямую, так что это не то, что мне нужно.

/ редактировать № 3:

Нить "Метод расширения для встроенных типов Python!msgstr "заставляет меня думать, что это на самом деле не может быть легко возможно (по крайней мере, в CPython).

/ редактировать № 4:

Приятно видеть здесь много хороших ответов, жаль, что я могу дать награду только один раз.

Тем временем я натолкнулся на несколько похожий вопрос, по крайней мере, в том смысле, в котором человек пытался достичь:Могу ли я отключить неявные преобразования Unicode в Python, чтобы найти ошибки в смешанных строках? Пожалуйста, обратите внимание, что это исключение будетне было хорошо в моем случае. Здесь я искал что-то, что могло бы указать мне на различные места проблемного кода (например, путем печати чего-либо), но не на то, что могло бы выйти из программы или изменить ее поведение (потому что таким образом я могу расставить приоритеты, что нужно исправить).

С другой стороны, люди, работающие над проектом Mypy (включая Гвидо ван Россума), могут также предложить что-то подобное в будущем, см. Обсуждения наhttps://github.com/python/mypy/issues/1141 и совсем недавноhttps://github.com/python/typing/issues/208.

/ edit № 5

Я также сталкивался со следующим, но у меня еще не было времени проверить это:https://pypi.python.org/pypi/unicode-nazi

Ответы на вопрос(4)

Ваш ответ на вопрос