str.isdigit() не работает в python

Я работаю над проверкой пароля, которая проверяет, является ли строка действительным паролем. Я должен проверить, если есть по крайней мере восемь символов, должны состоять только из букв и цифр, а последние два символа должны быть цифрами.

Кажется, что все работает, кроме password.isdigit(), иногда пароль выходит действительным, а иногда нет. Какие-либо предложения?

# Gets the users password
password = input('Enter a string for password: ')
# Splices the last two characters of the password
lastTwo = password[-2:]

# Checks the password if it is less than 8 characters
while len(password) < 8:
    print('The password you entered is too short.')
    print()
    password = input('Enter a string for password: ')

    # Checks the password if it is composed of letters and numbers
    while password.isalnum() == False:
        print('Your password has special characters not allowed.')
        print()
        password = input('Enter a string for password: ')

    # Checks the spice to verify they are digits
    while lastTwo.isdigit() == False:
        print('Your last two characters of your password must be digits.')
        print()
        password = input('Enter a string for password: ')

print('Your password is valid.')

2 ответа

Решение

Есть несколько проблем с предоставленным кодом. В частности, вы проверяете только следующие правила while len(password) < 8, Если вы дадите ему пароль длиной 10, правила никогда не проверяются. Кроме того, вы не обновляете lastTwo при каждой попытке нового пароля

Один из способов исправить это - заменить несколько while заявления с if...elif..elif...else... завернутый в общий while утверждение, следующее:

# Gets the users password
password = input('Enter a string for password: ')

while True:
    # Checks the password if it is less than 8 characters
    if len(password) < 8:
        print('The password you entered is too short.')
    # Checks the password if it is composed of letters and numbers
    elif not password.isalnum():
        print('Your password has special characters not allowed.')
    # Checks the spice to verify they are digits
    elif not password[:-2].isdigit():
        print('Your last two characters of your password must be digits.')
    else:
        # we only get here when all rules are True
        break

    print()
    password = input('Enter a string for password: ')

print('Your password is valid.')

Это должно работать так, как вы хотели. Но в то время как мы находимся в этом, почему бы не сказать пользователю каждое правило, его пароль сломался? С точки зрения пользовательского интерфейса, это помогает держать пользователя в курсе.

Если мы храним информационное сообщение вместе с тем, было ли соблюдено соответствующее правило, мы можем быстро обработать все нарушенные правила, например:

valid_password = False

while not valid_password:
    # Get a password
    password = input('\nEnter a string for password: ')
    # applies all checks
    checks = {
        '- end in two digits': password[-2].isdigit(),
        '- not contain any special characters': password.isalnum(),
        '- be over 8 characters long': len(password) > 8
    }
    # if all values in the dictionary are true, the password is valid.
    if all(checks.values()):
        valid_password = True
    # otherwise, return the rules violated
    else:
        print('This password is not valid. Passwords must:\n{}'.format(
            '\n'.join([k for k, v in checks.items() if not v])))

print('Your password is valid.')

Вы никогда не обновляете свою ценность lastTwo внутри вашего цикла Таким образом, представьте, если пользователь впервые ввел пароль abc123, затем lastTwo будет рассчитываться как 23,

Теперь ваш код обнаружит, что пароль слишком короткий и запросит у пользователя новый пароль. Предположим, он входит abcdefgh, Это теперь проходит ваши первые и вторые проверки. Обратите внимание, что lastTwo все еще 23и, таким образом, ваша третья проверка будет неверно пройдена.

Таким образом, вы должны пересчитать значение lastTwo всякий раз, когда вы принимаете новый пароль или проверяете прямо так:

while (password[-2:]).isdigit() == False:

Другие вопросы по тегам