stu-system-test3

'''
学生信息库,重点调整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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值