erfolgen impliziter Unicode-Konvertierungen in Python

Ich habe ein großes Projekt, in dem an verschiedenen Stellen problematische implizite Unicode-Konvertierungen (Coersions) in Form von

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)

(Möglicherweise auch andere Formen.)

Jetzt möchte ich diese Verwendungen aufspüren, insbesondere die in aktiv verwendetem Code.

s wäre großartig, wenn ich das @ leicht ersetzen könnunicode -Konstruktor mit einem Wrapper, der prüft, ob die Eingabe vom Typ @ istr und dieencoding/errors -Parameter werden auf die Standardwerte gesetzt und benachrichtigen mich dann (gibt Traceback oder ähnliches aus).

/bearbeiten

Während ich keinen direkten Bezug zu dem habe, wonach ich suche, bin ich auf diesen herrlich schrecklichen Hack gestoßen, um die Dekodierungsausnahme vollständig zu beseitigen (nur die Dekodierungsausnahme, d. H.str zuunicode, aber nicht umgekehrt, siehehttps: //mail.python.org/pipermail/python-list/2012-July/627506.htm).

Ich habe nicht vor, es zu verwenden, aber es könnte für diejenigen interessant sein, die Probleme mit ungültigen Unicode-Eingaben haben und nach einer schnellen Lösung suchen (aber denken Sie bitte über die Nebenwirkungen nach):

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

(Eine Internetsuche nachcodecs.register_error("strict" offenbarte, dass es anscheinend in einigen realen Projekten verwendet wird.)

/ edit # 2:

Für explizite Konvertierungen habe ich mit Hilfe von @ ein Snippet erstela SO Post auf 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

Dies betrifft nur explizite Konvertierungen mit demunicode() Konstruktor direkt so ist es nicht etwas, was ich brauche.

/ edit # 3:

Der Faden "Erweiterungsmethode für in Python integrierte Typen! "lässt mich denken, dass dies möglicherweise nicht einfach möglich ist (zumindest in CPython).

/ edit # 4:

Es ist schön, hier viele gute Antworten zu sehen, schade, dass ich das Kopfgeld nur einmal ausgeben kann.

In der Zwischenzeit bin ich auf eine ähnliche Frage gestoßen, zumindest im Sinne dessen, was die Person zu erreichen versuchte:Kann ich implizite Python-Unicode-Konvertierungen deaktivieren, um meine Mixed-Strings-Fehler zu finden? Bitte beachten Sie jedoch, dass das Auslösen einer Ausnahmenich war in meinem Fall in Ordnung. Hier habe ich nach etwas gesucht, das mich auf die verschiedenen Stellen mit problematischem Code hinweisen könnte (z. B. durch Drucken von smth.), Aber nicht nach etwas, das das Programm beenden oder sein Verhalten ändern könnte (da ich auf diese Weise Prioritäten setzen kann, was behoben werden soll).

Eine andere Anmerkung: Die Mitarbeiter des Mypy-Projekts (zu denen auch Guido van Rossum gehört) könnten sich in Zukunft etwas Ähnliches einfallen lassen. Weitere Informationen finden Sie in den Diskussionen unterhttps: //github.com/python/mypy/issues/114 und in jüngerer Zeithttps: //github.com/python/typing/issues/20.

/ edit # 5

Ich bin auch auf Folgendes gestoßen, hatte aber noch keine Zeit, es zu testen:https: //pypi.python.org/pypi/unicode-naz

Antworten auf die Frage(8)

Ihre Antwort auf die Frage