python之定義參數模塊argparse(二)高級使用 --傳參為函數的實現


我們在文章python之定義參數模塊argparse的基本使用中介紹了argparse模塊的基本使用方法

 

當前傳入的參數只能是int、str、float、comlex類型,不能為函數,這有點不方便,但我們通過下面的列子給點啟發:

import argparse

p = argparse.ArgumentParser(description = 'For function use')
#定義必須輸入一個int型參數 p.add_argument(
'Intergers',help = 'one or more intergers is need',metavar = 'N',type = int)
#定義可選參數-s,默認值為為一個lambda函數 p.add_argument(
'-s',help = 'if no --square,need more ',action = 'store_const',default = lambda x:x**x,const = lambda x:x*x) args = p.parse_args() print(args.s(args.Intergers))

先保存上述代碼為arg.py,然后在命令行中分別執行python arg.py 3和python arg.py -s 3,執行結果如下所示:

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python arg.py 3
27

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python arg.py -s 3
9

我們可以看到沒有報錯,執行結果分別為參數的乘積(平方)和參數的參數次方,也就是args.s是可以接受函數的變量,那擴展下使用python自帶函數來演示下:

求最大和最小值:

import argparse

p = argparse.ArgumentParser(description = 'For function use')
#定義必須輸入至少一個int型參數 p.add_argument(
'Intergers',help = 'one or more intergers is need',nargs = '+',metavar = 'N',type = int)
#定義可選參數-s,默認為求最小值 p.add_argument(
'-s',help = 'if no --square,need more ',action = 'store_const',default = min,const = max) args = p.parse_args() print(args.s(args.Intergers))

保存為arg.py文件,然后分別執行python arg.py 5 10 1 40和python arg.py -s 5 10 1 40,結果如下:

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python arg.py 5 10 1 40
1

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python arg.py -s 5 10 1 40
40

執行結果符合預期,但我們需要的是命令行參數中直接輸入函數,實現python arg.py -s min 5 10 1 40這樣的形式來求最小值

如何破?我們想到add_argument還有個參數type,雖然只有幾種類型,但可以接收自定義類型,如我們定義一個hello的函數作為type看下效果:

import argparse

#定義一個hello函數
def hello(x): return 'hello ' + x p = argparse.ArgumentParser(description = 'For function use')
#定義一個type類型為hello的可選參數 p.add_argument(
'-x',help = 'test self-function',type = hello) args = p.parse_args() print(args.x)

保存為arg.py文件,然后執行python arg.py -x Yang,可以得到如下結果:

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python arg.py -x Yang
hello Yang

輸出結果即為hello函數的返回值,也就是說,命令行參數x的值先傳遞給了hello函數然后參數x才接收了hello函數返回的結果!!!

這樣可以使用一個函數返回值來給參數賦值,若這個返回值也是一個函數呢?

之前驗證過,參數是可以接收一個函數的,於是我們稍微在上面代碼上改動下得到如下代碼:

import argparse

#定義一個func參數返回函數給參數x
def func(x): if x == 'min': return min if x =='max': return max return error #定義一個error函數 def error(x): return '-x parameter only receive min or max!' p = argparse.ArgumentParser(description = 'For function use') p.add_argument('Intergers',help = 'one or more intergers is need',nargs = '+',metavar = 'N',type = int) p.add_argument('-x',help = 'test self-function',type = func) args = p.parse_args() print(args.x(args.Intergers))

保存為arg.py文件,然后分別執行python arg.py -x min 5 10 1 40、python arg.py -x max 5 10 1 40和python arg.py -x m 5 10 1 40,執行結果如下:

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python ArgParseLearn.py -x min 5 10 1 40
1

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python ArgParseLearn.py -x max 5 10 1 40
40

D:\PycharmProjects\untitled\MyTestProject\MyLearn>python ArgParseLearn.py -x m 5 10 1 40
-x parameter only receive min or max!

我們可以看到,可以得到預期的結果。

 

這樣我們就實現了參數輸入函數的目的~若有其他更好的辦法,請大家留言交流

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM