مرحباً جميعاً
المهمة المطلوبة
بإمكانك الإطلاع على المهمة المطلوبة من هنا
بإمكانك الإطلاع على المهمة المطلوبة من هنا
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
# get all posts
return posts
def add(self, post):
# append post
posts.append(post)
return posts
def get_by_id(self, id):
# search for post by id - id البحث عن منشور بالمعرف
result = None
for post in posts:
if post.id == id:
result = post
break
return result
عمل رائع يا اسماء… لا ملاحظات, انتقلي للتالي
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
for post in posts:
return post
def add(self, post):
self.post = post
posts.append(post)
return posts
def get_by_id(self, id):
result = None
self.id = id
for post in posts:
if post[0] == id:
result = post
break
return result
بالتأكيد !
تستعملي PyCharm أو VSCode ؟
لدي مشكلة في دالة get_by_id انها لا ترجع الناتج الصحيح
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
# get all posts - الحصول على كل المنشورات
return posts
def add(self, post):
# append post - إضافة منشور
posts.append(post)
return posts
def get_by_id(self, id):
# search for post by id - id البحث عن منشور بالمعرف
result = None
for post in posts:
if post.id == id:
result = post
break
return result
وعند تشغيل ملف store_tests.py يظهر هذا الخطأ AssertionError
واعتقد السبب داله get_by_id ايضا
نعم المشكلة في دالة get_by_id
قمت بتجربة الأكواد والمشكلة بسيطة وصغيرة جداً، لاحظ هذا الجزء:
for post in posts:
if post.id == id:
result = post
break
أنت تقوم بعمل break في بداية الحلقة، أي أنها غير مرتبطة بالشرط… الصحيح هو:
for post in posts:
if post.id == id:
result = post
break
لاحظ الفرق بين الاثنين الأكواد
lass post:
def __init__(self, id, name, photo, body):
self.id = id
self.name = name
self.photo = photo
self.body = body
posts = []
class poststore:
def get_by_id(self, id):
result = None
for post in posts:
if post.id == id:
result = post
break
return result
def add(self, post):
self.post = post
posts.append(post)
return posts
def get_all(self):
return posts
كل شيء مضبوط يا على
بالنسبة لأسماء الكلاسات، فحسب pep8 الذي كتبه مؤلفي لغة بايثون، يفنرض أن تكون بهذا الشكل:
Post
PostStore
كل كلمة تبدأ بالحرف كبير… للإطلاع على pep8 (فيها إجماع convention على أمور مختلفة في اللغة).
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
# get all posts - الحصول على كل المنشورات
return posts
def add(self, post):
# append post - إضافة منشور
posts.append(post)
return posts
def get_by_id(self, id):
# search for post by id - id البحث عن منشور بالمعرف
result = None
for post in posts:
if self.id == id:
result = post
break
return result
ملا حظة: لماذا نستخدم break من البداية أنا أرى مستخدمي مجتمع كورتابز يستعملونها لأنني أول مرة أتعلم فيها بايثون
تقوم break بإيقاف الحلقة لأننا أوجدنا المنشور المطلوب (الذي يطابق الـ id خاصته القيمة).
بالنسبة للشرط:
if self.id == id:
فهو غير صحيح، لأنه يقوم بمقارنة الـ id مع الـ object نفسه (self) وليس مع العناصر التي داخل القائمة
شكرا على معللومة جديدة
بارك الله فيك
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
# get all posts - الحصول على كل المنشورات
return posts
def add(self, post):
# append post - إضافة منشور
posts.append(post)
return posts
def get_by_id(self, id):
result = None
for post in posts:
if post.id==id:
result=post
break
return result
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
posts = []
class PostStore:
def get_all(self):
# get all posts - الحصول على كل المنشورات
for post in posts :
return post
def add(self, post):
# append post - إضافة منشور
posts.append(post)
return posts
def get_by_id(self, id):
# search for post by id - id البحث عن منشور بالمعرف
result = None
for post in posts :
if post.id == id :
result = post
break
return result
عمل جميل يا ArijTrabelsi
thank you a lot
أعرف إنني لم ألتزم بـ (إرجاع واحد للدالة)، لكن أرى الكود بهذا الشكل readable أكثر
كمان، إذا غيرت الـ index في ملف stroe_test.py ، بحيث أجلب بوست بمعرف 3 ويزيد، يطلع معي error، كيف اتخلص من هذه المشكلة؟
class Post:
def __init__(self, id, photo_url, name, body):
self.id = id
self.photo_url = photo_url
self.name = name
self.body = body
class PostStore:
def get_all(self):
return posts
def add(self, post):
posts.append(post)
def get_by_id(self, id):
for post in posts:
if post.id == id:
return post
return None
def update(self, id, fields):
pass
def delete(self, id):
pass
posts = []
......
الأكواد تبدو جيدة يا ابرار
ماهي التغييرات التي قمتي بها بالضبط على ملف store_test؟
retrieved_second_post = post_store.get_by_id(3)
كان تساؤلي في حالة ما إذا طلبت “ثالث” بوست وهو مش موجود"ثالث بوست أو أكبر منه"
ليش الـ None العائدة من دالة get_by_id ما حافظت لي على صحة الكود، لكن فهمت الآن إنه الـ assert في السطر التالي هي السبب في الخطأ الحاصل، ايش فائدتها هنا، ليش استخدمت للمقارنة؟