Простых командной строки приложения (с JSON для стойкости), используя Python


Я очень новой для Python. Я хотел начать с простого проекта: в CLI приложение, которое отслеживает делается.

Код работает, как задумано, но то, что я написал что-либо хорошее?

Структура файла:

  • task.py определяет задачи класс
  • task_handler.py определяет класс, который помогает вернуть/сохранить задания
  • command.py связывает все вместе и обрабатывает команды

Файлы:

task.py

class Task:

    def __init__(self, description):
        self.description = description
        self.completed = False

    def complete(self):
        self.completed = True

task_handler.py

import json
from task import Task


class TaskHandler:

    def __init__(self, path):
        self.path = path
        self.stored_attributes = ['description', 'completed']

    def store(self, tasks):
        data = []
        for task in tasks:
            obj = {}
            for attr in self.stored_attributes:
                obj[attr] = getattr(task, attr, None)
            data.append(obj)

        with open(self.path, 'w') as data_file:
            json.dump(data, data_file)

    def retrieve(self):
        data = []
        try:
            with open(self.path, 'r') as data_file:
                data = json.load(data_file)
        except FileNotFoundError:
            pass

        tasks = []
        for task in data:
            obj = Task(task['description'])
            for attr in self.stored_attributes:
                setattr(obj, attr, task[attr])
            tasks.append(obj)
        return tasks

command.py

import os
import sys
import argparse
from task import Task
from task_handler import TaskHandler


def parse_args(args):
    parser = argparse.ArgumentParser()
    action_parser = parser.add_subparsers(title='actions', dest='action')

    action_parser.add_parser('list')

    add_action_parser = action_parser.add_parser('add')
    add_action_parser.add_argument('description')

    complete_action_parser = action_parser.add_parser('complete')
    complete_action_parser.add_argument('index', type=int)

    purge_action_parser = action_parser.add_parser('purge')
    purge_action_parser.add_argument('index', type=int)

    return parser.parse_args(args)


def main():
    args = parse_args(sys.argv[1:])
    task_handler = TaskHandler(os.path.expanduser('~') + '/.todo.json')
    stored_tasks = task_handler.retrieve()

    if args.action == 'add':
        new_task = Task(args.description)
        stored_tasks.append(new_task)
        task_handler.store(stored_tasks)
        print('Task added')
    elif args.action == 'complete':
        try:
            stored_tasks[args.index].complete()
            task_handler.store(stored_tasks)
            print('Task marked as completed')
        except IndexError:
            print('No task with that index')
    elif args.action == 'purge':
        try:
            del stored_tasks[args.index]
            task_handler.store(stored_tasks)
            print('Task purged')
        except IndexError:
            print('No task with that index')
    else:
        if not stored_tasks:
            print('To-do list is empty')
        else:
            print('To-do:')
            for idx, task in enumerate(stored_tasks):
                completed = ' (completed)' if task.completed else ''
                print('[{}] {}{}'.format(idx, task.description, completed))


if __name__ == '__main__':
    main()

Любой вклад будет высоко оценен! Я хочу обратить внимание на то, чтобы стать лучшим программистом в любом случае я могу.



114
2
задан 3 апреля 2018 в 07:04 Источник Поделиться
Комментарии