Python腳本必加代碼:99%的程序員都忽視了這個細節!

在這里插入圖片描述

文章目錄

  • 一、初識 if __name__ == '__main__'
  • 二、__name__ 和 __main__ 是什么?
  • 三、實戰講解
  • 四、實際應用場景
    • 測試代碼
    • 提高代碼可重用性
    • 避免不必要的執行
  • 五、深入理解和更多用法
    • 使用 argparse 解析命令行參數
    • 使用 unittest 進行單元測試
    • 使用 multiprocessing 創建子進程
  • 六、結語

今天,我要和大家聊聊一個在Python編程中看似不起眼,但其實非常關鍵的小技巧——if __name__ == '__main__'

一、初識 if name == ‘main

讓我們先來看看這個神奇的代碼行:

if __name__ == '__main__':# 這里是程序的主入口main()

這行代碼,雖然簡單,卻蘊含著Python編程的精髓。它的作用是確保某些代碼塊只在模塊作為主程序運行時執行,而不是在被其他模塊導入時執行。

二、namemain 是什么?

  • __name__ 變量

    每個Python模塊都有一個內置屬性__name__,它的值就是模塊的名字。如果模塊是被導入的,那么__name__通常是模塊的文件名,不包括路徑和文件擴展名。

  • __main__

    當一個模塊被直接運行時,Python會將特殊變量__name__賦值為'__main__'。這意味著,如果你運行一個腳本文件,__name__將被設置為'__main__'。而如果該模塊是被導入的,那么__name__將被設置為模塊的名字。

三、實戰講解

在這里插入圖片描述

示例 1:沒有 if __name__ == '__main__'

假設我們有以下代碼:

# example.py
print("This will always be executed")
def main():print("This will also be executed")
main()

當你運行example.py

$ python example.py
This will always be executed
This will also be executed

現在,如果我們創建另一個腳本來導入example.py

# test_import.py
import example

運行test_import.py

$ python test_import.py
This will always be executed
This will also be executed

可以看到,不論是直接運行example.py,還是通過test_import.py導入,example.py里的所有代碼都會被執行。這顯然不是我們想要的結果。

示例 2:使用 if __name__ == '__main__'

我們來改進一下example.py

# example.py
print("This will always be executed")
def main():print("This will be executed only if run directly")
if __name__ == '__main__':main()

再次運行example.py

$ python example.py
This will always be executed
This will be executed only if run directly

然后運行test_import.py

$ python test_import.py
This will always be executed

我們發現,當example.py被導入時,main()函數不會被執行。這樣就達到了區分直接運行和導入執行的目的。

四、實際應用場景

在這里插入圖片描述

測試代碼

在開發過程中,我們經常需要測試代碼段。通過if __name__ == '__main__',我們可以方便地在模塊底部添加測試代碼,而不用擔心它們在模塊被導入時執行:

# math_functions.py
def add(a, b):return a + b
def subtract(a, b):return a - b
if __name__ == '__main__':print("Testing add function:")print(add(1, 2))  # Should output 3print("Testing subtract function:")print(subtract(5, 3))  # Should output 2

提高代碼可重用性

很多時候,我們編寫的腳本不僅僅是一次性運行的工具,而是需要被其他模塊調用的函數庫。if __name__ == '__main__'可以保證模塊在導入時不會執行測試代碼或其他非必要代碼,提高代碼的可重用性。

避免不必要的執行

當我們有一段需要耗時或影響全局狀態的代碼時,避免在導入時執行就顯得尤為重要:

# data_analysis.py
import pandas as pd
def load_data(filepath):data = pd.read_csv(filepath)return data
if __name__ == '__main__':filepath = 'data.csv'data = load_data(filepath)print(data.head())

在導入data_analysis.py時,不會自動加載數據文件,只有調用模塊的相應方法才會加載數據,避免了不必要的資源占用。

五、深入理解和更多用法

使用 argparse 解析命令行參數

在寫腳本工具時,常常需要解析命令行參數。我們可以結合if __name__ == '__main__'來實現這一功能:

# script.py
import argparse
def main():parser = argparse.ArgumentParser(description="A sample command-line tool")parser.add_argument('name', type=str, help='Your name')args = parser.parse_args()print(f'Hello, {args.name}!')
if __name__ == '__main__':main()

通過命令行運行腳本:

$ python script.py Alice
Hello, Alice!

使用 unittest 進行單元測試

在模塊中添加單元測試,用if __name__ == '__main__'來運行測試:

# test_math_functions.py
import unittest
from math_functions import add, subtract
class TestMathFunctions(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)def test_subtract(self):self.assertEqual(subtract(5, 3), 2)
if __name__ == '__main__':unittest.main()

運行測試:

$ python test_math_functions.py

使用 multiprocessing 創建子進程

當我們需要并行處理時,使用 multiprocessing 模塊時也需要注意if __name__ == '__main__'的使用:

# parallel_script.py
import multiprocessing
def worker(num):print(f'Worker: {num}')
if __name__ == '__main__':jobs = []for i in range(5):p = multiprocessing.Process(target=worker, args=(i,))jobs.append(p)p.start()

如果不加if __name__ == '__main__',在Windows系統上運行會導致無限遞歸創建子進程,最終導致崩潰。

六、結語

if __name__ == '__main__'是Python中一個簡單卻非常重要的習慣用法,它不僅可以讓我們的代碼更加清晰和模塊化,還能避免許多潛在的問題和錯誤。

通過本文的多個示例,相信大家對if __name__ == '__main__'的理解更加深入,并能在實際開發中靈活運用。

原文:https://mp.weixin.qq.com/s/-ckOrOBkY8f7V8ltkOyxLQ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15664.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c#入門學習筆記

p35 字符串 在字符串之前加上一個,可以保持原生字符,不用再進行轉義(除了雙引號)。 例如: "A short list: item 1 item 2"或者: "C:\Temp\MyDir\MyFile.doc"這相當于"C:\\Tem…

網盤攻略,羊毛薅到底,這4招太狠了

僅供參考 先買原石會員賬戶,再綁手機。 自己手機千萬不要去注冊115,先去馬云家買原石會員帳戶(五十多自帶33T永久空間,非常實惠)。買完原石帳戶后再用手機登錄綁定帳戶和修改密碼。買8T永久空間8年VIP 然后再花560元買8T永久空間8年vip&…

嵌入式全棧開發學習筆記---C語言筆試復習大全22

目錄 結構體 結構體的聲明 定義結構體變量 訪問結構體成員進行初始化 通過結構體變量名訪問結構體成員 結構體指針 結構體指針的定義 通過結構體指針訪問結構體成員 結構體數組 結構體數組的定義 遍歷結構體數組 結構體的長度(筆試重點) 上一…

深入理解C++多態-虛函數

引言 C多態的實現方式可以分為靜態多態和動態多態,其中靜態多態主要有函數重裝和模板兩種方式,動態多態就是虛函數。下面我們將通過解答以下幾個問題的方式來深入理解虛函數的原理: 為什么要引入虛函數?(用來解決什么…

2024年最新信息安全標準匯總

這些標準是我們在數字化時代保障網絡安全、數據安全的重要基石,對于維護國家安全、企業利益和個人信息安全具有至關重要的作用。 隨著科技的快速發展,網絡空間的安全威脅也在不斷演變,從復雜的網絡攻擊到個人信息泄露,這些安全風…

JAVA面試題大全(十四)

1、Kafka 可以脫離 Zookeeper 單獨使用嗎?為什么? kafka不能脫離zookper單獨使用,因為kafka使用zookper管理和協調kafka的節點服務器。 2、Kafka 有幾種數據保留的策略? Kafka提供了多種數據保留策略,這些策略用于定…

哈希雙指針

文章目錄 一、哈希1.1兩數之和1.2字母異位詞分組1.3最長子序列 二、雙指針2.1[移動零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

嵌入式0基礎開始學習 ⅠC語言(7)指針

0.問題引入 int a 5; a 1024; //把1024存放到變量a的地址中去 b a; // 取變量a的值,賦值給b >在c語言中,任何一個變量,都有兩層含義 (1)代表變量的存儲單元的地址:變量的地址…

藍橋樓賽第30期-Python-第三天賽題 統計學習數據題解

樓賽 第30期 Python 模塊大比拼 統計學習數據 介紹 JSON(JavaScript Object Notation, /?d?e?s?n/)是一種輕量級的數據交換格式,最初是作為 JavaScript 的子集被發明的,但目前已獨立于編程語言之外,成為了通用的…

分享10個國內可以使用的GPT中文網站

在今天的人工智能領域,基于對話的語言模型已成為研究的熱點,尤其是像 ChatGPT 這樣因其出色的語言理解與對話交互能力而廣受關注的模型。本文將介紹10個國內可以直接使用GPT的網站,旨在為大家在選擇和使用這些優秀的AI工具時提供有價值的參考…

使用pyqt繪制一個愛心!

使用pyqt繪制一個愛心! 介紹效果代碼 介紹 使用pyqt繪制一個愛心! 效果 代碼 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…

[保姆式教程]使用目標檢測模型YOLO V8 OBB進行旋轉目標的檢測:訓練自己的數據集(基于衛星和無人機的農業大棚數據集)

最近需要做基于衛星和無人機的農業大棚的旋轉目標檢測,基于YOLO V8 OBB的原因是因為嘗試的第二個模型就是YOLO V8,后面會基于YOLO V9模型做農業大棚的旋轉目標檢測。YOLO V9目前還不能進行旋轉目標的檢測,需要修改代碼 PS:歡迎大家分享農業大…

【研發日記】Matlab/Simulink技能解鎖(九)——基于嵌入式處理器仿真

文章目錄 前言 基于嵌入式處理器仿真 使用方式 第一步,硬件連接 第二步,配置硬件資源 第三步,配置XCP協議 第四步,加載Contrl Model 第五步,運行仿真 第六步,仿真報告 分析和應用 總結 參考資料 前言…

無線技術整合到主動噪聲控制(ANC)增強噪聲降低性能

主動噪聲控制(ANC)已成為一種廣泛使用的降噪技術。基本原理是通過產生與外界噪音相等的反向聲波,將噪音中和,從而達到降噪的效果。ANC系統通常包括以下幾個部分:參考麥克風、處理芯片、揚聲器和誤差麥克風。參考麥克風…

家政保潔服務小程序怎么做?家政公司快速搭建專屬小程序

在數字化時代背景下,家政保潔服務行業也迎來了線上轉型的新機遇。家政保潔服務小程序,作為一種新型的線上服務平臺,不僅能夠提升家政公司的服務效率,還能為顧客提供更加便捷的預約上門服務體驗。那么家政保潔服務小程序怎么做呢&a…

AI與量子計算:科技新時代的雙重飛躍

在科技的浪潮中,每一次技術革新都如同一次深海潛行,探尋著未知的奧秘。近年來,人工智能(AI)和量子計算兩大領域的發展尤為引人注目,它們不僅代表了科技的未來趨勢,更是人類社會進步的強大動力。本文將深入探討這兩項技術的最新進展、潛在影響以及它們之間的潛在聯系。 …

2024年3月小程序類目調整匯總公告

各位小程序開發者: 為進一步加強平臺的規范管理,優化開發者類目選擇體驗,現對以下類目進行調整,請各位開發者知悉。 類目調整 #【文娛-小說】 現資質要求 (3選1): 1、提供《互聯網出版許可…

從零開始搭建一個SpringBoot項目

目錄 Spring BootSpring Boot 項目開發環境1、快速創建SpringBoot項目2、pom.xml 添加 Meavn 依賴3、配置application.yml4、驗證數據庫是否連接成功5、配置 Druid 數據源 Spring Boot 整合 MyBatis1、準備依賴2、application-dev.yml 配置3、啟動類添加Mapper接口掃描器4、設置…

BWVS 靶場測試

一、PHP弱類型 is_numeric() 輸入:127.0.0.1/BWVS/bug/php/code.php # 1、源代碼分析 如果num不是數字,那么就輸出num,同時如果num1,就輸出flag。即num要是字符串又要是數字 # 2、函數分析: is_numeric()函數&…

使用Nginx的Mirror模塊的指南

Nginx 是一個廣泛使用的 web 服務器和反向代理服務器,性能出色且易于配置。Nginx 提供了各種模塊來擴展其功能,其中一個有用的模塊是 mirror 模塊。本文將詳細介紹 Nginx 的 mirror 模塊,包括其用途、使用場景、注意事項以及示例代碼。 1. m…