Отслеживание неявных преобразований Юникода в 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