«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Мой первый CLI.

Мой первый CLI.

Опубликовано 3 ноября 2024 г.
Просматривать:420

My first CLI.

Вступительные титры

Как только все получится, считайте проект интересным. Я создал удобный для клиента проект CLI, чтобы понять, как работают классы, методы и свойства.

Моя структура каталогов была довольно простой:

└── библиотека
├── модели
│ ├── __init__.py
│ └── act.py
| └── movie.py
├── cli.py
├── debug.py
└── helpers.py
├── Пип-файл
├── 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 для перебора с индексом в Python, позволяя создавать все списки по всему проекту. быть упорядоченным списком.

Покажите немного класса

Два наших главных героя, конечно же, — это Классы «Актер» и «Кино». Оба состоят из схожего кода с точки зрения методов класса при создании, обновлении или удалении экземпляра этого конкретного класса, но есть различия:

В качестве примера возьмем наш класс Movie:

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

Поскольку у нас есть настройка проекта, в которой у актера есть много фильмов, наш класс фильма будет иметь уникальный параметр/атрибут act_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() извлекает все фильмы, связанные с текущим экземпляром актера, путем запроса таблицы фильмов с использованием идентификатора актера. Затем это вернет список объектов Movie, устанавливая связь «имеет много» между Actor и Movie.

Обсуждаемые блоки кода были основными областями проекта, в которых я сосредоточился на более глубоком понимании. В целом этот проект послужил хорошим упражнением для улучшения моих навыков работы с Python.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/wormondeck/my-first-cli-2if?1. Если обнаружено какое-либо нарушение прав, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3