亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 命令行之旅 —— 深入 argparse (一)

系統(tǒng) 1613 0

Python 命令行之旅 —— 深入 argparse (一)

Python 命令行之旅 —— 深入 argparse (一)_第1張圖片


作者:HelloGitHub- Prodesire

HelloGitHub 的《講解開源項(xiàng)目》系列,項(xiàng)目地址:https://github.com/HelloGitHub-Team/Article

前言

在第一篇“初探 argparse”的文章中,我們初步掌握了使用 argparse 的四部曲,對(duì)它有了一個(gè)基本的體感。
但是它具體支持哪些類型的參數(shù)?這些參數(shù)該如何配置?本文將帶你深入了解 argparse 的參數(shù)們。

              
                本系列文章默認(rèn)使用 Python 3 作為解釋器進(jìn)行講解。
若你仍在使用 Python 2,請(qǐng)注意兩者之間語法和庫的使用差異哦~
              
            

參數(shù)動(dòng)作

你是否還記得?在上一篇四部曲中的第二步是定義參數(shù),在這個(gè)步驟中,我們指定了 action 入?yún)ⅲ?

              
                parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the nums (default: find the max)')
              
            

那么這里面的 action ,也就是 參數(shù)動(dòng)作 ,究竟是用來做什么的呢?

想象一下,當(dāng)我們在命令行輸入一串參數(shù)后,對(duì)于不同類型的參數(shù)是希望做不同的處理的。
那么 參數(shù)動(dòng)作 其實(shí)就是告訴解析器,我們希望對(duì)應(yīng)的參數(shù)該被如何處理。比如,參數(shù)值是該被存成一個(gè)值呢,還是追加到一個(gè)列表中?是當(dāng)成布爾的 True 呢,還是 False?

參數(shù)動(dòng)作 被分成了如下 8 個(gè)類別:

  • store —— 保存參數(shù)的值,這是默認(rèn)的參數(shù)動(dòng)作。它通常用于給一個(gè)參數(shù)指定值,如指定名字:
              
                >>> parser.add_argument('--name')
>>> parser.parse_args(['--name', 'Eric'])
Namespace(name='Eric')
              
            
  • store_const —— 保存被 const 命名的固定值。當(dāng)我們想通過是否給定參數(shù)來起到標(biāo)志的作用,給定就取某個(gè)值,就可以使用該參數(shù)動(dòng)作,如:
              
                >>> parser.add_argument('--sum', action='store_const', const=sum)
>>> parser.parse_args(['--sum'])
Namespace(sum=
                
                  )
>>> parser.parse_args([])
Namespace(sum=None)
                
              
            
  • store_true store_false —— 是 store_const 的特殊情況,用來分別保存 True 和 False。如果為指定參數(shù),則其默認(rèn)值分別為 False 和 True,如:
              
                >>> parser.add_argument('--use', action='store_true')
>>> parser.add_argument('--nouse', action='store_false')
>>> parser.parse_args(['--use', '--nouse'])
Namespace(nouse=False, use=True)
>>> parser.parse_args([])
Namespace(nouse=True, use=False)
              
            
  • append —— 將參數(shù)值追加保存到一個(gè)列表中。它常常用于命令行中允許多個(gè)相同選項(xiàng),如:
              
                >>> parser.add_argument('--file', action='append')
>>> parser.parse_args(['--file', 'f1', '--file', 'f2'])
Namespace(file=['f1', 'f2'])
              
            
  • append_const —— 將 const 命名的固定值追加保存到一個(gè)列表中( const 的默認(rèn)值為 None )。它常常用于將多個(gè)參數(shù)所對(duì)應(yīng)的固定值都保存在同一個(gè)列表中,相應(yīng)的需要 dest 入?yún)砼浜?,以放在同一個(gè)列表中,如:

不指定 dest 入?yún)ⅲ瑒t固定值保存在以參數(shù)名命名的變量中

              
                >>> parser.add_argument('--int', action='append_const', const=int)
>>> parser.add_argument('--str', action='append_const', const=str)
>>> parser.parse_args(['--int', '--str'])
Namespace(int=[
                
                  ], str=[
                  
                    ])
                  
                
              
            

指定 dest 入?yún)?,則固定值保存在 dest 命名的變量中

              
                >>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.parse_args(['--int', '--str'])
Namespace(types=[
                
                  , 
                  
                    ])
                  
                
              
            
  • count —— 計(jì)算參數(shù)出現(xiàn)次數(shù),如:
              
                >>> parser.add_argument('--increase', '-i', action='count')
>>> parser.parse_args(['--increas', '--increase'])
Namespace(increase=2)
>>>parser.parse_args(['-iii'])
Namespace(increase=3)
              
            
  • help —— 打印解析器中所有選項(xiàng)和參數(shù)的完整幫助信息,然后退出。

  • version —— 打印命令行版本,通過指定 version 入?yún)碇付ò姹?,調(diào)用后退出。如:

              
                >>> parser = argparse.ArgumentParser(prog='CMD')
>>> parser.add_argument('--version', action='version', version='%(prog)s 1.0')
>>> parser.parse_args(['--version'])
CMD 1.0
              
            

參數(shù)類別

如果說 參數(shù)動(dòng)作 定義了解析器在接收到參數(shù)后該如何處理參數(shù),那么 參數(shù)類別 就是告訴解析器這個(gè)參數(shù)的元信息,也就是參數(shù)是什么樣的。比如,參數(shù)是字符串呢?還是布爾類型呢?參數(shù)是在幾個(gè)值中可選的呢?還是可以給定值,等等。

下面,我們將逐一介紹不同類型的參數(shù)。

可選參數(shù)

可選參數(shù) 顧名思義就是參數(shù)是可以加上,或不加上。默認(rèn)情況下,通過 ArgumentParser.add_argument 添加的參數(shù)就是可選參數(shù)。

我們可以通過 - 來指定短參數(shù),也就是名稱短的參數(shù);也可以通過 -- 來指定長參數(shù),也就是名稱長的參數(shù)。當(dāng)然也可以兩個(gè)都指定。

可選參數(shù)通常用于:用戶提供一個(gè)參數(shù)以及對(duì)應(yīng)值,則使用該值;若不提供,則使用默認(rèn)值。如:

              
                >>> parser.add_argument('--name', '-n')
>>> parser.parse_args(['--name', 'Eric'])  # 通過長參數(shù)指定名稱
Namespace(name='Eric')
>>> parser.parse_args(['-n', 'Eric']) # 通過短參數(shù)指定名稱
Namespace(name='Eric')
>>> parser.parse_args([]) # 不指定則默認(rèn)為 None
Namespace(name=None)
              
            

參數(shù)類型

參數(shù)類型 就是解析器參數(shù)值是要作為什么類型去解析,默認(rèn)情況下是 str 類型。我們可以通過 type 入?yún)碇付▍?shù)類型。

argparse 所支持的參數(shù)類型多種多樣,可以是 int 、 float 、 bool 等,比如:

              
                >>> parser.add_argument('-i', type=int)
>>> parser.add_argument('-f', type=float)
>>> parser.add_argument('-b', type=bool)
>>> parser.parse_args(['-i', '1', '-f', '2.1', '-b', '0'])
Namespace(b=False, f=2.1, i=1)
              
            

更厲害的是, type 入?yún)⑦€可以是可調(diào)用( callable )對(duì)象。這就給了我們很大的想象空間,可以指定 type=open 來把參數(shù)值作為文件進(jìn)行處理,也可以指定自定義函數(shù)來進(jìn)行類型檢查和類型轉(zhuǎn)換。

作為文件進(jìn)行處理:

              
                >>> parser.add_argument('--file', type=open)
>>> parser.parse_args(['--file', 'README.md'])
Namespace(b=None, f=None, file=<_io.TextIOWrapper name='README.md' mode='r' encoding='cp936'>, i=None)
              
            

使用自定義函數(shù)進(jìn)行處理,入?yún)閰?shù)值,需返回轉(zhuǎn)換后的結(jié)果。
比如,對(duì)于參數(shù) --num ,我們希望當(dāng)其值小于 1 時(shí)則返回 1,大于 10 時(shí)則返回 10:

              
                >>> def limit(string):
...   num = int(string)
...   if num < 1:
...     return 1
...   if num > 10:
...     return 10
...   return num
...
>>> parser.add_argument('--num', type=limit)
>>> parser.parse_args(['--num', '-1'])  # num 小于1,則取1
Namespace(num=1)
>>> parser.parse_args(['--num', '15'])  # num 大于10,則取10
Namespace(num=10)
>>> parser.parse_args(['--num', '5'])  # num 在1和10之間,則取原來的值
Namespace(num=5)
              
            

參數(shù)默認(rèn)值

參數(shù)默認(rèn)值 用于在命令行中不傳參數(shù)值的情況下的默認(rèn)取值,可通過 default 來指定。如果不指定該值,則參數(shù)默認(rèn)值為 None 。

比如:

              
                >>> parser.add_argument('-i', default=0, type=int)
>>> parser.add_argument('-f', default=3.14, type=float)
>>> parser.add_argument('-b', default=True, type=bool)
>>> parser.parse_args([])
Namespace(b=True, f=3.14, i=0)
              
            

位置參數(shù)

位置參數(shù) 就是通過位置而非是 - -- 開頭的參數(shù)來指定參數(shù)值。

比如,我們可以指定兩個(gè)位置參數(shù) x y ,先添加的 x 位于第一個(gè)位置,后加入的 y 位于第二個(gè)位置。那么在命令行中輸入 1 2 的時(shí)候,分別對(duì)應(yīng)到的就是 x y

              
                >>> parser.add_argument('x')
>>> parser.add_argument('y')
>>> parser.parse_args(['1', '2'])
Namespace(x='1', y='2')
              
            

可選值

可選值 就是限定參數(shù)值的內(nèi)容,通過 choices 入?yún)⒅付ā?

有些情況下,我們可能需要限制用戶輸入?yún)?shù)的內(nèi)容,只能在預(yù)設(shè)的幾個(gè)值中選一個(gè),那么 可選值 就派上了用場。

比如,指定文件讀取方式限制為 read-only read-write

              
                >>> parser.add_argument('--mode', choices=('read-only', 'read-write'))
>>> parser.parse_args(['--mode', 'read-only'])
Namespace(mode='read-only')
>>> parser.parse_args(['--mode', 'read'])
usage: [-h] [--mode {read-only,read-write}]
: error: argument --mode: invalid choice: 'read' (choose from 'read-only', 'read-write')
              
            

互斥參數(shù)

互斥參數(shù) 就是多個(gè)參數(shù)之間彼此互斥,不能同時(shí)出現(xiàn)。使用互斥參數(shù)首先通過 ArgumentParser.add_mutually_exclusive_group 在解析器中添加一個(gè)互斥組,然后在這個(gè)組里添加參數(shù),那么組內(nèi)的所有參數(shù)都是互斥的。

比如,我們希望通過命令行來告知乘坐的交通工具,要么是汽車,要么是公交,要么是自行車,那么就可以這么寫:

              
                >>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--car', action='store_true')
>>> group.add_argument('--bus', action='store_true')
>>> group.add_argument('--bike', action='store_true')
>>> parser.parse_args([])  # 什么都不乘坐
Namespace(bike=False, bus=False, car=False)
>>> parser.parse_args(['--bus'])  # 乘坐公交
Namespace(bike=False, bus=True, car=False)
>>> parser.parse_args(['--bike'])  # 騎自行車
Namespace(bike=True, bus=False, car=False)
>>> parser.parse_args(['--bike', '--car'])  # 又想騎車,又想坐車,那是不行的
usage: [-h] [--car | --bus | --bike]
: error: argument --car: not allowed with argument --bike
              
            

可變參數(shù)列表

可變參數(shù)列表 用來定義一個(gè)參數(shù)可以有多個(gè)值,且能通過 nargs 來定義值的個(gè)數(shù)。

nargs=N , N 為一個(gè)數(shù)字,則要求該參數(shù)提供 N 個(gè)值,如:

              
                >>> parser.add_argument('--foo', nargs=2)
>>> print(parser.parse_args(['--foo', 'a', 'b']))
Namespace(foo=['a', 'b'])
>>> print(parser.parse_args(['--foo', 'a', 'b', 'c']))
usage: [-h] [--foo FOO FOO]
: error: unrecognized arguments: c
              
            

nargs=? ,則要求改參數(shù)提供 0 或 1 個(gè)值,如:

              
                >>> parser.add_argument('--foo', nargs='?')
>>> parser.parse_args(['--foo'])
Namespace(foo=None)
>>> parser.parse_args(['--foo', 'a'])
Namespace(foo='a')
>>> parser.parse_args(['--foo', 'a', 'b'])
usage: [-h] [--foo [FOO]]
: error: unrecognized arguments: b
              
            

nargs=* ,則要求改參數(shù)提供 0 或多個(gè)值,如:

              
                >>> parser.add_argument('--foo', nargs='*')
>>> parser.parse_args(['--foo'])
Namespace(foo=[])
>>> parser.parse_args(['--foo', 'a'])
Namespace(foo=['a'])
>>> parser.parse_args(['--foo', 'a', 'b', 'c', 'd', 'e'])
Namespace(foo=['a', 'b', 'c', 'd', 'e'])
              
            

nargs=? ,則要求改參數(shù)至少提供 1 個(gè)值,如:

              
                >>> parser.add_argument('--foo', nargs='+')
>>> parser.parse_args(['--foo', 'a'])
Namespace(foo=['a'])
>>> parser.parse_args(['--foo'])
usage: [-h] [--foo FOO [FOO ...]]
: error: argument --foo: expected at least one argument
              
            

小節(jié)

在了解了參數(shù)動(dòng)作和參數(shù)類別后,是不是漸漸開始對(duì)使用 argparse 胸有成竹了呢?至少,用現(xiàn)在學(xué)到的知識(shí)來完成簡單的命令行工具已經(jīng)不再話下了。

在下一篇文章中,我們來繼續(xù)深入了解 argparse 的功能,如何修改參數(shù)前綴,如何定義參數(shù)組,如何定義嵌套的解析器,如何編寫自定義動(dòng)作等,讓我們拭目以待吧~

Python 命令行之旅 —— 深入 argparse (一)_第2張圖片

歡迎關(guān)注 HelloGitHub 公眾號(hào),獲取更多開源項(xiàng)目的資料和內(nèi)容

『講解開源項(xiàng)目系列』啟動(dòng)——讓對(duì)開源項(xiàng)目感興趣的人不再畏懼、讓開源項(xiàng)目的發(fā)起者不再孤單。跟著我們的文章,你會(huì)發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項(xiàng)目如此簡單。歡迎聯(lián)系我們給我們投稿,讓更多人愛上開源、貢獻(xiàn)開源~


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 奇米影视888狠狠狠777九色 | 亚洲精品一区二区三区香蕉在线看 | 色综色| www神马我不卡影院免费观看 | 成人欧美在线 | 欧美影院 | 嫩草嫩草55av | 日韩中文字幕在线播放 | 亚洲在线视频一区 | 欧美性猛交xxxx免费看久久久 | 久久精品亚洲欧美日韩久久 | 人人揉揉香蕉大免费不卡 | 亚洲综合在线观看一区www | 久久经典| 特黄特级毛片免费视 | 亚洲综合激情五月色播 | 大伊香蕉精品视频在线天堂 | 日日碰碰 | 日韩免费黄色片 | 爱爱小视频成人免费 | 91视频中文字幕 | 国产精品高清在线观看地址 | 伊人网99 | 爱婷婷网站在线观看 | 激情综合在线观看 | 久久夜色tv网站 | 国产www视频 | 成人精品一区二区不卡视频 | 天天躁日日躁狠狠躁综合 | 精品视频一区二区三区在线播放 | 国产在线精品福利91香蕉 | 麻豆国产精品免费视频 | 日本一级爽毛片在线看 | 欧美激情亚洲精品日韩1区2区 | 四虎精品成在线播放 | 9久re在线观看视频精品 | 亚洲码在线 | 亚洲人成毛片线播放 | 日韩城人视频 | 国产精品久久久久久亚洲伦理 | 狠狠色婷婷综合天天久久丁香 |