برنامه نویسی

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

گشایش اعتبار

بعد از اینکه همه چیز کلیک کرد، پروژه را سرگرم کننده در نظر بگیرید. من یک پروژه CLI مشتری پسند ساختم تا بفهمم یک کلاس، متدها و ویژگی‌ها چگونه کار می‌کنند.

ساختار دایرکتوری من بسیار ساده بود:

└── lib
├── models
│ ├── __init__.py
│ └── actor.py
| └── movie.py
├── cli.py
├── debug.py
└── helpers.py
├── Pipfile
├── Pipfile.lock
├── README.md

همانطور که از ساختار می بینید، من یک انجمن یک به چند ایجاد کردم که در آن یک بازیگر فیلم های زیادی دارد. از این ارتباط منوی من وارد بازی شد.

  1. لیست فعلی بازیگران
  2. یک بازیگر اضافه کنید
  3. حذف یک بازیگر
  4. از برنامه خارج شوید

منوی بالا با تابعی به نام… 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 را با جستجو در جدول فیلم با استفاده از شناسه بازیگر بازیابی می‌کند. سپس فهرستی از اشیاء فیلم را برمی‌گرداند و یک رابطه «دارای-خیلی» بین بازیگر و فیلم برقرار می‌کند.

بلوک‌های کد مورد بحث، حوزه‌های اصلی پروژه بودند که در آنها بر درک بیشتر تمرکز کردم. به طور کلی این پروژه به عنوان یک تمرین خوب برای تقویت مهارت های من در پایتون عمل کرد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا