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!

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

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

  • 相关阅读:
    Android系统Recovery工作原理之使用update.zip升级过程分析(二)---update.zip差分包问题的解决
    Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作
    Android OTA升级(2):开启升级过程
    Android OTA升级(1):编译升级全包
    XMind
    How To Build CyanogenMod For Huawei Honor 5X ("kiwi")
    想把cm移植到自己的手机上,有没有大神可以教教 谢谢
    SEEM: simulation experimental environments for mobile applications in MANETs: poster
    【Henu ACM Round#16 B】 Bear and Colors
    【Henu ACM Round#16 C】Graph and String
  • 原文地址:https://www.cnblogs.com/watertaro/p/10528862.html
Copyright © 2011-2022 走看看