• 2020软工第二次作业


    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020/
    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
    这个作业的目标 - 挑战人类极限
    - 学会git的使用
    - 了解命令行解析
    - 了解json文件的解析
    学号 031802214

    一、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 60
    Estimate 估计这个任务需要多少时间 180 180
    Development 开发 120 180
    Analysis 需求分析 (包括学习新技术) 150 180
    Design Spec 生成设计文档 30 30
    Design Review 设计复审 20 30
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 30
    Design 具体设计 90 120
    Coding 具体编码 60 90
    Code Review 代码复审 60 60
    Test 测试(自我测试,修改代码,提交修改) 30 60
    Reporting 报告 30 30
    Test Report 测试报告 10 10
    Size Measurement 计算工作量 10 10
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
    合计 890 1100

    二、解题思路

    1.兴致勃勃的打开题目,但是第一眼看到题目,我直接开始怀疑人生,这是啥,这又是啥

    2.对于题目本身无可奈何,只能先上 b 站学习git的使用众所周知,哔哩哔哩是个学习网站,学习了git的命令行,了解如何创建仓库、如何上传文件、同步仓库、从 github 上 clone 项目等等,算是初步掌握了git的使用。

    3.后来在 dalao 和百度的帮助下,能看懂题目了,了解了大致步骤。

    4.命令行的学习:GHAnalysis <--init|-i> <path to data>,了解了这玩意是命令行之后,就开始了学习如何用 python 处理这种命令 ——> python 的 argparse 模块 ——> 学习使用 argparse 模块。

    1. json 文件的解析:了解到要处理 json 文件需要 json模块 ——> 学习了 json 模块的使用以及如何处理 json 文件。

    三、实现过程

    四、代码说明

    添加命令行参数

        def argInit(self):
            self.parser.add_argument('-i', '--init')
            self.parser.add_argument('-u', '--user')
            self.parser.add_argument('-r', '--repo')
            self.parser.add_argument('-e', '--event')
    

    命令解析

        def analyse(self):
            if self.parser.parse_args().init:
                self.data = Data(self.parser.parse_args().init, 1)
                return 0
            else:
                if self.data is None:
                    self.data = Data()
                if self.parser.parse_args().event:
                    if self.parser.parse_args().user:
                        if self.parser.parse_args().repo:
                            res = self.data.getEventsUsersAndRepos(
                                self.parser.parse_args().user, self.parser.parse_args().repo, self.parser.parse_args().event)
                        else:
                            res = self.data.getEventsUsers(
                                self.parser.parse_args().user, self.parser.parse_args().event)
                    elif self.parser.parse_args().repo:
                        res = self.data.getEventsRepos(
                            self.parser.parse_args().reop, self.parser.parse_args().event)
                    else:
                        raise RuntimeError('error: argument -l or -c are required')
                else:
                    raise RuntimeError('error: argument -e is required')
            return res
    

    初始化

        def __init__(self, dict_address: int = None, reload: int = 0):
            if reload == 1:
                self.__init(dict_address)
            if dict_address is None and not os.path.exists('1.json') and not os.path.exists('2.json') and not os.path.exists('3.json'):
                raise RuntimeError('error: init failed')
            x = open('1.json', 'r', encoding='utf-8').read()
            self.__4Events4PerP = json.loads(x)
            x = open('2.json', 'r', encoding='utf-8').read()
            self.__4Events4PerR = json.loads(x)
            x = open('3.json', 'r', encoding='utf-8').read()
            self.__4Events4PerPPerR = json.loads(x)
    
        def __init(self, dict_address: str):
            self.__4Events4PerP = {}
            self.__4Events4PerR = {}
            self.__4Events4PerPPerR = {}
            for root, dic, files in os.walk(dict_address):
                for f in files:
                    if f[-5:] == '.json':
                        json_list = []
                        json_path = f
                        x = open(dict_address+'\'+json_path,
                                 'r', encoding='utf-8').read()
                        str_list = [_x for _x in x.split('
    ') if len(_x) > 0]
                        for i, _str in enumerate(str_list):
                            try:
                                json_list.append(json.loads(_str))
                            except:
                                pass
                        records = self.__listOfNestedDict2ListOfDict(json_list)
                        for i in records:
                            if not self.__4Events4PerP.get(i['actor__login'], 0):
                                self.__4Events4PerP.update({i['actor__login']: {}})
                                self.__4Events4PerPPerR.update({i['actor__login']: {}})
                            self.__4Events4PerP[i['actor__login']][i['type']
                                                        ] = self.__4Events4PerP[i['actor__login']].get(i['type'], 0)+1
                            if not self.__4Events4PerR.get(i['repo__name'], 0):
                                self.__4Events4PerR.update({i['repo__name']: {}})
                            self.__4Events4PerR[i['repo__name']][i['type']
                                                    ] = self.__4Events4PerR[i['repo__name']].get(i['type'], 0)+1
                            if not self.__4Events4PerPPerR[i['actor__login']].get(i['repo__name'], 0):
                                self.__4Events4PerPPerR[i['actor__login']].update({i['repo__name']: {}})
                            self.__4Events4PerPPerR[i['actor__login']][i['repo__name']][i['type']
                                                            ] = self.__4Events4PerPPerR[i['actor__login']][i['repo__name']].get(i['type'], 0)+1
            with open('1.json', 'w', encoding='utf-8') as f:
                json.dump(self.__4Events4PerP,f)
            with open('2.json', 'w', encoding='utf-8') as f:
                json.dump(self.__4Events4PerR,f)
            with open('3.json', 'w', encoding='utf-8') as f:
                json.dump(self.__4Events4PerPPerR,f)
    
        def __parseDict(self, d: dict, prefix: str):
            _d = {}
            for k in d.keys():
                if str(type(d[k]))[-6:-2] == 'dict':
                    _d.update(self.__parseDict(d[k], k))
                else:
                    _k = f'{prefix}__{k}' if prefix != '' else k
                    _d[_k] = d[k]
            return _d
    
        def __listOfNestedDict2ListOfDict(self, a: list):
            records = []
            for d in a:
                _d = self.__parseDict(d, '')
                records.append(_d)
            return records
    
        def getEventsUsers(self, username: str, event: str) -> int:
            if not self.__4Events4PerP.get(username,0):
                return 0
            else:
                return self.__4Events4PerP[username].get(event,0)
    
        def getEventsRepos(self, reponame: str, event: str) -> int:
            if not self.__4Events4PerR.get(reponame,0):
                return 0
            else:
                return self.__4Events4PerR[reponame].get(event,0)
    
        def getEventsUsersAndRepos(self, username: str, reponame: str, event: str) -> int:
            if not self.__4Events4PerP.get(username,0):
                return 0
            elif not self.__4Events4PerPPerR[username].get(reponame,0):
                return 0
            else:
                return self.__4Events4PerPPerR[username][reponame].get(event,0)
    

    五、性能测试

    六、代码规范

    https://github.com/3xxxv5/2020-personal-python/blob/master/CodeStyle.md

    七、总结

    通过这次学习,还是学到了不少东西,不仅了解了git的使用,也对git这个工具有了个更加全面的认识。同时也对python更加的熟悉,像命令行的处理、json文件的解析,总的来说收获还是很多的。从最开始的一脸懵逼,到逐渐的掌握,但是,真的好累啊,一周多的时间要学一堆东西,人都裂开了,最后

  • 相关阅读:
    自学编程的人,都是怎么找到自己的第一份工作的?
    自学编程的人,都是怎么找到自己的第一份工作的?
    滴滴工程师带你深入理解 TCP 握手分手全过程
    c语言之利用#if #endif来进行注释或者运行不同的主函数
    c语言之字符指针变量和字符数组的异同
    程序员自我学习自我培训指南
    海量存储之十六–一致性和高可用专题、十七
    海量存储之十四、十五
    海量存储系列之十一、十二、十三
    海量存储系列之八、九、十
  • 原文地址:https://www.cnblogs.com/3xxxv5/p/13687414.html
Copyright © 2020-2023  润新知