''' 学生信息库,重点调整check_user_info函数,捕获相关函数判断异常 ''' class NotArgError(Exception): def __init__(self,message): self.message = message class StudentInfo(object): def __init__(self,students): self.students = students def get_all_students(self): for id_, value in self.students.items(): print('学号:{}, 姓名:{}, 年龄:{}, 班级:{}, 性别:{}'.format( id_, value['name'], value['age'], value['class_number'], value['sex'])) return self.students def check_user_info(self,**kwargs): assert len(kwargs) == 4,'传入的参数必须是4个,name,age,class_number,sex' if 'name' not in kwargs: raise NotArgError('缺少学生姓名') if 'age' not in kwargs: raise NotArgError('缺少学生年龄') if 'class_number' not in kwargs: raise NotArgError('缺少学生班级') if 'sex' not in kwargs: raise NotArgError('缺少学生性别') # 还需要对传入的参数类型进行判断,如何对传入类型进行检测 # isinstance(对比的数据,目标类型) 列:isinstance(1,int) name_value = kwargs['name'] age_value = kwargs['age'] class_number_value = kwargs['class_number'] sex_value = kwargs['sex'] if not isinstance(name_value,str): raise TypeError('name应该是字符串类型') if not isinstance(age_value,int): raise TypeError('age应该是整形') if not isinstance(class_number_value,str): raise TypeError('class_number应该是字符串类型') if not isinstance(sex_value,str): raise TypeError('sex_value应该是字符串类型') # 添加学生信息 def add(self,**kwargs): try: self.check_user_info(**kwargs) except Exception as e: raise e self.__add(**kwargs) # 批量添加 def adds(self,new_students): for student in new_students: try: self.check_user_info(**student) except Exception as e: print(e,'问题同学为:',student.get('name')) continue self.__add(**student) def __add(self, **kwargs): new_id = max(self.students) + 1 self.students[new_id] = {'name': kwargs['name'], 'age': kwargs['age'], 'class_number': kwargs['class_number'], 'sex': kwargs['sex']} # 学生信息的删除 def delete(self,id_): if id_ not in self.students.keys(): print('需要删除的学号%s 学生不存在' % id_) else: result = self.students.pop(id_) print('学号为%s 的 %s 同学已被删除' % (id_, result['name'])) # return students # 批量删除 def deletes(self,*ids): for id_ in ids: if id_ not in self.students.keys(): print('需要删除的学号%s 学生不存在' % id_) else: result = self.students.pop(id_) print('学号为%s 的 %s 同学已被删除' % (id_, result['name'])) # 学生信息的修改/更新,student_id作为关键参数传入 def update(self,student_id, **kwargs): if student_id not in self.students: print('需要更改的学号%s 学生不存在' % student_id) try: self.check_user_info(**kwargs) except Exception as e: raise e self.students[student_id] = kwargs print('学号为{} {}同学信息更新完成'.format(student_id, kwargs['name'])) #批量更新,传入的是列表,列表里头是字典{唯一的学号+学生信息(又是一个字典)} def updates(self,update_students): for stu in update_students: try: id_ = list(stu.keys())[0] # 重要,list(伪列表(key))[0] except IndexError as e: print(e) continue user_info = stu[id_] try: self.check_user_info(**user_info) except Exception as e: print(e,'问题学生学号是:',id_) continue self.students[id_] = user_info print('所有同学已更新完毕') def get_by_id(self,student_id): if student_id not in self.students: print('需要更改的学号%s 学生不存在' % student_id) else: result = self.students[student_id] print('查询结果:学号为{} 的学生:姓名:{}, 年龄:{}, 班级:{}, 性别:{}'.format( student_id, result['name'], result['age'], result['class_number'], result['sex'])) # return students.get(student_id) 也可以只用一行代码获取,但是得到的是字典 # 根据关键词查询==>模糊查找匹配 def search_user(self,**kwargs): assert len(kwargs),'传入的参数个数错误,请传入一个关键词查询' users = list(self.students.values()) key = None value = None result = [] if 'name' in kwargs: key = 'name' value = kwargs[key] elif 'age' in kwargs: key = 'age' value = str(kwargs[key]) elif 'class_number' in kwargs: key = 'class_number' value = kwargs[key] elif 'sex' in kwargs: key = 'sex' value = kwargs[key] else: raise NotArgError('您所查找的关键词不存在') for user in users: if value in str(user[key]): result.append(user) if len(result) == 0: return NotArgError('关键词为%s=%s的同学不存在' % (key, value)) else: return result students = {1: {'name': 'mark', 'age': 18, 'class_number': 'B', 'sex': 'boy'}, 2: {'name': 'nancy', 'age': 17, 'class_number': 'A', 'sex': 'girl'}, 3: {'name': 'pall', 'age': 19, 'class_number': 'A', 'sex': 'boy'}, 4: {'name': 'Lily', 'age': 18, 'class_number': 'B', 'sex': 'girl'} } if __name__ == '__main__': stu = StudentInfo(students) re = stu.search_user(name='mark') print(re) stu.get_by_id(4) stu.add(name='lucy',sex='girl',class_number='B',age=18) stu.get_all_students() users = [{'name':'Nick','sex':'boy','class_number':'B','age':29},{'name':'Nana','sex':'girl','class_number':'A','age':17}] stu.adds(users) stu.get_all_students() # stu.deletes(2,4) # stu.get_all_students() print('===============') update_users = [{6:{'name': 'Nick.li', 'sex': 'boy', 'class_number': 'C','age':17}}, {7:{'name': 'Nana.zhang', 'sex': 'girl', 'class_number': 'A','age': 17}}] stu.updates(update_users) stu.get_all_students() result = stu.search_user(name='a') print('===',result) result = stu.search_user(age=18) print(result) # print(stu_all) # lily_new = {'name':'Lily','age':19,'class_number':'A','sex':'girl'} # print('更新————————') # update_student(4,**lily_new) # update_student(1,name='mark.li',age=18,class_number='B',sex='boy') # add_student(name='lucy',sex='girl',class_number='B',age=18)