python模块传参_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!

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

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

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

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

python命令行解析模块--argparse

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

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

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

Python基础之常用模块(二)

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

Python学习 :常用模块(二)

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

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

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

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

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

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

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

Python 命令行解析模块 —— argparse

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

随机推荐

PHP:Xdebug配置

在配置Xdebug时,之前经历了无数次失败,终于配置成功! 以下是配置失败的原因: 1.下载时,选用Xdebug的版本不正确: 2.配置时,Xdebug文件名或文件的路径不正确: 在参考 http:/ ...

cvCreateCameraCapture

编辑 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! cvCreateCameraCapture,初始化从摄像头中获取视频,专业名词.   初始化从摄像头中获取视频 ...

201301 JAVA题目0-1级

描述 编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回 ...

android手机和ios手机的分辨率

Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3 VGA     640*480 (Video Graphics Array) QVGA  320*240 (Quarter VGA ...

Intellij IDEA使用Maven构建Scala项目

1.安装IDEA的Scala插件       使用自带的在线安装方式较为简单.File--Setting--Plugins--Browse reposities   2.创建项目     File - ...

UIWindow in iOS

这篇文章,我将分享对UIWindow我所知道的东西. keyWindow 一个应用能够有许多UIWindow,“The key window”是其中一个,被设计用来接受键盘和其他与点击无关的事件.一个 ...

EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)

源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计

AtCoder Regular Contest 069 D

D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

memcache的资料集

1. 安装与查看过程(完整) https://www.cyberciti.biz/faq/rhel-fedora-linux-install-memcached-caching-system-rpm/ ...

ios中常用的方法

图片分类 @implementation UIImageView (ext) +(UIImageView*)imageViewWith:(UIImage*)img imgFrame:(CGRect)_ ...

你可能感兴趣的:(python模块传参)