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!

我们可以看到,可以得到预期的结果。

 

这样我们就实现了参数输入函数的目的~若有其他更好的办法,请大家留言交流

 

posted @ 2019-03-14 11:02  水里的芋头  阅读(2216)  评论(1编辑  收藏  举报