我们在文章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!

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

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

python之定义参数模块argparse(二)高级使用 --传参为函数的实现的更多相关文章

  1. python之定义参数模块argparse(一)基本使用

    在shell脚本中,若脚本带参数,则在脚本中使用$1.$2...等引用, 在python中,也可以定义类似的引用参数,可以为必选项也可以可选项. 基本用法如下三种: 1.必选项(位置参数) impor ...

  2. python命令行解析模块--argparse

    python命令行解析模块--argparse 目录 简介 详解ArgumentParser方法 详解add_argument方法 参考文档: https://www.jianshu.com/p/aa ...

  3. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  4. Python基础之常用模块(二)

    一.sys模块 1.sys.exit() 退出程序,这是正常退出程序,与之前用的break不同的是,break只是退出循环,循环之后的代码还会正常运行 2.sys.argv  会返回一个列表,列表中的 ...

  5. Python学习 :常用模块(二)

    常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir( ...

  6. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. Python中的Json模块dumps、loads、dump、load函数介绍

    Json模块dumps.loads.dump.load函数介绍 1.json.dumps() json.dumps() 用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json ...

  8. python之路--动态传参,作用域,函数嵌套

    一 . 动态传参(重点)  * ,  ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...

  9. Python 命令行解析模块 —— argparse

    argparse是python标准库里面用来处理命令行参数的库,基本使用步骤如下: 1.import argparse    导入模块 2.parser = argparse.ArgumentPars ...

随机推荐

  1. Asp.net core 启动流程

  2. Android Studio编译卡死

    首先,用AS,你必须fanqiang,其它都是次要的. AS/bin/*.exe.vmoptions ## *DO NOT* modify this file directly. If there i ...

  3. PostGIS导出SHP中文乱码

    设置系统的环境变量 PGCLIENTENCODING=GBK,退出PostgreSQL重新登錄,执行成功!

  4. Docker 学习3 Docker镜像管理基础

    一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...

  5. UOJ#346. 【清华集训2017】某位歌姬的故事 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ346.html 题解 首先按照 $m_i$ 的大小排个序. 如果某一个区间和一个 m 值比他小的区间有交,那么显然可以将这 ...

  6. 3.CNN-卷积神经网络推导

    直接参考刘建平老师的播客~~写的炒鸡好~~https://www.cnblogs.com/pinard/p/6494810.html

  7. vue 手机端样式统一配置

  8. linux环境下安装tcping工具测试访问超时

    wget https://sources.voidlinux.eu/tcping-1.3.5/tcping-1.3.5.tar.gz tar zxvf tcping-1.3.5.tar.gz cd t ...

  9. FunData — 电竞大数据系统架构演进

    电竞出现在人们视野中的频率越来越高了,此次选取FunData作为电竞数据平台,v1.0 beta版本主要提供由Valve公司出品的顶级MOBA类游戏DOTA2相关数据接口(详情:open.varena ...

  10. SQL 收缩日志

    USE [master]ALTER DATABASE RcBalance SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE RcBalance SET RE ...