news 2026/4/16 12:52:37

【Python】基础语法入门(二十)——项目实战:从零构建命令行 To-Do List 应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】基础语法入门(二十)——项目实战:从零构建命令行 To-Do List 应用

🛠️说明:经过前十九篇的学习,你已掌握 Python 核心语法、文件操作、异常处理、OOP、模块组织和虚拟环境等关键技能。本篇将整合所有知识,带你从零开始开发一个功能完整、结构清晰、可维护的命令行 To-Do List(待办事项)应用。

你将实践:

  • 项目目录结构设计
  • 面向对象建模(TaskTaskManager
  • JSON 数据持久化
  • 命令行交互(argparse+ 用户输入)
  • 异常处理与用户友好提示
  • 虚拟环境与依赖管理

1. 项目目标与功能清单

✅ 最终应用支持以下操作:

# 添加任务python todo.pyadd"买牛奶"# 列出所有任务python todo.py list# 标记任务完成python todo.pydone1# 删除任务python todo.py remove2# 显示帮助python todo.py --help

数据存储格式(tasks.json):

[{"id":1,"title":"买牛奶","completed":false,"created_at":"2025-12-18T16:30:00"}]

2. 项目结构设计

遵循前文最佳实践:

todo-cli/ ├── venv/ ← 虚拟环境(不提交) ├── requirements.txt ├── .gitignore ├── README.md ├── todo.py ← 主程序入口 └── todolib/ ← 核心功能包 ├── __init__.py ├── task.py ← Task 类 ├── storage.py ← 文件读写 └── manager.py ← 任务管理逻辑

3. 步骤一:创建虚拟环境与依赖

mkdirtodo-cli&&cdtodo-cli python -m venv venvsourcevenv/bin/activate# Linux/Mac# venv\Scripts\activate # Windows# 目前无第三方依赖,但保留文件echo"# 项目依赖">requirements.txt

💡 本项目仅使用标准库,无需安装额外包!


4. 步骤二:定义Task类(todolib/task.py

fromdatetimeimportdatetimefromtypingimportDictclassTask:def__init__(self,title:str,completed:bool=False,created_at:str=None):self.title=title self.completed=completed self.created_at=created_atordatetime.now().isoformat()self.id=None# 将由 TaskManager 分配defto_dict(self)->Dict:return{"id":self.id,"title":self.title,"completed":self.completed,"created_at":self.created_at}@classmethoddeffrom_dict(cls,data:Dict)->"Task":task=cls(data["title"],data["completed"],data["created_at"])task.id=data["id"]returntaskdef__str__(self):status="✓"ifself.completedelse"○"returnf"[{status}]{self.title}"

✅ 使用类型提示(typing)提升可读性
✅ 支持序列化(to_dict)与反序列化(from_dict


5. 步骤三:实现数据存储(todolib/storage.py

importjsonfrompathlibimportPathfromtypingimportList,Dictfrom.taskimportTask TASKS_FILE=Path("tasks.json")defload_tasks()->List[Task]:ifnotTASKS_FILE.exists():return[]try:data=json.loads(TASKS_FILE.read_text(encoding="utf-8"))return[Task.from_dict(item)foritemindata]except(json.JSONDecodeError,KeyError)ase:print(f"⚠️ 警告:任务文件损坏,已重置。错误:{e}")return[]defsave_tasks(tasks:List[Task])->None:data=[task.to_dict()fortaskintasks]TASKS_FILE.write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding="utf-8")

🔒 安全读取:捕获 JSON 解析错误,防止程序崩溃


6. 步骤四:任务管理逻辑(todolib/manager.py

fromtypingimportListfrom.taskimportTaskfrom.storageimportload_tasks,save_tasksclassTaskManager:def__init__(self):self.tasks:List[Task]=load_tasks()self._next_id=max((t.idfortinself.tasks),default=0)+1defadd_task(self,title:str)->Task:task=Task(title)task.id=self._next_id self._next_id+=1self.tasks.append(task)save_tasks(self.tasks)returntaskdefget_task_by_id(self,task_id:int)->Task:fortaskinself.tasks:iftask.id==task_id:returntaskraiseValueError(f"任务 ID{task_id}不存在")defmark_done(self,task_id:int)->None:task=self.get_task_by_id(task_id)task.completed=Truesave_tasks(self.tasks)defremove_task(self,task_id:int)->None:task=self.get_task_by_id(task_id)self.tasks.remove(task)save_tasks(self.tasks)deflist_tasks(self,show_completed:bool=True)->List[Task]:ifshow_completed:returnself.tasksreturn[tfortinself.tasksifnott.completed]

✅ 封装业务逻辑,主程序只需调用方法
✅ 自动分配唯一 ID,避免冲突


7. 步骤五:主程序入口(todo.py

#!/usr/bin/env python3importargparsefromtodolib.managerimportTaskManagerdefmain():parser=argparse.ArgumentParser(description="简易命令行 To-Do List")subparsers=parser.add_subparsers(dest="command",help="可用命令")# addadd_parser=subparsers.add_parser("add",help="添加新任务")add_parser.add_argument("title",help="任务内容")# listlist_parser=subparsers.add_parser("list",help="列出任务")list_parser.add_argument("--all",action="store_true",help="显示已完成任务")# donedone_parser=subparsers.add_parser("done",help="标记任务完成")done_parser.add_argument("id",type=int,help="任务ID")# removeremove_parser=subparsers.add_parser("remove",help="删除任务")remove_parser.add_argument("id",type=int,help="任务ID")args=parser.parse_args()ifnotargs.command:parser.print_help()returnmanager=TaskManager()try:ifargs.command=="add":task=manager.add_task(args.title)print(f"✅ 已添加任务 #{task.id}:{task.title}")elifargs.command=="list":tasks=manager.list_tasks(show_completed=args.all)ifnottasks:print("📭 暂无任务")returnfortaskintasks:print(f"#{task.id}{task}")elifargs.command=="done":manager.mark_done(args.id)print(f"🎉 任务 #{args.id}已完成!")elifargs.command=="remove":manager.remove_task(args.id)print(f"🗑️ 任务 #{args.id}已删除")exceptValueErrorase:print(f"❌ 错误:{e}")exceptExceptionase:print(f"💥 未知错误:{e}")if__name__=="__main__":main()

✨ 用户友好提示(✅/❌/🎉 等 emoji 提升体验)
🛡️ 异常捕获:防止因无效 ID 导致崩溃


8. 测试你的应用

# 添加任务python todo.pyadd"学习 Python"python todo.pyadd"写博客"# 查看任务python todo.py list# 输出:# #1 [○] 学习 Python# #2 [○] 写博客# 完成任务python todo.pydone1# 再次查看(默认隐藏已完成)python todo.py list# 输出:# #2 [○] 写博客# 查看所有python todo.py list --all# 删除任务python todo.py remove2

💾 所有数据自动保存到tasks.json,重启后依然存在!


9. 项目优化建议(进阶)

  1. 添加单元测试(使用unittestpytest
  2. 支持任务优先级或截止日期
  3. 实现“清空已完成”命令
  4. rich库美化终端输出(需安装第三方包)
  5. 打包为可执行命令(如pip install -e .

10. 总结:你已掌握的核心能力

技能在本项目中的体现
OOP 设计TaskTaskManager封装数据与行为
文件操作storage.py安全读写 JSON
异常处理捕获无效 ID、文件损坏等错误
命令行交互argparse构建专业 CLI
模块化功能拆分为todolib/
虚拟环境隔离开发环境

🎯恭喜!你已具备独立开发小型 Python 应用的能力。


下一步方向

  1. 扩展功能:添加子任务、分类标签、搜索
  2. 学习 Web 开发:用 Flask/Django 将此应用转为网页版
  3. 探索自动化:用此工具管理你的学习计划
  4. 阅读开源项目:如 todo-txt

🐍编程不是学出来的,是写出来的。
从今天起,你不再只是学习者,而是创造者!

继续编码,用 Python 改变你的世界!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:46:16

vue和springboot框架开发的基于AI智能问答的实验室预约系统 实验室设备报修系统 实验室设备租赁系统_02597u66

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 vu额spring波哦天AI实验室设备报修系统 实验室设备租赁系…

作者头像 李华
网站建设 2026/4/16 11:00:44

德艺双馨艺术家凯丽亮相澳涞坞金萱奖 凭实力再获十佳演员大奖

第六届新时代国际电影节金扬花奖、第四届澳涞坞国际电视剧节金萱奖颁奖盛典日前在澳门举行,备受观众喜爱的德艺双馨艺术家凯丽亮相现场,并荣获“中国电影120周年10大最具影响力电视剧演员”奖。时隔三十年再获十佳演员殊荣,凯丽感慨万千&…

作者头像 李华
网站建设 2026/4/15 13:43:57

【计算机毕业设计案例】基于微信小程序的快递代收发的设计与实现基于springboot+微信小程序的快递代取系统的设计与实小程序(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/16 11:01:05

【计算机毕业设计案例】基于springboot+微信小程序的集换社卡牌的交易系统小程序基于微信小程序的集换式卡牌交易系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/16 11:02:05

【紧急升级】金融客服Agent必须具备的情绪识别能力,错过将被淘汰

第一章:金融客服Agent情绪识别的紧迫性与战略价值在数字化金融服务迅速普及的背景下,客户与金融机构之间的交互 increasingly 依赖于智能客服系统。然而,传统客服Agent往往缺乏对用户情绪的敏感度,导致服务体验机械化、响应迟缓&a…

作者头像 李华