Eu sugiro usar bpython-curses
se você precisar desse comportamento, porque (como você notou) o front-end padrão do bpython não lida com isso corretamente. Você está aproximadamente correto em sua explicação: o bpython está registrando a saída para um sys.stdout falso e, em seguida, tentando adivinhar como processá-lo. Sua suposição é muito ingênua e, embora represente um número limitado de sequências de escape de formatação de terminal, ela não leva em conta retornos de carro. O cursor é movido para uma linha no terminal e essa linha calculada de saída é gravada, resultando no que você vê.