اولین CLI من. – انجمن DEV

گشایش اعتبار
بعد از اینکه همه چیز کلیک کرد، پروژه را سرگرم کننده در نظر بگیرید. من یک پروژه CLI مشتری پسند ساختم تا بفهمم یک کلاس، متدها و ویژگیها چگونه کار میکنند.
ساختار دایرکتوری من بسیار ساده بود:
└── lib
├── models
│ ├── __init__.py
│ └── actor.py
| └── movie.py
├── cli.py
├── debug.py
└── helpers.py
├── Pipfile
├── Pipfile.lock
├── README.md
همانطور که از ساختار می بینید، من یک انجمن یک به چند ایجاد کردم که در آن یک بازیگر فیلم های زیادی دارد. از این ارتباط منوی من وارد بازی شد.
- لیست فعلی بازیگران
- یک بازیگر اضافه کنید
- حذف یک بازیگر
- از برنامه خارج شوید
منوی بالا با تابعی به نام… menu()
که در من قرار داشت cli.py
فایل همراه با main()
که منوی CLI را به کاربر نشان می دهد:
def main():
while True:
welcome()
menu()
choice = input("> ").strip()
if choice == "1":
actor_list()
elif choice == "2":
add_actor()
elif choice == "3":
delete_actor()
elif choice == "4":
exit_program()
break
else:
print("Invalid choice. Try again.\n")
این تابع خاص اولین مورد از بسیاری از مواردی بود که حلقه while همراه با عبارات if/elif/else اجرا شد تا به کاربر ما این امکان را بدهد که به راحتی منوها را پیمایش کند.
را cli.py
سپس با چند بلوک کد مهم به پایان می رسد:
if __name__ == "__main__":
main()
این بلوک کد به مفسر ما (Python) می گوید که فقط در صورتی فایل ما را اجرا کند که از خط فرمان فراخوانی شود.
حمایت از بازیگران
همچنین توابع کمکی در این پروژه دخیل بودند که از حلقه while به همراه عبارات if/elif/else نیز استفاده می کردند. یکی به ویژه در نشان دادن سهولت پیمایش هنگام انتخاب به عنوان مثال لیست فعلی بازیگران ما برجسته است:
def actor_list():
actor_list = Actor.get_all()
if actor_list:
print("\n*** UPDATED LIST! ***")
for i, actor in enumerate(actor_list, start=1):
print(f"{i}. {actor.name}")
while True:
choice = input("Press 'a' to add an actor\n"
"Press 'b' for actor profile\n"
"Press 'c' to return to the main menu.\n"
"Press 'd' delete an actor.\n").lower()
if choice == 'a':
add_actor()
break
elif choice == 'b':
actor_profile()
break
elif choice == 'c':
return
elif choice == 'd':
delete_actor()
break
else:
print("Invalid choice. Please try again.")
else:
print("List empty!")
while True:
choice = input("Press 'a' or to add an actor\n"
"Press 'b' for main menu.\n").lower()
if choice == 'a':
add_actor()
break
elif choice == 'b':
return
else:
print("Invalid choice. Please try again.")
در اینجا نه تنها به حلقه while و عبارات if عادت کردم، بلکه با استفاده از enumerate() با یک حلقه for برای تکرار با یک شاخص در پایتون، از مزایای ظاهر و نظم بهره بردم که به همه لیست ها در سراسر پروژه اجازه می دهد تا یک لیست سفارش داده شده
نمایش چند کلاس
دو شخصیت اصلی ما البته بازیگر کلاس ها و فیلم هستند. هر دو از کدهای مشابهی از لحاظ متدهای کلاس هنگام ایجاد، به روز رسانی یا حذف نمونه ای از آن کلاس خاص تشکیل شده اند، اما تفاوت هایی وجود دارد:
بیایید کلاس فیلم خود را به عنوان مثال در نظر بگیریم:
class Movie:
all_movies = {}
def __init__(self, movie, genre, actor_id, id=None):
self.id = id
self.movie = movie
self.genre = genre
self.actor_id = actor_id
از آنجایی که ما مجموعه پروژه خود را داریم که در آن یک بازیگر فیلم های زیادی دارد، کلاس فیلم ما یک ویژگی منحصر به فرد خواهد داشت actor_id
پارامتر/ویژگی برای ایجاد ارتباط بین نمونه فیلم و یک بازیگر خاص که امکان ارجاع آسان به اطلاعات بازیگر را فراهم می کند.
اکنون به این بلوک کد در کلاس Actor خود نگاه کنید:
def movies(self):
from models.movie import Movie
sql = """
SELECT * FROM movie
WHERE actor_id = ?
"""
CURSOR.execute(sql, (self.id,),)
rows = CURSOR.fetchall()
return [
Movie.instance_from_db(row) for row in rows
]
در اینجا ما متد movies() خود را داریم که تمام فیلمهای مرتبط با نمونه فعلی Actor را با جستجو در جدول فیلم با استفاده از شناسه بازیگر بازیابی میکند. سپس فهرستی از اشیاء فیلم را برمیگرداند و یک رابطه «دارای-خیلی» بین بازیگر و فیلم برقرار میکند.
بلوکهای کد مورد بحث، حوزههای اصلی پروژه بودند که در آنها بر درک بیشتر تمرکز کردم. به طور کلی این پروژه به عنوان یک تمرین خوب برای تقویت مهارت های من در پایتون عمل کرد.