zoukankan      html  css  js  c++  java
  • 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:PycharmProjectsuntitledMyTestProjectMyLearn>python arg.py 3
    27
    
    D:PycharmProjectsuntitledMyTestProjectMyLearn>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:PycharmProjectsuntitledMyTestProjectMyLearn>python arg.py 5 10 1 40
    1
    
    D:PycharmProjectsuntitledMyTestProjectMyLearn>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:PycharmProjectsuntitledMyTestProjectMyLearn>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:PycharmProjectsuntitledMyTestProjectMyLearn>python ArgParseLearn.py -x min 5 10 1 40
    1
    
    D:PycharmProjectsuntitledMyTestProjectMyLearn>python ArgParseLearn.py -x max 5 10 1 40
    40
    
    D:PycharmProjectsuntitledMyTestProjectMyLearn>python ArgParseLearn.py -x m 5 10 1 40
    -x parameter only receive min or max!

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

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

  • 相关阅读:
    非控制台应用程序输出信息到输出面板
    使用token实现接口权限验证
    创建虚拟目录http://localhost:1780/失败,错误:无法访问iis元数据库。您没用足够的特权访问计算机上的IIS网站
    隐藏桌面的回收站
    本地电脑与远程服务器之间不能复制粘贴解决方法
    移动端使用控制台打印 vconsole
    npm无法安装node-sass的解决方法
    远程报:这可能是由于credssp加密oracle修正
    L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误
    让一张图片居中在中间(代码片段)
  • 原文地址:https://www.cnblogs.com/watertaro/p/10528862.html
Copyright © 2011-2022 走看看