.

iT邦幫忙

1

python :if __name__ == "__main__"

  • 分享至 

  • xImage
  •  
  • if __name__ == "__main__"是什麼?
  • 在什麼時候需要使用 if __name__ == "__main__"?
  • 以及是否每個檔案都需要使用它?

if __name__ == "__main__"是什麼?

常被稱為:

  • 主程序入口判斷
  • 主模組判斷
  • 程式執行入口
  • 模組測試代碼
  • if __name__ == "__main__"是一個條件判斷語句
  • 用於當你希望某些程式碼僅在檔案被直接執行時才運行,而在該檔案被匯入import為模組時不執行。

__name__ 是什麼?

  • 是 Python 的一個特殊內建變數,用於表示當前模組的名稱:
  • 當檔案被直接執行時,name 的值為 "main"。
  • 當檔案被匯入為模組時,name 的值為該模組的名稱(字串)。
    比喻說明:
  • 當你“直接”讀這本書時,書會在封面上寫著:「我的名字是 main」。
  • 當你把這本書的故事拿去給別人用時,書的封面會寫上它的書名,例如:「我的名字是 my_story」。

因此if __name__ == "__main__"這句話就像是在問:

「如果這本書的名字是 __main__,也就是說,你正在直接讀我,那麼請讀下面的內容。」

這樣,只有在你"直接"讀這本書的時候,才會讀到這部分的內容;
如果你只是把這本書的故事拿去用,這些內容就不會被讀到。

這意味著 只有在直接執行這個檔案時,位於該條件下的程式碼才會被執行;如果是被匯入,則不會執行。

例子:我的故事書 my_story.py:

def tell_story():
    print("從前從前,有一個小朋友愛聽故事。")

if __name__ == "__main__":
    print("開始講故事:")
    tell_story()

情況一:直接讀這本書
當你執行這本書時(直接運行 my_story.py),書會說:

開始講故事:
從前從前,有一個小朋友愛聽故事。

情況二:把故事拿給別人用
當別人在他們的程式中寫:

import my_story

my_story.tell_story()

他們執行程式時,只會看到:

從前從前,有一個小朋友愛聽故事。

注意: 他們不會看到「開始講故事:」,因為 if name == "main": 下的內容不會被執行。

為什麼要這樣做?

這樣做可以讓你的程式有雙重功能:

  • 作為主程式:當你想要直接執行這個檔案時,它可以運行一些測試或展示的程式碼。
  • 作為模組:當別人想要使用你的函式或變數時,他們可以匯入你的檔案,而不會受到你主程式部分的影響。
    優點:
  • 使用該結構,可以清楚地分離模組的介面(函式、類別定義等)和執行邏輯,有助於他人理解你的程式碼。
  • 防止副作用:避免在模組被匯入時執行不需要的程式碼,這可能導致預期外的行為。
  • 提高模組的可重用性:使模組既可被匯入使用,又可在直接執行時進行測試或提供範例。
  • 改善程式的結構:清楚地分離模組的介面(供匯入的部分)和執行邏輯。

在什麼時候需要使用 if __name__ == "__main__"?

  1. 當檔案既可被匯入又可直接執行
    如果你的 Python 檔案可以被其他程式匯入,也可以直接執行,那麼使用 if name == "main": 來控制直接執行時的行為是很重要的。
# calculator.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

if __name__ == "__main__":
    # 只有在直接執行時才會運行的程式碼
    num1 = float(input("請輸入第一個數字:"))
    num2 = float(input("請輸入第二個數字:"))
    print(f"加法結果:{add(num1, num2)}")
    print(f"減法結果:{subtract(num1, num2)}")
  • 直接執行 calculator.py:會要求使用者輸入數字,然後輸出計算結果。
  • 在其他檔案中匯入 calculator.py:add 和 subtract 函式可被使用,但不會執行輸入和輸出部分。
  1. 當你想要在直接執行時進行測試或示範
    如果你希望在模組中包含一些測試或範例,讓其他開發者在直接執行時可以看到功能的用法。
# string_utils.py

def to_uppercase(s):
    return s.upper()

if __name__ == "__main__":
    # 測試或範例程式碼
    sample = "hello world"
    print(f"原始字串:{sample}")
    print(f"大寫字串:{to_uppercase(sample)}")

直接執行 string_utils.py 時:會顯示範例輸出。
匯入 string_utils.py模組:只提供 to_uppercase 函式,不會執行範例程式碼。

不需要使用的情況:

  • 純模組: 只定義了函式、類別、變數,不包含需要直接執行的程式碼。
    範例:設定檔 config.py
# config.py

DATABASE_URI = "sqlite:///:memory:"
API_KEY = "your_api_key_here"

用途: 提供變數或設定,供其他程式匯入。
不需要 if name == "main",因為沒有需要執行的程式碼。

  • 一次性腳本: 僅作為腳本執行,沒有被匯入的需求。

總結

  • if name == "main" 是一個條件判斷語句,用於當你希望某些程式碼 僅在檔案被直接執行時 才運行,而在該檔案被匯入為模組時不執行。

  • 使用時機:

  • 需要使用:
    • 當檔案既可被匯入又可直接執行。
    • 希望在直接執行時進行測試或示範。
  • 不需要使用:
    • 純模組:只定義函式、類別或變數,無需直接執行。
    • 一次性腳本:專為直接執行設計,不會被匯入。
  • 作用:
    • 防止副作用: 避免在匯入時執行不必要的程式碼。
    • 提高模組的可重用性: 使模組既可被匯入,又可在直接執行時進行測試。
    • 改善程式的結構: 清晰地分離模組的介面和執行邏輯。

下一篇python : PyPI & pip


圖片
  直播研討會

尚未有邦友留言

立即登入留言