Ошибка в коде генерации пароля. Просьба помочь найти причину, дать пояснение

Проблема: код ниже выдает невалидный пароль. Просьба подсказать причину, пояснить, как сделать правильно. Буду рад любой помощи. Приведенный код близок к минимально необходимому к воспроизведению проблемы.

Исходная задача: написать функцию get_password, которая сгенерирует нам случайный надежный пароль и вернет его. Алгоритм простой — мы генерируем пароль с помощью функции get_random_password и, если он проходит надежность проверкой функцией is_valid_password, возвращаем его, если нет — повторяем итерацию снова.

    from random import randint
      
    
    def get_random_password():
        result = ""
        count = 0
        while count < 8:
            random_symbol = chr(randint(40, 126))
            result = result + random_symbol
            count = count + 1
        return result


    def is_valid_password(password):
        has_upper = False
        has_lower = False
        has_num = False
        for ch in password:
            if "A" <= ch <= "Z":
                has_upper = True
            elif "a" <= ch <= "z":
                has_lower = True
            elif "0" <= ch <= "9":
                has_num = True
        if len(password) == 8 and has_upper and has_lower and has_num:
            return True
        return False


    def get_password():    
        count = 0
        while count < 10:
            if is_valid_password(get_random_password()) == True:
                return (get_random_password())                
            else:
                pass
            count += 1

Ответы (1 шт):

Автор решения: Сергей

Ниже - ваша функция с ошибкой, переделанная под отладочную печать. Все сложные строки разбиты на части, результаты распечатываются. Вы сможете увидеть из печати, что temp_pass_1 оказывается не равен temp_pass_2, и из этого понятно, в чём дело. Теперь можно убрать все временные переменные и переделать программу, как показано во второй части.

Можно и не использовать отладочную печать, а (лучше!) поставить PyCharm и запускать программу Shift+F9, поставив слева красную точку щелчком мыши на каждой подозрительной строке. Далее, нажимая F8, вы сможете идти по шагам и видеть значения переменных прямо в тексте кода (поищите видео по PyChаrm, если короткое пояснение не очень понятно).

Еще оптимальнее просто в голове прокручивать, как всё должно быть, глядя на код, но это умение придёт со временем.

def get_password():
    count = 0
    while count < 10:
        temp_pass_1 = get_random_password()
        print (temp_pass_1)
        if is_valid_password(temp_pass_1) == True:
            temp_pass_2 = get_random_password()
            print(temp_pass_2)
            return (temp_pass_2)
        else:
            pass
        count += 1

relaible_password = get_password()
print (relaible_password)

Исправленный код в результате такой отладки:

def get_password():
    count = 0
    while count < 10:
        # Убрали ошибку: ввели переменную, чтобы не изменялось значение
        random_password = get_random_password()
        # Улучшили: равенство True проверяется по умолчанию,так что убрали конец строки
        if is_valid_password(random_password):
            return (random_password)
        else:
            pass
        count += 1
→ Ссылка