」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我的第一個 CLI。

我的第一個 CLI。

發佈於2024-11-03
瀏覽:674

My first CLI.

片頭字幕

一旦一切順利,就認為這個專案很有趣。我建立了一個客戶端友善的 CLI 專案來掌握類別、方法和屬性的工作原理。

我的目錄結構非常簡單:

└── lib
├── 型號
│ ├── __init__.py
│ └── actor.py
| └── 電影.py
├── cli.py
├── 調試.py
└── helpers.py
├── Pipfile
├── Pipfile.lock
├── README.md

正如您從結構中看到的,我建立了一個一對多關聯,其中一個演員有很多電影。從這個協會我的菜單開始發揮作用。

  1. 現任演員名單
  2. 新增演員
  3. 刪除演員
  4. 退出程序

上面的選單是由一個名為... menu() 的函數定義的,該函數位於我的 cli.py 檔案中,與向使用者顯示 CLI 選單的 main() 一起:

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

由於我們的項目設定中一個演員有很多電影,所以我們的電影類將有一個唯一的 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 之間建立「有多」關係。

討論的程式碼區塊是這個專案的主要領域,我專注於掌握更多理解。總的來說,這個專案是一個很好的練習,可以增強我的 python 技能。

版本聲明 本文轉載於:https://dev.to/wormondeck/my-first-cli-2if?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何推遲載入大型 CSS 檔案以提高頁面效能?
    如何推遲載入大型 CSS 檔案以提高頁面效能?
    優化CSS交付:了解延遲CSS加載優化CSS交付時,在頁面加載後延遲加載大型CSS文件可以顯著提高頁面效能。雖然 Google 開發人員提供的範例演示​​了內聯小型 CSS 檔案以實現關鍵樣式,但它留下瞭如何推遲較大 CSS 檔案的問題。 加載後訪問原始CSS 文件要將大型CSS 文件的加載推遲到頁...
    程式設計 發佈於2024-11-15
  • 為什麼我注入的 CSS 在我的內容腳本中不起作用?
    為什麼我注入的 CSS 在我的內容腳本中不起作用?
    內容腳本中的CSS 注入問題疑難解答透過內容腳本將自訂CSS 注入網頁可能是擴展瀏覽器功能的有用技術。但是,如果注入的 CSS 不可見或不應用,則可能會令人沮喪。本文旨在解決可能出現此問題的原因並提供潛在的解決方案。 症狀:您已將內容腳本配置為注入 CSS 文件,但它確實如此不會出現在目標網頁上。 ...
    程式設計 發佈於2024-11-15
  • Javascript 基元其實是物件嗎?
    Javascript 基元其實是物件嗎?
    Javascript 基元與物件:澄清概念Javascript 基元與物件:澄清概念儘管普遍認為“Javascript 中幾乎所有內容都是物件”,但並非所有內容語言中的實體遵循這個定義。基元和物件之間的區別需要澄清。 基元與物件相反,基元是以其基本形式存在的不可變值。它們缺乏方法和屬性,並包含以下資...
    程式設計 發佈於2024-11-15
  • 為什麼 C++ 中的聯合內禁止使用 `std::string` 物件?
    為什麼 C++ 中的聯合內禁止使用 `std::string` 物件?
    為什麼std::string 在聯合中被禁止在C 程式設計領域,聯合是一種特殊的結構,它允許在聯合中儲存各種數據類型共享記憶體地址。然而,當涉及聯合中的成員時,有一個有趣的限制:禁止具有非平凡構造函數的類,包括 std::string。 非平凡構造函數的問題根本原因可以追溯到工會的性質。聯合體中的成...
    程式設計 發佈於2024-11-15
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-15
  • 我們能否在正規表示式中實現真正的可變長度向後尋找?
    我們能否在正規表示式中實現真正的可變長度向後尋找?
    正規表示式的可變長度回顧斷言替代方案正規表示式中的可變長度回顧斷言,用(?具有正規表示式模組的 PythonPython 正規表示式模組提供可變長度後向斷言的支援。 import regex m = regex.search('(?<!foo.*)bar', 'f00bar') pr...
    程式設計 發佈於2024-11-15
  • 您應該為您的應用程式選擇哪種地理鄰近度公式?
    您應該為您的應用程式選擇哪種地理鄰近度公式?
    地理位置鄰近度計算:公式比較在開發地理位置鄰近度搜尋時,了解公式選項之間的細微差別至關重要。雖然大圓距離公式和半正矢公式曾經被認為是同義詞,但它們之間存在一些微妙的區別,這些區別會影響速度、準確性和效率。 公式比較用於地理計算的三個主要公式鄰近度計算為:1。半正弦公式:d = 2r * arcsin...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-15
  • 如何使用 Twitter Bootstrap 對齊表格中的文字?
    如何使用 Twitter Bootstrap 對齊表格中的文字?
    Twitter Bootstrap 中的表格文字對齊在Twitter 的Bootstrap 架構中,您可以使用指定的文字對齊類別來對齊表格內的文本。 Bootstrap 3text-left:左對齊文字text-center:居中對齊文字text -right:右對齊文字Bootstrap 4te...
    程式設計 發佈於2024-11-15
  • 如何讓 CSS 中的空白表格儲存格的邊框可見?
    如何讓 CSS 中的空白表格儲存格的邊框可見?
    我可以在 CSS 中讓空白儲存格的邊框可見嗎? 在 Internet Explorer 7 中,預設可能不會顯示空白儲存格的邊框。不過,有幾種方法可以解決此問題。 使用不間斷空格如果可行,請插入不間斷空格 ( )進入空單元格可以強制瀏覽器渲染帶有邊框的單元格。 純 CSS解決方案對於純CSS解決方案...
    程式設計 發佈於2024-11-15
  • 如何將 Python 清單轉換為 CSV 檔案?
    如何將 Python 清單轉換為 CSV 檔案?
    將Python 清單清單匯出至CSV 檔案將Python 清單清單轉換為CSV 檔案,確保每個子清單中都會保留不同類型(浮點型、整數型、字串型)的資料。所需的 CSV 格式涉及使用逗號分隔每個子清單中的元素並垂直對齊子清單。 要實現此目的,您可以利用 Python 的內建 csv 模組:import...
    程式設計 發佈於2024-11-15
  • 測試限制:了解軟體測試的邊界
    測試限制:了解軟體測試的邊界
    软件测试是确保软件质量、稳定性和功能的开发过程的重要组成部分。然而,尽管测试很重要,但它也有其局限性。虽然它可以揭示缺陷,但它不能保证应用程序完全没有错误。了解这些限制有助于企业和开发人员设定切合实际的期望并优化他们的测试流程。在本文中,我们将探讨软件测试的主要局限性及其带来的挑战。 无法测试每个...
    程式設計 發佈於2024-11-15
  • 如何有效地將檔案載入到`std::vector`中?
    如何有效地將檔案載入到`std::vector`中?
    有效率地將檔案載入到std::vector有效率地將檔案載入std::vector ,必須避免不必要的複製和記憶體重新分配。雖然利用 Reserve 和 read() 的原始方法看起來可能很直接,但單獨的 Reserve() 並不會改變向量的容量。 使用迭代器的規範方法:規範方法使用輸入流迭代器來方...
    程式設計 發佈於2024-11-15
  • 如何在 Go 中將陣列元素直接解壓縮為變數?
    如何在 Go 中將陣列元素直接解壓縮為變數?
    在 Go 中解包數組元素Go 缺乏將數組元素直接解包到 Python 中的變數的便捷語法。雖然提問者使用中間變數的初始方法有效,但它可能會導致程式碼混亂,尤其是在複雜的場景中。 多個回傳值為了解決這個問題,建議使用解決方案是建立一個傳回多個值的函數。例如,要拆分字串並將結果解壓縮為兩個變量,可以使用...
    程式設計 發佈於2024-11-15
  • 「n:m」和「1:n」關係如何塑造資料庫設計?
    「n:m」和「1:n」關係如何塑造資料庫設計?
    理解關聯式資料庫設計:「n:m」與「1:n」的意義在資料庫設計中,符號「 n :m」和「1:n」在表示表或實體之間的關係方面起著至關重要的作用。這些符號表示它們關聯的基數。 "n:m" 關係:多對多「n:m」關係表示多對多兩個資料實體之間的對多關聯。這意味著對於一個表中的每個實體...
    程式設計 發佈於2024-11-15

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3