日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

argparse库 学习记录

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 argparse库 学习记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

      • 初始化
      • 始見參數
        • name or flags
        • action
        • nargs
        • default
        • type
        • choices
        • required
        • help
        • dest
        • metavar
      • 總結

繼上次的optparser庫之后,才發現自己意外的out of time了。原來標準的argparse庫才是處理命令行參數的一劑良方。好記性不如爛筆頭,這里還是記錄一下,以便今后的復習。


初始化

import argparseparser = argparse.ArgumentParser()

初始化這個類的時候,還是有很多的可選參數的,但是相對而言比較重要的也就是description和version吧。添加的話可以給用戶一個更加友好的體驗,不加也沒啥大不了的。

始見參數

這也是這個庫的核心部分了。

# =======================# Adding argument actions# =======================def add_argument(self, *args, **kwargs):"""add_argument(dest, ..., name=value, ...)add_argument(option_string, option_string, ..., name=value, ...)"""# if no positional args are supplied or only one is supplied and# it doesn't look like an option string, parse a positional# argument··· ···

對此有興趣的不妨研究一下源碼。那么,一般而言可以為這個方法添加什么參數呢?

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

對應add_argument方法的說明:

如果該方法沒有設置位置參數,或者設置了一個不像可選參數的字符串,就解析為一個位置參數。

什么意思咧,大概就是說會默認將這種情況設置為位置參數,至于位置參數和可選參數的區別,屬額外知識,此處略去。

下面就來簡單的測試一下這幾個參數,來加深一下記憶吧。


必須參數

name or flags

先來看一個不像可選參數的字符串被解析的例子。

再來看一個位置參數的實現。


可選參數

可選參數一定是前面有-號的,但是有-號的不一定是可選參數


action

action比較特殊一點,針對不同的值,這個屬性也對應著不同的情況。

  • action='store_const',見名知意。就是指這個本參數對應的值為常量,類比在C++中,常量的值不能隨意的更改,一般會在初始化的時候確定下來,這里同樣秉承了這個思想,于是這個參數的值便存儲在了一個叫const的屬性對應的值中。

  • action='store_true/store_false',有了上面的做示范,類比這個也就不難理解了。是的,參數的值會被默認的存儲為對應的True或者False。

需要注意的是,以上兩個屬性值原理類似。也就是說我們不能再為其指定額外的命令行值了,否則就會報錯的。

E:\Code\Python\DataStructor\temp>python argptest.py -f foo -b bar usage: argptest.py [-h] [-f] [-b] argptest.py: error: unrecognized arguments: foo barE:\Code\Python\DataStructor\temp>
  • action='append',這個時候,命令行中賦予的參數值可以為多個咯,多個參數值會被存儲為一個列表。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-l', '--list', action='append') args = parser.parse_args() print args print args.list

但是使用的時候確是 要十分的小心,因為這個庫不會自動的幫助我們分割命令行參數來配對,所以我們必須一次一個的為其賦值, 不然它就不能正常的工作了。

E:\Code\Python\DataStructor\temp>python argptest.py -l 1 Namespace(list=['1']) ['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3 Namespace(list=['1', '2', '3']) ['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 Namespace(list=['1']) ['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3 Namespace(list=['1', '2', '3']) ['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 2 3 usage: argptest.py [-h] [-l LIST] argptest.py: error: unrecognized arguments: 2 3
  • action='count',統計本參數出現的次數,也就是說add_argument方法內沒有此屬性的話就不會統計該參數出現的次數了。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-c', '--count', action='count') args = parser.parse_args() print args print args.count

測試結果為:

E:\Code\Python\DataStructor\temp>python argptest.py -c Namespace(count=1) 1E:\Code\Python\DataStructor\temp>python argptest.py -c -c Namespace(count=2) 2E:\Code\Python\DataStructor\temp>python argptest.py -c -c -c Namespace(count=3) 3

這個例子用處不大,但是在某些時候還是很有用的。

nargs

我的理解就是:numbers of arguments。其值為數值類型,外加一個'+'(一個或多個), 一個'*'(零個或多個,更加推薦*),下面就來看個例子吧。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', nargs=1) parser.add_argument('-b', '--bar', nargs=2) parser.add_argument('-m', '--many', nargs='+') args = parser.parse_args() print args

測試的結果為:

E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m 1 2 3 3 2 1 Namespace(bar=['1', '2'], foo=['1'], many=['1', '2', '3', '3', '2', '1']) E:\Code\Python\DataStructor\temp>python argptest.py -f 1 2 usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]] argptest.py: error: unrecognized arguments: 2E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]] argptest.py: error: argument -b/--bar: expected 2 argument(s)E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m a s x c d e r f g tt r w d f f Namespace(bar=['1', '2'], foo=['1'], many=['a', 's', 'x', 'c', 'd', 'e', 'r', 'f', 'g', 'tt', 'r', 'w', 'd', 'f', 'f'])

不難看出,設置了什么樣的約束,就必須按照規定使用了,否則這個庫就不能正常的工作了。實際中,需要什么樣的就設置成什么樣的參數即可。

default

默認參數,這個屬性比較的有意思了,而且很容易理解。就是說,如果我們沒有在命令行中輸入參數對應的值,那么這個值就會使用default屬性中設置好的了。這一點看似簡單,但意義非凡!

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f1', '--foo1', default=1) parser.add_argument('-f2', '--foo2', default='string type') parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args() print args

測試結果:

E:\Code\Python\DataStructor\temp>python argptest.py Namespace(foo1=1, foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f1 12 Namespace(foo1='12', foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f2 funny Namespace(foo1=1, foo2='funny', foo3=[1, 'a', 2, 'b'])

由此,我們可以得到另外一個比較重要的知識點,那就是該庫默認將從控制臺讀取的值轉成字符串類型,即使我們預期的不是字符串。這一點引起足夠的注意即可。

type

類型約束,有時候會起到畫龍點睛的作用。剛好可以完善上面那個類型轉換的問題。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f1', '--foo1', default=1) parser.add_argument('-f2', '--foo2', default='string type') parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args() print args

測試結果:

E:\Code\Python\DataStructor\temp>python argptest.py -f 12 Namespace(foo=12)E:\Code\Python\DataStructor\temp>python argptest.py -f '12' usage: argptest.py [-h] [-f FOO] argptest.py: error: argument -f/--foo: invalid int value: "'12'"

輸入非int類型的數據,就會自動的報錯。由此也可見type和default相輔相成的搭配,會使得用戶輸入的約束更契合。

choices

這個屬性意蘊更加明顯了吧,就是說用戶輸入的參數只能是choices里面規定的,這就跟java中的枚舉類的使用有點神似咯。剛好可以嚴格的控制用戶輸入,畢竟你用于不知道你的用戶會輸入什么,除非你不給他們任意輸入的權限。而choices剛好幫你實現了這個需求。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', choices=[1, 2, 3, 'a', 'abc', 3.141592653589727])args = parser.parse_args() print args

測試結果:

E:\Code\Python\DataStructor\temp>python argptest.py -f 1 usage: argptest.py [-h] [-f {1,2,3,a,abc,3.14159265359}] argptest.py: error: argument -f/--foo: invalid choice: '1' (choose from 1, 2, 3, 'a', 'abc', 3.141592653589727)E:\Code\Python\DataStructor\temp>python argptest.py -f a Namespace(foo='a')

因此,我們要特別注意,從控制臺輸入的數據會自動的轉換成字符串類型,而choices里面的值就必須有點講究了。我們一定要仔細的思考需要什么類型的數據。如果非要使用int類型的話,就需要搭配type屬性了。但是如果既要字符串,又要int的話,這就不好辦了。所以,請三思而后行。

required

意指這個參數是必須的嗎?屬性值有True和False兩個取值,按需設置即可。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', required=True)args = parser.parse_args() print args

測試結果:

E:\Code\Python\DataStructor\temp>python argptest.py -f foooof Namespace(foo='foooof')E:\Code\Python\DataStructor\temp>python argptest.py usage: argptest.py [-h] -f FOO

所以說,加了這個屬性。對用戶的輸入的限制就更加的嚴格一點了。

help

如果說這些屬性里面哪個最容易理解?博主想說的就是help了。沒有之一。其作用就是在用戶輸入--help 或者-h的時候顯示的幫助信息。這一點非常的有用,因為用戶第一次使用你的庫的時候對參數的含義一無所知,而help就起到了一個幫助文檔的作用。

看起來很有感覺了吧。

dest

此為destination的縮寫,也就是說該參數的值將被存儲于dest聲明的變量中。我們可以借助輸出來探查一二。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', dest='variable')args = parser.parse_args() print args.variable # 注意此時-f對應的參數將變成variable,而不再是foo,所以下面的會報錯 print args.foo

測試結果:

E:\Code\Python\DataStructor\temp>python argptest.py -f foo Namespace(variable='foo')E:\Code\Python\DataStructor\temp>python argptest.py -f foo fooE:\Code\Python\DataStructor\temp>python argptest.py -f foo Traceback (most recent call last):File "argptest.py", line 16, in <module>print args.foo AttributeError: 'Namespace' object has no attribute 'foo'

metavar

這個參數用于help 信息輸出中,但是貌似基本上就沒人用到過它。所以這里為了不誤導自己,誤導他人,便不再敘述,有興趣的可以自行搜索一下。

總結

本文主要講解了argparse庫的使用,圖文并茂,代碼雨測試結果并行。應該算是比較詳細了吧。O(∩_∩)O哈哈~

但是個人覺得貌似和optparser庫區別不是很大,大致的用法還是差不多的嘛。有興趣的話,可以看看下面的這個關于optparser庫的講解的鏈接。

optparser使用詳見:http://blog.csdn.net/Marksinoberg/article/details/51842197

總結

以上是生活随笔為你收集整理的argparse库 学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美精品aa| 久久精品99久久久久久久久 | av狠狠操 | 成av在线 | 91精品国产一区二区三区 | 日韩欧美一区二区三区 | 国产在线视频网 | 欧美性受xxxx黑人xyx性 | free性欧美hd另类 | 欧美日韩一区二区综合 | 国产伦理av | 亚洲av无码不卡 | 情五月| 国产偷国产偷av亚洲清高 | 久久精品国产亚洲av成人 | 日韩三级欧美 | 妹子干综合 | 成人免费视屏 | 免费激情片 | 国产麻豆乱码精品一区二区三区 | 激情涩涩| 毛片aaa| 久久久噜噜噜www成人 | 亚洲视频免费播放 | 玖玖视频国产 | 在线观看色网站 | 日韩欧美少妇 | 天天爽夜夜爽夜夜爽精品视频 | 午夜a视频 | 色综合天天综合网国产成人网 | 撕开少妇裙子猛然进入 | 久久久久久国产免费a片 | 色屋在线| 日韩成人av网站 | 成人免费毛片糖心 | 成人免费毛片色戒 | 国产一级免费片 | 国产精品免费在线播放 | 久久系列 | 黑人精品一区二区三区 | 欧美又粗又长又爽做受 | 精品免费国产一区二区三区 | 国产男男chinese网站 | 亚洲精品69| 国产午夜福利视频在线观看 | 国产伦精品一区二区三区照片 | 黄色一级视频免费 | 久久久精品国产sm调教网站 | 97人妻精品一区二区三区免费 | 亚洲高清视频一区二区 | 日韩精品无码一区二区三区久久久 | 日韩一区二区免费看 | 丁香婷婷综合激情五月色 | 久久精品视 | 一级淫片在线观看 | 樱花影院电视剧免费 | 午夜激情免费视频 | 国产老女人乱淫免费可以 | 香蕉钻洞视频 | 成人免费毛片嘿嘿连载 | 国产日韩二区 | 69xx欧美 | 日夜夜操| 国产成人在线精品 | porn亚洲| 亚洲国产免费 | 亚洲天堂久久久 | 91蜜桃视频在线观看 | 中文字幕一区二区三区免费视频 | 性一级视频 | 中国男人操女人 | 男人天堂怡红院 | 欧美亚洲高清 | 免费av导航 | 波多野结衣网址 | 日本a√在线观看 | 依依激情网 | 成人国产网站 | 精品人妻一区二区三区浪潮在线 | 免费在线观看www | 色婷婷一区二区 | 99久久久久无码国产精品 | 在线观看黄色片网站 | 久久久久高清 | 91中文字幕在线观看 | av55 | 免费高清av在线看 | 自拍av在线 | www精品| 久久98| 中国农村一级片 | 天天干视频| 日本一区二区在线免费 | 91午夜在线观看 | 操比网站| 在线日韩欧美 | 美女午夜视频 | 国产人妻人伦精品1国产丝袜 | 丰满人妻综合一区二区三区 | 亚洲精品一区二区三区精华液 |