0 Kais Hasan نشر 2 مارس 2023 أرسل تقرير نشر 2 مارس 2023 يبدو أنك تقوم بتنفيذ البرنامج بدون تمرير أي شيء له، يجب عليك تمرير اسم التابع الذي تريد استعماله. للقيام بذلك عليك الذهاب في البداية إلى سطر الأوامر و كتابة التعليمة التالية: venv\Scripts\activate هذه التعليمة ستقوم بتفعيل البيئة الافتراضية التي قمت بإنشاءها، بعد ذلك علينا القيام بتنفيذ البرنامج كما يلي: مثلاً لنستعمل التابع list يمكننا كتابة ما يلي: python taskaty\app.py list طبعاً التطبيق الخاص بك يحوي على الكثير من الأخطاء المطبعية، و تنفيذ ما سبق سيعطي خطأ بسبب ذلك، حاول إيجاد الأخطاء المطبعية، إن vscode سيضع خط أصفر تحتها و بالتالي يجب عليك إيجادها بسهولة. كما أنه في حال كان هذا السؤال يتبع لأحد الفيديوهات من الدورات من فضلك قم بنشر سؤالك دائماً أسفل الدرس في قسم التعليقات و ليس هنا في قسم الأسئلة البرمجية العامة. اقتباس
0 Mustafa Suleiman نشر 2 مارس 2023 أرسل تقرير نشر 2 مارس 2023 بالإضافة إلى الخطوات التي أشار إليها 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 بعد إصلاح الأخطاء التالية: استخدام متغيرات غير معرفة في الدوال: تم استخدام متغيرات غير معرفة في دالة list_alltasks()، والتي قام المبرمج بتسميتها بـ finished_tasks بدلاً من unfinished_tasks التي تم تعريفها في الدالة. خطأ في تعريف الدوال: تم تعريف دالة check_task() ولم يتم استخدام البارامتر args الموجود في تعريفها داخل الدالة، بل تم استخدام self.args بدلاً من ذلك. خطأ في اسم الدالة: تم تعريف دالة list_tasks() ولم يتم استخدام الاسم الصحيح للدالة، حيث استخدم اسم all_tasks بدلاً من unfinished_tasks الذي تم تعريفها. استخدام دالة غير موجودة: تم استخدام دالة list_all_tasks() بدلاً من list_alltasks() في الدالة remove_task(). استخدام self.args بدلاً من args: تم استخدام self.args بدلاً من args في الدالة check_task(). استخدام نوع البيانات الخاطئ: تم استخدام دالة date.fromisofromat() و date.formisoformat() بدلاً من date.fromisoformat() و date.isoformat() في الدالة due_date(). خطأ في استخدام الدالة print_table(): تم استخدام الدالة print_table() بدون استخدام البارامتر tasks في الدالة display(). استخدام tasks بدلاً من task: تم استخدام tasks بدلاً من task في الدالة remove_task()، والتي تم تعريفها كمتغير لحذف مهمة واحدة، وبالتالي أدت إلى القيام بحذف جميع المهام في الملف. عدم إدخال البيانات بالشكل الصحيح في الملف: تم حفظ البيانات في الملف في صورة سلسلة محولة، بدلاً من استخدام أي شكل من أشكال تخزين البيانات الهيكلية (على سبيل المثال، JSON أو CSV). عدم استخدام argparse بشكل صحيح: تم استخدام argparse للتعرف على المدخلات المستخدمة، ولكن تحديد الخيارات والوسائط التي تم استخدامها من خلال الأرقام الثابتة، وليس باستخدام الخيارات الاسمية. وهذا يعني أن أي تغيير في ترتيب الخيارات يؤثر على طريقة عمل البرنامج. عدم التحقق من صحة المدخلات: لم يتم التحقق من صحة المدخلات المستخدمة، مثل التحقق من تنسيق التاريخ المدخل أو القيم المدخلة للخيارات. تعقيد المنطق المستخدم في البرنامج: تم استخدام مجموعة متنوعة من الأساليب لإنجاز المهام المطلوبة، مما يصعب فهم كيفية عمل البرنامج وتصحيح الأخطاء في حالة وجودها. عدم استخدام معايير جيدة لتسمية المتغيرات: تم استخدام أسماء متغيرات غير واضحة، مما يصعب فهم دور كل متغير في البرنامج. الاعتماد على العوامل الخارجية: تم الاعتماد على وجود ملفات خارجية لتخزين البيانات، وهذا يعني أن أي تغييرات في تنسيق الملف يمكن أن تؤثر على طريقة عمل البرنامج. عدم وجود مستوى جيد من التعليقات: لم يتم إضافة تعليقات كافية لشرح وظيفة الأكواد المستخدمة، مما يجعل صعوبة فهم وتصحيح الأخطاء في البرنامج. 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!') اقتباس
السؤال
عصام العربي2
Taskaty.rar
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.