2014-06-01 4 views
0

Я написал пароль для проверки безопасности пароля. Существует три функции для проверки безопасности и возврата значения, слабый, средний и сильный. Я называю эти функции здесь:Проверка пароля не возвращается true

if check_pass_strength_weak(password): 
      print "Weak" 
     elif check_pass_strength_medium(password): 
      print "Medium" 
     elif check_pass_strength_strong(password): 
      print "Strong"" 

, но сильный никогда не возвращается. Вот функция.

def check_pass_strength_strong(password): 
    upper_count = 0 
    lower_count = 0 
    number_count = 0 
    for letter in password: 
     if letter == letter.upper(): 
      upper_count = upper_count + 1 
     elif letter == letter.lower(): 
      lower_count = lower_count + 1 
     elif letter.isalpha(): 
      number_count = number_count + 1 

    if upper_count > 0 and lower_count > 0 and number_count > 0: 
     return True 
+0

вы should'nt отступ Элифа заявление – EL3PHANTEN

+0

Вы не предоставили другие методы, но это, вероятно, потому, что ваша логика имеет значение, что «пароль силен => пароль средний» и «пароль сильный => пароль слабый». Таким образом, ваши первые методы также возвращают 'true' для надежного пароля, а дополнительные условия не проверяются. – BartoszKP

+1

Возможно, ваша среда всегда возвращает true. Это может быть проще, если вместо трех функций у вас есть одна функция, которая возвращает силу пароля. – Nate

ответ

0

Ваша проблема в том, что:

'1' == '1'.upper() 

так что остальная часть вашего elif никогда не запускать и number_count никогда не увеличивается. Отразить его вокруг:

if letter.isdigit(): 
    ... 
elif ... 

Или, лучше, на самом деле использовать в Python str methods, и не забудьте return False:

def check_pass_strength_strong(password): 
    upper_count = 0 
    lower_count = 0 
    number_count = 0 
    for letter in password: 
     if letter.isdigit(): 
      number_count += 1 
     elif letter.isupper(): 
      upper_count += 1 
     elif letter.islower(): 
      lower_count += 1 
    if upper_count > 0 and lower_count > 0 and number_count > 0: 
     return True 
    return False 

В самом деле, как вы проверяете несколько уровней, вы можете вынесем Счета:

def count_char_types(password): 
    lower_count = upper_count = number_count = 0 
    for letter in password: 
     if letter.isdigit(): 
      number_count += 1 
     elif letter.isupper(): 
      upper_count += 1 
     elif letter.islower(): 
      lower_count += 1 
    return lower_count, upper_count, number_count 

затем осуществить, например,

def check_pass_strength_strong(password): 
    l, u, n = count_char_types(password) 
    return l > 0 and u > 0 and n > 0 

и рассмотреть возможность добавления symbol_count!

+0

Спасибо, это сработало. – Mattbettinson

+0

http://stackoverflow.com/help/someone-answers – jonrsharpe

0

Ваш код нуждается в двух исправлениях. Во-первых, как указано jonrsharpe в his answer, '1' == '1'.upper(), поэтому вы не считаете числа. Вы должны проверить это первый:

if letter.isdigit(): 
    #... 
elif #upper/lower conditions 

И вы, вероятно, хотите отменить свои условия прочности пароля:

if check_pass_strength_strong(password): 
    print "Strong" 
elif check_pass_strength_medium(password): 
    print "Mediu" 
elif check_pass_strength_weak(password): 
    print "Weak" 
0

Что об использовании регулярных выражений для проверки цифр/верхний регистр/нижний регистр символов?

например:

def check_pass_strength_strong(password): 
    return all((re.findall(r'[A-Z]', password), 
       re.findall(r'[a-z]', password), 
       re.findall(r'[0-9]', password))) 
Смежные вопросы