我们在文章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!
我们可以看到,可以得到预期的结果。
这样我们就实现了参数输入函数的目的~若有其他更好的办法,请大家留言交流