تمرين إعادة البناء
قائمة مهام بسيطة JSON
ابنِ قائمة مهام CLI تحفظ البيانات في ملف JSON محلي.
python
~20 دقيقة
مبتدئ
أعد بناء الكود
Rebuild
هذا هو الكود. اكتبه بنفسك.
الكود المرجعي
import argparse
import json
from datetime import datetime
from pathlib import Path
def load_tasks(path: Path) -> list[dict[str, object]]:
if not path.exists():
return []
return json.loads(path.read_text(encoding="utf-8"))
def save_tasks(path: Path, tasks: list[dict[str, object]]) -> None:
path.write_text(json.dumps(tasks, indent=2, ensure_ascii=False), encoding="utf-8")
def add_task(tasks: list[dict[str, object]], text: str) -> None:
next_id = max((int(task["id"]) for task in tasks), default=0) + 1
tasks.append({"id": next_id, "text": text, "done": False, "created": datetime.now().isoformat(timespec="seconds")})
def mark_done(tasks: list[dict[str, object]], task_id: int) -> bool:
for task in tasks:
if task["id"] == task_id:
task["done"] = True
return True
return False
def remove_task(tasks: list[dict[str, object]], task_id: int) -> bool:
before = len(tasks)
tasks[:] = [task for task in tasks if task["id"] != task_id]
return len(tasks) != before
def print_tasks(tasks: list[dict[str, object]]) -> None:
for task in tasks:
mark = "✓" if task["done"] else " "
print(f"[{mark}] {task['id']}: {task['text']}")
def main() -> None:
parser = argparse.ArgumentParser(description="Small JSON-backed todo list.")
parser.add_argument("command", choices=["add", "done", "remove", "list"])
parser.add_argument("value", nargs="?")
parser.add_argument("--file", type=Path, default=Path("todos.json"))
args = parser.parse_args()
tasks = load_tasks(args.file)
if args.command == "add" and args.value:
add_task(tasks, args.value)
elif args.command == "done" and args.value:
mark_done(tasks, int(args.value))
elif args.command == "remove" and args.value:
remove_task(tasks, int(args.value))
save_tasks(args.file, tasks)
print_tasks(tasks)
if __name__ == "__main__":
main()اكتب هنا