اذهب إلى المحتوى

Recommended Posts

  • 0
نشر

يبدو أنك تقوم بتنفيذ البرنامج بدون تمرير أي شيء له، يجب عليك تمرير اسم التابع الذي تريد استعماله.

للقيام بذلك عليك الذهاب في البداية إلى سطر الأوامر و كتابة التعليمة التالية:

venv\Scripts\activate

هذه التعليمة ستقوم بتفعيل البيئة الافتراضية التي قمت بإنشاءها، بعد ذلك علينا القيام بتنفيذ البرنامج كما يلي:

مثلاً لنستعمل التابع list يمكننا كتابة ما يلي:

python taskaty\app.py list

طبعاً التطبيق الخاص بك يحوي على الكثير من الأخطاء المطبعية، و تنفيذ ما سبق سيعطي خطأ بسبب ذلك، حاول إيجاد الأخطاء المطبعية، إن vscode سيضع خط أصفر تحتها و بالتالي يجب عليك إيجادها بسهولة.

كما أنه في حال كان هذا السؤال يتبع لأحد الفيديوهات من الدورات من فضلك قم بنشر سؤالك دائماً أسفل الدرس في قسم التعليقات و ليس هنا في قسم الأسئلة البرمجية العامة.

  • 0
نشر

بالإضافة إلى الخطوات التي أشار إليها Kais، يجب إصلاح الأخطاء في ملفات المشروع التي لديك لتجنب ظهور أخطاء أخرى.

وأرجو منك إكمال بقية النقاش حول السؤال هنا لتجنب حل المشكلة من قبل أكثر من شخص، وفي المرات القادمة ضع السؤال أسفل الدرس.

وإليك ملف app.py بعد التعديل وإصلاح الأخطاء التالية:

  • استخدام Taskcontroller بدلاً من TaskController.
  • إزالة المسافات الإضافية للوسيطات - مثل "title " بدلاً من "           title".
  • استخدام "type = str" لجميع الوسيطات، بدلاً من استخدام "type = str" لبعضها فقط.
  • إضافة "action = 'store_true'" لخيار "--done" بدلاً من استخدام "type = str".
  • تغيير الخيار "-a" إلى "--all" في الأمر "list".
  • تغيير الخيار "-a" إلى "-n" في الأمر "remove".
  • تحديد الخيار "task" كـ "type = int" في الأمر "check".
from argparse import ArgumentParser
from Taskcontroller import TaskController
from argparse import Namespace


def main():
    controller = TaskController('tasks.txt')

    parser = ArgumentParser(description='Simple CLI Task Manager')
    subparsers = parser.add_subparsers()

    add_task = subparsers.add_parser('add', help='add the given task')
    add_task.add_argument('title', help='title of the task', type=str)
    add_task.add_argument('-d', '--description', help='short description of the task', type=str, default=None)
    add_task.add_argument('-s', '--start_date', help='date start of the task', type=str, default=None)
    add_task.add_argument('-e', '--end_date', help='date end of the task', type=str, default=None)
    add_task.add_argument('--done', help='check whether the task is done or not', action="store_true")
    add_task.set_defaults(func=controller.add_task)

    list_task = subparsers.add_parser("list", help='list of unfinished task')
    list_task.add_argument('-a', '--all', help='lists of all tasks', action="store_true")
    list_task.set_defaults(func=controller.display)

    check_task = subparsers.add_parser("check", help='check the given task')
    check_task.add_argument('-t', '--task', help='number of task to be done', type=int)
    check_task.set_defaults(func=controller.check_task)

    remove_task = subparsers.add_parser("remove", help='remove of  task')
    remove_task.add_argument('-n', '--number', help='the task will be removed(numbers)', type=int)
    remove_task.set_defaults(func=controller.remove_task)

    reset_task = subparsers.add_parser("reset", help='remove all  tasks')
    reset_task.set_defaults(func=controller.reset_task)

    args = parser.parse_args()
    args.func(args)


if __name__ == '__main__':
    main()

وهذا هو ملف Task.py بعد إصلاح الأخطاء التالية:

تم تصحيح اسم الوسيط dsecription إلى description لكي يتوافق مع اسم المتغير المعرف في الدالة __init__، وتم إضافة مسافات بعد علامة فاصلة في دالة __str__ لتوضيح النص بشكل أفضل.

class Task:
    def __init__(self, title, description=None, start_date=None, end_date=None, done=False):
        self.title = title
        self.description = description
        self.start_date = start_date
        self.end_date = end_date
        self.done = done

    def __str__(self):
        return f'{self.title}, {self.description}, {self.start_date}, {self.end_date}, {self.done}'

ملف Taskcontroller.py بعد إصلاح الأخطاء التالية: 

  1. استخدام متغيرات غير معرفة في الدوال: تم استخدام متغيرات غير معرفة في دالة list_alltasks()، والتي قام المبرمج بتسميتها بـ finished_tasks بدلاً من unfinished_tasks التي تم تعريفها في الدالة.
  2. خطأ في تعريف الدوال: تم تعريف دالة check_task() ولم يتم استخدام البارامتر args الموجود في تعريفها داخل الدالة، بل تم استخدام self.args بدلاً من ذلك.
  3. خطأ في اسم الدالة: تم تعريف دالة list_tasks() ولم يتم استخدام الاسم الصحيح للدالة، حيث استخدم اسم all_tasks بدلاً من unfinished_tasks الذي تم تعريفها.
  4. استخدام دالة غير موجودة: تم استخدام دالة list_all_tasks() بدلاً من list_alltasks() في الدالة remove_task().
  5. استخدام self.args بدلاً من args: تم استخدام self.args بدلاً من args في الدالة check_task().
  6. استخدام نوع البيانات الخاطئ: تم استخدام دالة date.fromisofromat() و date.formisoformat() بدلاً من date.fromisoformat() و date.isoformat() في الدالة due_date().
  7. خطأ في استخدام الدالة print_table(): تم استخدام الدالة print_table() بدون استخدام البارامتر tasks في الدالة display().
  8. استخدام tasks بدلاً من task: تم استخدام tasks بدلاً من task في الدالة remove_task()، والتي تم تعريفها كمتغير لحذف مهمة واحدة، وبالتالي أدت إلى القيام بحذف جميع المهام في الملف.
  9. عدم إدخال البيانات بالشكل الصحيح في الملف: تم حفظ البيانات في الملف في صورة سلسلة محولة، بدلاً من استخدام أي شكل من أشكال تخزين البيانات الهيكلية (على سبيل المثال، JSON أو CSV).
  10. عدم استخدام argparse بشكل صحيح: تم استخدام argparse للتعرف على المدخلات المستخدمة، ولكن تحديد الخيارات والوسائط التي تم استخدامها من خلال الأرقام الثابتة، وليس باستخدام الخيارات الاسمية. وهذا يعني أن أي تغيير في ترتيب الخيارات يؤثر على طريقة عمل البرنامج.
  11. عدم التحقق من صحة المدخلات: لم يتم التحقق من صحة المدخلات المستخدمة، مثل التحقق من تنسيق التاريخ المدخل أو القيم المدخلة للخيارات.
  12. تعقيد المنطق المستخدم في البرنامج: تم استخدام مجموعة متنوعة من الأساليب لإنجاز المهام المطلوبة، مما يصعب فهم كيفية عمل البرنامج وتصحيح الأخطاء في حالة وجودها.
  13. عدم استخدام معايير جيدة لتسمية المتغيرات: تم استخدام أسماء متغيرات غير واضحة، مما يصعب فهم دور كل متغير في البرنامج.
  14. الاعتماد على العوامل الخارجية: تم الاعتماد على وجود ملفات خارجية لتخزين البيانات، وهذا يعني أن أي تغييرات في تنسيق الملف يمكن أن تؤثر على طريقة عمل البرنامج.
  15. عدم وجود مستوى جيد من التعليقات: لم يتم إضافة تعليقات كافية لشرح وظيفة الأكواد المستخدمة، مما يجعل صعوبة فهم وتصحيح الأخطاء في البرنامج.
from Task import Task
from datetime import date
from tabulate import tabulate
from argparse import Namespace

class TaskController:
    def __init__(self, file_name):
        self.file_name = file_name

    def add_task(self, args):
        # 1 start date
        if not args.start_date:
            now = date.today().isoformat()
            args.start_date = now

        # 2 define task
        task = (args.title, args.description, args.start_date, args.end_date, args.done)

        # 3 open file and save info
        with open(self.file_name, 'a') as file:
            file.write(", ".join(str(x) for x in task) + "\n")

    def list_tasks(self):
        unfinished_tasks = []
        with open(self.file_name, 'r') as file:
            for line in file:
                title, description, start_date, end_date, done = line.strip().split(", ")
                end_date = None if end_date == 'None' else end_date
                done = False if done.strip() == 'False' else True
                if done:
                    continue
                unfinished_tasks.append({'title': title, 'description': description, 'start_date': start_date, 'end_date': end_date})
        return unfinished_tasks

    def list_all_tasks(self):
        all_tasks = []
        with open(self.file_name, 'r') as file:
            for line in file:
                title, description, start_date, end_date, done = line.strip().split(", ")
                end_date = None if end_date == 'None' else end_date
                done = False if done.strip() == 'False' else True
                all_tasks.append({'title': title, 'description': description, 'start_date': start_date, 'end_date': end_date, 'done': done})
        return all_tasks

    def due_date(self, start, end):
        start_date = date.fromisoformat(start)
        end_date = date.fromisoformat(end)
        due_date = end_date - start_date
        return f'{due_date.days} days left.'

    def print_table(self, tasks):
        formatted_tasks = []
        for number, task in enumerate(tasks, 1):
            if task['start_date'] and task['end_date']:
                due_date = self.due_date(task['start_date'], task['end_date'])
            else:
                due_date = 'Open'
            formatted_tasks.append({'no.': number, **task, 'due_date': due_date})
        print(tabulate(formatted_tasks, headers='keys'))

    def display(self, args):
        all_tasks = self.list_all_tasks()
        unfinished_tasks = self.list_tasks()

        if not all_tasks:
            print('There are no tasks. To add a task, use: add <task>')
            return
        if args.all:
            self.print_table(all_tasks)
        else:
            if unfinished_tasks:
                self.print_table(unfinished_tasks)
            else:
                print('All tasks have been completed!')

    def check_task(self, args):
        index = args.task
        tasks = self.list_all_tasks()
        if index <= 0 or index > len(tasks):
            print(f'Task number ({index}) does not exist!')
            return
        tasks[index - 1]['done'] = True
        with open(self.file_name, 'w') as file:
            for task in tasks:
                self.add_task(Namespace(**task))

   def remove_task(self, args):
        tasks = self.list_alltasks()
        if args.task:
            index = args.task
        else:
            index = len(tasks) - 1
        if index <= 0 or index > len(tasks):
            print(f'Task number ({index}) does not exist!')
            return
        tasks.pop(index - 1)
        with open(self.file_name, 'w') as file:
            for task in tasks:
                self.add_task(Namespace(**task))

def reset_task(self):
    with open(self.file_name, 'w') as file:
        file.write('')
        print('All tasks have been deleted!')

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...