Некорректная работа python скрипта
Решил написать небольшой скрипт по типу заполнения анкеты и что-то типа регистрации. Суть в том, что я не могу проверить данные которые внесены в usr__login (вносятся через input в функции reg). Т. е., я могу их вывести обычным print(), но при этом, при проверке через if, программа как будто не видит данные в usr__login.
UPD: Я думаю, что ошибка в функции login. Сижу, ищу ошибку.. Но так и не могу найти ее..
import colorama
usr__login = None
usr__pass = None
#auth form
def login():
log__row = input("Enter your login: ")
if log__row != usr__login :
print("Wrong login! Try again.")
return login()
elif log__row == usr__login :
pass_row = input("Enter your password: ")
if pass__row != usr__pass:
print("Wrogn password! Try again.")
return
elif pass__row == usr__pass:
print("Authorization is successful!")
#reg form
def reg():
usr__login = input("Login: ")
if len(usr__login) < 8 :
print("Your login's so short, try again..")
return reg()
elif len(usr__login) >= 8:
usr__pass = input("Password: ")
if len(usr__pass) < 8:
print("Your password's so short, try again..")
usr__pass = input("Password: ")
elif len(usr__pass) >= 8:
print("Good! Your account has be created.")
return login()
def start():
start_a = input("Do you have an account? Yes(Y)/No(N)")
if start_a == "Y":
login()
else:
reg()
start()
Ответы (3 шт):
Откуда эта порочная практика использовать две подряд подчеркушки в названии переменных???
Вот тут:
pass_row = input("Enter your password: ")
одна подчеркушка в pass_row
а вот тут:
pass__row != usr__pass:
уже две.
Для начала исправьте эти ошибки.
def reg():
usr__login = input("Login: ")
Это у вас локальная переменная, не имеющая никакого отношения к глобальной переменной с тем же именем. После выполнения функции reg() у вас данные, занесённые в локальные переменные этой функции usr__login и usr__pass никуда потом не передаются. Когда вы из этой функции вызываете потом login(), она не видит этих переменных, она видит глобальные, которые по-прежнему пустые. Исправить можно так, но по-хорошему "у вас тут всю систему менять надо":
def reg():
global usr__login, usr__pass
Почему функция login видит глобальные переменные, а reg - локальные? Потому что login только читает эти переменные, а reg их записывает. Если переменные записываются, то без объявления их через global они считаются локальными. А если вы только читаете переменные, то они считаются глобальными по умолчанию в питоне.
По-хорошему же вам нужно:
- не использовать глобальные переменные, лучше используйте вызов функций с параметрами и возврат результатов работы функции через
return, а если лениво это всё, то хотя бы внесите эти функции в некий класс, пусть у них будут общие переменные экземпляра класса, это всё-равно лучше, чем глобальные переменные - не использовать рекурсию, там где можно обойтись циклом, например,
while True:с выходом из цикла поbreakилиreturn, рано или поздно у вас будет задача, где рекурсия войдёт на слишком большую глубину и тогда интерпретатор питона просто вылетит по ошибке и это толком никак не лечится, лучше рекурсию учиться сразу никогда не использовать
Есть два способа решения вашей проблемы:
- Самый простой - сделать переменные глобальными, то есть в начале функций
login(),reg()иstart()надо вписать такую строчкуglobal usr__pass, usr__login
Готовый код с глобальными переменными:
import colorama
usr__login = None
usr__pass = None
#auth form
def login():
global usr__pass, usr__login
log__row = input("Enter your login: ")
if log__row != usr__login :
print("Wrong login! Try again.")
return login()
elif log__row == usr__login :
pass__row = input("Enter your password: ")
if pass__row != usr__pass:
print("Wrogn password! Try again.")
return
elif pass__row == usr__pass:
print("Authorization is successful!")
#reg form
def reg():
global usr__pass, usr__login
usr__login = input("Login: ")
if len(usr__login) < 8 :
print("Your login's so short, try again..")
return reg()
elif len(usr__login) >= 8:
usr__pass = input("Password: ")
if len(usr__pass) < 8:
print("Your password's so short, try again..")
return reg()
elif len(usr__pass) >= 8:
print("Good! Your account has be created.")
return login()
def start():
global usr__pass, usr__login
start_a = input("Do you have an account? Yes(Y)/No(N)")
if start_a.lower() == "y":
login()
else:
reg()
start()
- Передавать переменные в аргументе функции
return login(usr__login, usr__pass), и в самой функции забирать аргументыdef login(usr__pass, usr__login):
Готовый код с передачей аргумента:
import colorama
usr__login = None
usr__pass = None
#auth form
def login(usr__pass, usr__login):
log__row = input("Enter your login: ")
if log__row != usr__login :
print("Wrong login! Try again.")
return login()
elif log__row == usr__login :
pass__row = input("Enter your password: ")
if pass__row != usr__pass:
print("Wrogn password! Try again.")
return
elif pass__row == usr__pass:
print("Authorization is successful!")
#reg form
def reg():
usr__login = input("Login: ")
if len(usr__login) < 8 :
print("Your login's so short, try again..")
return reg()
elif len(usr__login) >= 8:
usr__pass = input("Password: ")
if len(usr__pass) < 8:
print("Your password's so short, try again..")
return reg()
elif len(usr__pass) >= 8:
print("Good! Your account has be created.")
return login(usr__pass, usr__login)
def start():
start_a = input("Do you have an account? Yes(Y)/No(N)")
if start_a.lower() == "y":
login(usr__pass, usr__login)
else:
reg()
start()
Дальше я ввёл некоторые поправки в ваш код:
- В вашем коде, в первом вопросе есть ответ
Y/N, но если человек вводитy, то программа воспринимает это какN. Вот решениеif start_a.lower() == "y":. Про метод.lowerи другие можете прочитать здесь - В функции
reg(), а точнее там, где программа пишетprint("Your password's so short, try again..")вместоusr__pass = input("Password: ")предлагаю написатьreturn reg() - У вас ошибка в функции
login(), точнее в присваиванииpass_row = input("Enter your password: "). В названии переменной вы пропустили_. Правильная строчкаpass__row = input("Enter your password: ")