Python用户创建与入库程序无响应问题排查求助
用户问题
我正在开发一款创建新用户并将其添加至数据库(DB)的程序,数据结构定义为data = {'name': name, 'username': username... 'unique_id' = unique_id...}。目前程序运行至某环节后出现无响应情况,既不输出内容也不终止运行。我添加了打印语句仍无法定位问题根源,以下是完整代码,恳请协助排查解决该无响应问题:
class NewUser: def __init__(self, name: str, username: str, email: str, age: int, sex: str): self.name = name self.username = username self.non_verified_email = email self.age = age self.sex = sex print('got data') self.finish_data() def unique_id(self): print('get id') return users.get_unique_id(self.username) def verify_email(self): print('email verified') return self.non_verified_email def adultness(self): print('inside') if self.age >= 18: print('adult') return True else: print('child') return False def finish_data(self): self.id = self.unique_id() self.verified_email = self.verify_email() self.adult = self.adultness() self.data = { 'name': self.name, 'username': self.username, 'us_id': self.unique_id, 'email': self.verified_email, 'age': self.age, 'adult': self.adult, 'sex': self.sex } print(self.data) self.add_to_DB() def add_to_DB(self): print('adding to DB') users.add_new_user(self.data)
class UserDB: def __init__(self): self.users = [] def add_new_user(self, data): self.users.append(data) def get_unique_id(self, username): n = 0 change = True while change: n += 1 new_id = '@' + username + str(n) for user in self.users: for us_id in user.values(): if us_id == new_id: change = True break else: return str(new_id) users = UserDB() us1 = '' us2 = '' us3 = '' us = [us1, us2, us3] for i in range(2): us[i] = NewUser(input('name'), input('username'), input('email'), int(input('age')), input('sex'))
问题排查与修复
程序无响应的核心原因是**UserDB.get_unique_id方法的死循环逻辑错误**,同时存在一处变量赋值错误,具体问题和修复方案如下:
1. get_unique_id方法的逻辑漏洞
原方法存在两个致命问题:
- 内层循环中,只要第一个用户的某个值不匹配就直接
return new_id,完全没有遍历检查所有用户的ID,会导致ID重复 - 当发现ID重复时,仅设置
change = True但未跳出内层循环,且初始change = True会让外层while循环无限执行,直接造成程序卡死
修复逻辑:
- 改为无限循环,直到生成不重复的ID为止
- 针对每个新生成的ID,遍历所有已存在用户的
us_id字段做完整检查,确认无重复后再返回
2. NewUser.finish_data的赋值错误
原代码中'us_id': self.unique_id是把方法对象赋值给了us_id,而非调用方法获取的ID值,应改为'us_id': self.id(或直接调用self.unique_id())
修复后的完整代码
NewUser类
class NewUser: def __init__(self, name: str, username: str, email: str, age: int, sex: str): self.name = name self.username = username self.non_verified_email = email self.age = age self.sex = sex print('got data') self.finish_data() def unique_id(self): print('get id') return users.get_unique_id(self.username) def verify_email(self): print('email verified') return self.non_verified_email def adultness(self): print('inside') if self.age >= 18: print('adult') return True else: print('child') return False def finish_data(self): self.id = self.unique_id() self.verified_email = self.verify_email() self.adult = self.adultness() self.data = { 'name': self.name, 'username': self.username, 'us_id': self.id, # 修复:赋值为已获取的ID而非方法对象 'email': self.verified_email, 'age': self.age, 'adult': self.adult, 'sex': self.sex } print(self.data) self.add_to_DB() def add_to_DB(self): print('adding to DB') users.add_new_user(self.data)
UserDB类与执行代码
class UserDB: def __init__(self): self.users = [] def add_new_user(self, data): self.users.append(data) def get_unique_id(self, username): n = 0 while True: n += 1 new_id = '@' + username + str(n) # 仅检查用户字典中的us_id字段,避免误判其他字段 duplicate = False for user in self.users: if user.get('us_id') == new_id: duplicate = True break if not duplicate: return new_id users = UserDB() us = ['', '', ''] for i in range(2): us[i] = NewUser(input('name'), input('username'), input('email'), int(input('age')), input('sex'))
内容的提问来源于stack exchange,提问作者unun1212
相关产品推荐
相关产品推荐

