2020软工实践第一次个人编程作业
这个作业属于哪个课程 | |
---|---|
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | ||
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | ||
Design Spec | 生成设计文档 | ||
Design Review | 设计复审 | ||
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | ||
Design | 具体设计 | ||
Coding | 具体编码 | ||
Code Review | 代码复审 | ||
Test | 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | ||
Test Report | 测试报告 | ||
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | ||
合计 |
二、解题思路描述
★题目的要求简要概括为处理json文件,能够做到查询题目要求的数据并返回结果。类似于从字符串中提取特定子串并存储与新文件中便于查询。
★刚拿到题目时,对于题目中一大堆的陌生词汇一脸懵(虽然学到今天还是有点懵但是大致意思懂了QAQ),然后开始学习Python的json库相关操作(在CSDN等网站以及舍友的帮助下艰难学习),但在实际操作时仅仅是看懂部分代码改了部分参数而已。
三、设计过程实现及流程图
★所完成的代码仅仅是单线程,多线程还未完成。
★单线程的代码较多线程简单,包括一个outputFile函数跟RunFirst类。outputFile函数内处理文件的初始化工作,用于生成后续的Users.json、Repos.json、UsersAndRepos.json三个文件,生成三个初始化完的文件后进行对原json文件的处理,将各个数据存入上述三个文件中,后写三个查询函数内嵌在outputFile中用于满足查询相关操作。
★流程图
四、代码说明
1.outputFile函数
def outputFile(dict_address):
Users = {}
Repos = {}
UsersAndRepos = {}
json_list = []
for root, dic, files in os.walk(dict_address):
for f in files:
if(f[-5:] == '.json'):
x = open(dict_address + '\\' + f, 'r', encoding = 'utf-8').read()
for str in x.split('\n'):
if(len(str)>0):
try:
json_list.append(json.loads(str))
except:
pass
for i in json_list:
EventType = i.get('type',0)
EventUser = i.get('actor',0).get('login',0)
EventRepo = i.get('repo',0).get('name',0)
if(not Users.get(EventUser)):
Users.update({EventUser: {}})
if(not Users[EventUser].get(EventType)):
Users[EventUser].update({EventType: 0})
Users[EventUser][EventType] += 1
if(not Repos.get(EventRepo)):
Repos.update({EventRepo: {}})
if(not Repos[EventRepo].get(EventType)):
Repos[EventRepo].update({EventType: 0})
Repos[EventRepo][EventType] += 1
if(not UsersAndRepos.get(EventUser)):
UsersAndRepos.update({EventUser: {}})
if(not UsersAndRepos[EventUser].get(EventRepo)):
UsersAndRepos[EventUser].update({EventRepo: {}})
if(not UsersAndRepos[EventUser][EventRepo].get(EventType)):
UsersAndRepos[EventUser][EventRepo].update({EventType: 0})
UsersAndRepos[EventUser][EventRepo][EventType] += 1
with open('Users.json', 'w', encoding='utf-8') as f:
json.dump(Users,f)
with open('Repos.json', 'w', encoding='utf-8') as f:
json.dump(Repos,f)
with open('UsersAndRepos.json', 'w', encoding='utf-8') as f:
json.dump(UsersAndRepos,f)
2.getEventsRepos函数
def getEventsRepos(repo, event):
x = open('Repos.json', 'r', encoding='utf-8').read()
file = json.loads(x)
if(not file.get(repo,0)):
print("0")
else:
print(file[repo].get(event,0))
3.getEventsUsers函数
def getEventsUsers(user, event):
x = open('Users.json', 'r', encoding='utf-8').read()
file = json.loads(x)
if(not file.get(user,0)):
print("0")
else:
print(file[user].get(event,0))
4.getEventsUsersAndRepos函数
def getEventsUsersAndRepos(user, repo, event):
x = open('UsersAndRepos.json', 'r', encoding='utf-8').read()
file = json.loads(x)
if(not file.get(user,0)):
print("0")
elif(not file[user].get(repo)):
print("0")
else:
print(file[user][repo].get(event,0))
outputFile函数参数为文件路径,函数主要功能为生成三个所需json文件,在生成前进行初始化工作,生成完后对已有json文件进行处理并将相关结果导入新生成的三个json文件中,后编写三个函数用于查询返回结果。在实现该代码时得到了舍友大佬的极力帮助。
5.RunFirst类
class RunFirst:
def __init__(self):
self.parser = argparse.ArgumentParser()
self.argInit()
self.analyse()
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):
outputFile(self.parser.parse_args().init)
return 0
else:
if(self.parser.parse_args().event):
if(self.parser.parse_args().user):
if(self.parser.parse_args().repo):
getEventsUsersAndRepos(
self.parser.parse_args().user, self.parser.parse_args().repo, self.parser.parse_args().event)
else:
getEventsUsers(
self.parser.parse_args().user, self.parser.parse_args().event)
elif (self.parser.parse_args().repo):
getEventsRepos(
self.parser.parse_args().reop, self.parser.parse_args().event)
else:
raise RuntimeError('error: argument -l or -c are required')
return 0
else:
raise RuntimeError('error: argument -e is required')
return 0
if __name__ == '__main__':
Run = RunFirst()
该类仅仅基于样例代码给出的类进行一些参数的修改便于处理。
五、单元测试
六、单元测试覆盖率优化和性能测试,性能优化截图和描述
七、代码规范链接
https://github.com/FzuLitBro/2020-personal-python/blob/ckq-branch/codestyle.md
八、总结
★此次作业对于我个人而言难度偏大,由于还未真正接触过json文件的处理,在学习初期一无所措,而在真正了解后的学习速度慢也导致了没有很好的完成作业,对于多线程的处理掌握的并不是很清楚,而python的多线程特性也让代码执行起来很鸡肋,做了好久的多线程却一直报了Memory error但找不出原因,在后续有机会的话会继续完善代码。