【💊 Python的解憂錦囊】ArgumentParser 布林與陣列的處理技巧(boolean/array)

更新於 發佈於 閱讀時間約 6 分鐘

您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。

我們是不是常常看到一些很厲害的專案, 只要「pip install xxx」之後就可以作為可執行檔的命令列形式進行運作? 這是不是很酷? 而Python內建的模組其實就能夠完成這部份的設計了! 我們接下來也會稍微簡介一番。

說到這裡,如果您也想要自己製作套件包,歡迎來「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課」聊聊,讓我們一起手作一包套件包吧!

雖然主題是關於「Boolean」與「Array」輸入參數的處理方式, 但我們也是會藉著這個主題順便說明一下 ArgumentParser 這個好用的命令列參數設計。

看完這個篇章, 您會學到以下:

  • ArgumentParser的用途。
  • 自訂型態解析(Array)。
  • Boolean型態的處理。

什麼是「ArgumentParser」?

ArgumentParser是Python內建模組argparse所提供的類別, 它主要擔任的角色是提供我們設計出伺服端的互動式指令界面, 這麼說好了, 像是 nvitop 這套GPU監控工具:

# 我需要help...
nvitop -h
圖片來源

圖片來源

我們想查詢這個工具有什麼使用方式、參數時就可以鍵入「nvitop -h」來查詢, 就會有詳細的說明, 而這些說明在Python如何開發的呢? 其中一項內建模組類別就是「ArgumentParser」, 當然也有許多更強大的開源套件, 但我們會以內建來介紹就是不希望您太過發散, 基本概念如果能通,相信其他部份一定更快速上手。

基本用法

您可以根據「【🔒 Python 先修班】建立不害怕犯錯的開發環境(Docker + Docker Compose + Python + VSCode)」建立一個容易開發的Python環境, 並試著執行以下程式碼, 完成一個美好的開始。

# test.py

import argparse

# 創建一個ArgumentParser實例
parser = argparse.ArgumentParser(description='這是一個簡單的範例')

# 添加一個參數
parser.add_argument('--input', type=str, help='輸入檔案的路徑')

# 解析命令行參數
args = parser.parse_args()

# 使用解析後的參數
if args.input:
print(f'輸入檔案的路徑是:{args.input}')
else:
print('沒有提供輸入檔案的路徑')
python test.py -h

usage: test.py [-h] [--input INPUT]

這是一個簡單的範例

options:
-h, --help show this help message and exit
--input INPUT 輸入檔案的路徑

看起來有沒有很像專業級的套件程式, 沒錯, 這就是類似著名的命令列套件所設計的終端機互動式輸入介面, 接下來就讓各位自由發揮囉,自行設計出更多的命令列參數。

字串沒問題, 那陣列呢?

首先我們可能會很直覺的將type改為List, 以為這樣就解決了, 但事情沒有憨人所想的那麼簡單, 肯定有些貓膩的…

import argparse
from typing import List

parser.add_argument('--input', type=List[str], help='輸入檔案的路徑')

主要是因為使用者在輸入時遇到輸入某個參數多個值的狀況下, 通常會是以「,」隔開作為組與組之間的分隔, 然而這樣的需求之下, 我們就得設法將輸入參數進行分割處理了, 幸好, type的部份支援自訂型態的Callback回傳Function, 那我們就可以根據此特性來自行實作囉。

根據官方文件我們可以看到這一段話有提到自訂的函數可以被使用:

圖片來源

圖片來源

因此我們可以這樣設計:


def parse_list(val: str) -> List[str]:
return val.split(',')

parser.add_argument('--input', type=parse_list, help='請以逗號隔開進行多組輸入')

陣列也沒問題了, 那bool呢?

根據官方文件的記載, 我們可以看到「不建議使用 bool() 函數作為類型轉換器。 它所做的只是將空字符串轉換為 False,將非空字符串轉換為 True。 這通常不是所期望的。」, 看來bool不好處理啊…

圖片來源

圖片來源

讓我們換條思路, 既然bool的意義是決定是否開啟這樣的選項, 那麼我們翻翻action的部份,可以看到, 有條建議是關於 3.8+ 的這部分需要請您自行注意一下版本:

圖片來源

圖片來源

它其實設定該參數之後, 會自動將我們的Namespace分離成正與負的參數, 以「--foo」為例

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action=argparse.BooleanOptionalAction)

# 👀 注意看這邊, --foo會有「--foo」與「--no-foo」來讓使用者決定設定哪一個

結語

幸好Python的官方文檔非常給力啊, 該說明的都說明的非常細膩, 因此只要我們認真翻一翻其實都能夠得到我們要的解答, 不過沒有親自深入玩過還是不容易懂的, 所以這也是我們將筆記給分享出來的主要原因, 期望這樣的教學可以幫助到更多人。

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?

歡迎加入一起練習寫作,賺取知識,累積財富!

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
137會員
301內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 使用Linux作業系統的朋友們應該對於「htop
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 使用Linux作業系統的朋友們應該對於「htop
Thumbnail
Python雖然是直譯式的腳本語言, 用起來非常方便, 但當我們的工具越發成熟時, 就會需要將使用方式、介面給設計好, 那通常都會用來處理後端伺服器的作業, 也比較面向IT端, 因此我們通常會以Command Line的形式與使用工具的人進行互動, 而內建模組雖然有「argparse」可以讓我們
Thumbnail
Python雖然是直譯式的腳本語言, 用起來非常方便, 但當我們的工具越發成熟時, 就會需要將使用方式、介面給設計好, 那通常都會用來處理後端伺服器的作業, 也比較面向IT端, 因此我們通常會以Command Line的形式與使用工具的人進行互動, 而內建模組雖然有「argparse」可以讓我們
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 我們是不是常常看到一些很厲害的專案, 只要「pip i
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 我們是不是常常看到一些很厲害的專案, 只要「pip i
Thumbnail
⏳ 優質好文,歡迎支持與學習,讓阿Han給你最歡樂的學習課程、最貼近業界的實戰技巧…,just for fun fun fun…😄 相信對於具有開發基礎的學員們來說,基本的開發工程相信已經得心應手了, 那麼您們可能會苦於這些問題: ❓ 哇! pip install別人的程式好方便
Thumbnail
⏳ 優質好文,歡迎支持與學習,讓阿Han給你最歡樂的學習課程、最貼近業界的實戰技巧…,just for fun fun fun…😄 相信對於具有開發基礎的學員們來說,基本的開發工程相信已經得心應手了, 那麼您們可能會苦於這些問題: ❓ 哇! pip install別人的程式好方便
Thumbnail
隨著程式的功能愈來愈複雜,程式碼也愈來愈多,若程式從頭寫到尾沒有任何的段落,可讀性會愈來愈差,甚至會發現同樣的一段程式碼重覆很多遍,因為類似的功能區塊在程式中可能會一再出現。這樣的程式碼不利於多人的協作開發,即使是寫作者本身在一段時間後回來看,可能也難以一眼就掌握程式的主要架構。
Thumbnail
隨著程式的功能愈來愈複雜,程式碼也愈來愈多,若程式從頭寫到尾沒有任何的段落,可讀性會愈來愈差,甚至會發現同樣的一段程式碼重覆很多遍,因為類似的功能區塊在程式中可能會一再出現。這樣的程式碼不利於多人的協作開發,即使是寫作者本身在一段時間後回來看,可能也難以一眼就掌握程式的主要架構。
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News