零基础入门python10:命令行任务管理器——第一个完整项目验收

发布时间:2026/8/20 12:37:31
零基础入门python10:命令行任务管理器——第一个完整项目验收 零基础入门python10命令行任务管理器——第一个完整项目验收一、上一篇课后练习讲解--verbose可以使用argparse的actionstore_true再根据args.verbose设置日志级别。命令行参数解析放在入口模块业务函数仍然接收普通 Python 参数测试不需要伪造命令行。可执行验收答案importargparse,loggingdefbuild_parser()-argparse.ArgumentParser:parserargparse.ArgumentParser()parser.add_argument(--verbose,actionstore_true)returnparserdefmain(argv:list[str]|NoneNone)-int:argsbuild_parser().parse_args(argv)logging.basicConfig(levellogging.DEBUGifargs.verboseelselogging.INFO)logging.debug(verbose enabled)return0assertmain([])0assertmain([--verbose])0print(cli checks passed)执行python cli.py --verbose应看到 DEBUG 日志执行不带参数时不应出现 DEBUG。argv参数让测试直接传列表避免修改全局sys.argv非法参数由 argparse 返回退出码 2这属于命令行用法错误而不是业务异常。二、本篇项目目标我们把前面学过的变量、集合、循环、函数、类、JSON、模块和异常处理组合成任务管理器新增任务、列出任务、完成任务、删除任务并把数据保存到文件。三、项目文件task_manager/ ├─ __init__.py ├─ models.py ├─ repository.py ├─ service.py └─ cli.py tests/ └─ test_service.py四、关键完整代码# models.pyfromdataclassesimportdataclass,asdictdataclassclassTask:id:inttitle:strdone:boolFalse# service.pyclassTaskService:只负责任务规则存储细节通过 repository 参数注入。def__init__(self,repository):self.repositoryrepositorydefadd(self,title:str):titletitle.strip()ifnottitle:raiseValueError(任务标题不能为空)tasksself.repository.load()taskTask(max((x.idforxintasks),default0)1,title)tasks.append(task)self.repository.save(tasks)returntask服务层不直接open文件也不打印内容这样测试可以注入内存仓储未来也能替换成数据库仓储。五、完整验收python-m pytest-q python-m task_manager.cliadd学习SQLpython-m task_manager.clilist python-m task_manager.clidone 1 python-m task_manager.clidelete 1验收成功标准任务能跨进程保存重复完成、删除不存在任务会得到明确错误测试覆盖成功和失败场景。完成本篇后Python 基础阶段结束下一篇进入 Git、HTTP 和后端通用基础。六、毕业练习给任务增加优先级和截止日期写出迁移 JSON 数据的兼容策略。下一阶段会把“文件持久化”与真实数据库、HTTP API 联系起来。实战补充任务管理器的命令行入口命令行入口应该只解析参数并调用业务对象不把文件读写和规则混在 argparse 回调里。defmain()-int:parserargparse.ArgumentParser()subparser.add_subparsers(destcommand,requiredTrue)addsub.add_parser(add)add.add_argument(title)donesub.add_parser(done)done.add_argument(index,typeint)argsparser.parse_args()storeTaskStore(Path(tasks.json))try:ifargs.commandadd:store.add(args.title)else:store.complete(args.index)exceptValueErroraserror:print(f错误{error})return2return0返回码让脚本和 CI 能判断成功或失败用户错误返回 2未捕获异常仍保留堆栈用于开发排查。验收与课后练习执行 add、done、重复完成和不存在编号记录 stdout 与退出码。课后增加 list 命令下一阶段将把这些数据从文件迁移到数据库。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。main.pyfromdataclassesimportdataclass,asdictfrompathlibimportPathimportjsondataclassclassTask:id:int;title:str;done:boolFalsepathPath(tasks.json)defload():return[Task(**x)forxinjson.loads(path.read_text(utf-8))]ifpath.exists()else[]defsave(tasks):path.write_text(json.dumps([asdict(x)forxintasks],ensure_asciiFalse,indent2),utf-8)tasksload();tasks.append(Task(len(tasks)1,input(任务).strip()));save(tasks)fortaskintasks:print([x]iftask.doneelse[ ],task.id,task.title)

相关新闻