返回None未退出函数:为何仍执行账户创建询问代码?
return None本身是可以直接退出log_in函数的,出现你描述的情况,大概率是以下几种原因:
1. User.user_exists方法逻辑错误
如果User.user_exists(username)方法没有正确判断用户名是否存在(比如明明输入的用户名不存在,却返回True),那么代码根本不会进入if not(User.user_exists(username))这个分支,自然不会触发里面的return None。此时程序会直接执行后续的密码输入步骤,若密码验证失败,就会回到循环开头,再次询问用户名,让你误以为是return None没起作用。
2. 代码缩进错误
如果实际运行的代码中,return None的缩进层级不对(比如和外层的if not(User.user_exists(username))同级,而非嵌套在input(...) != "y"的判断分支里),那么即使你输入n,也不会执行return None,反而会继续执行User.sign_up(username),程序自然不会退出函数。
3. 对执行流程的误解
当你输入不存在的用户名后选择y创建账户,此时代码会执行User.sign_up(username),然后继续走后续的密码输入流程,这属于正常逻辑,并非return None没生效——因为这种情况下根本没触发return None的分支。只有当你输入不存在的用户名后选择n时,才会执行return None退出函数。
验证方法
可以在return None前加一行打印代码:
print("即将退出函数") return None
如果触发分支时能看到这句话,但程序没退出,那大概率是代码所在的函数定义有问题(比如装饰器和函数的缩进错误,导致log_in不是一个合法的静态方法,甚至被嵌套在其他循环里);如果看不到这句话,说明根本没进入这个分支,就要检查User.user_exists的逻辑或缩进问题。
内容的提问来源于stack exchange,提问作者JOHNWIKYWOK

