"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 나의 첫 CLI.

나의 첫 CLI.

2024-11-03에 게시됨
검색:233

My first CLI.

오프닝 크레딧

모든 것이 클릭되는 순간, 프로젝트가 재미있다고 생각하세요. 클래스, 메서드 및 속성이 작동하는 방식을 파악하기 위해 클라이언트 친화적인 CLI 프로젝트를 구축했습니다.

내 디렉토리 구조는 매우 간단했습니다.

└── lib
├── 모델
│ ├── __init__.py
│ └── actor.py
| └── movie.py
├── cli.py
├── debug.py
└── helpers.py
├── 핍파일
├── Pipfile.lock
├── README.md

구조에서 볼 수 있듯이 저는 배우가 많은 영화를 보유하는 일대다 연관을 구축했습니다. 이 협회에서 내 메뉴가 작동하게 되었습니다.

  1. 현재 배우 목록
  2. 배우 추가
  3. 배우 삭제
  4. 프로그램 종료

위 메뉴는 사용자에게 CLI 메뉴를 표시하는 main()과 함께 내 cli.py 파일에 있는... menu()라는 함수로 정의되었습니다.

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")

이 특정 기능은 사용자가 메뉴를 쉽게 탐색할 수 있도록 if/elif/else 문과 함께 while 루프를 실행한 많은 기능 중 첫 번째 기능입니다.

cli.py는 다음과 같은 중요한 코드 블록으로 마무리됩니다.

if __name__ == "__main__":
    main() 

이 코드 블록은 파일이 명령줄에서 호출되는 경우에만 파일을 실행하도록 인터프리터(Python)에 지시합니다.

조연

이 프로젝트에는 if/elif/else 문과 함께 while 루프를 사용하는 도우미 함수도 있었습니다. 특히 현재 액터 목록을 선택할 때 탐색의 용이성을 보여주는 점이 눈에 띕니다.

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 문에 익숙해졌을 뿐만 아니라 for 루프와 함께 enumerate()를 사용하여 프로젝트 전체에 걸쳐 모든 목록을 허용하는 Python의 인덱스로 반복함으로써 모양과 순서의 이점을 얻었습니다. 순서가 있는 목록이 됩니다.

일부 클래스 표시

우리의 두 주인공은 당연히 배우와 영화입니다. 둘 다 특정 클래스의 인스턴스를 생성, 업데이트 또는 삭제할 때 클래스 메서드 측면에서 유사한 코드로 구성되지만 차이점이 있습니다.

예를 들어 영화 클래스를 살펴보겠습니다.

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
        ]

여기서 movie() 메서드는 배우의 ID를 사용하여 영화 테이블을 쿼리하여 현재 Actor 인스턴스와 관련된 모든 영화를 검색합니다. 그러면 Movie 개체 목록이 반환되어 Actor와 Movie 사이에 "has-many" 관계가 설정됩니다.

논의된 코드 블록은 제가 더 많은 이해를 얻는 데 중점을 둔 프로젝트의 주요 영역이었습니다. 전반적으로 이 프로젝트는 Python 기술을 향상시키는 데 좋은 연습이 되었습니다.

릴리스 선언문 이 글은 https://dev.to/wormondeck/my-first-cli-2if?1 에서 복제하였습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제해 주시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3