python形参定义类型_Python函数参数的五种类型

之前项目需求,需要通过反射获取函数的参数,python中可以通过函数签名(signature)来实现。

首先需要了解函数参数的类型,Python的参数类型一共有5种:POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY、POSITIONAL_ONLY

其中 POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY 比较常用

参数类型为VAR_POSITIONAL时,即*args参数,只能通过位置传值,如

def say_hello(*args):

print('hello {0}'.format(args))

# 通过位置传值

say_hello('jack', 'tom')

参数类型为VAR_KEYWORD,即 **kwargs参数,只能通过关键字传值,如

def func_b(**kwargs):

print(kwargs)

# 通过关键字传值

func_b(a=1, b=2)

参数的类型为POSITIONAL_OR_KEYWORD时,说明此参数前面没有VAR_POSITIONAL类型的参数,可以通过位置或关键字传值,如

def say_hello(name):

print('hello {0}'.format(name))

# 通过位置传值

say_hello('jack')

# 通过关键字传值

say_hello(name='tom')

参数类型为KEYWORD_ONLY时,说明此参数前面存在VAR_POSITIONAL类型的参数,只能通过关键字传值,如

def func_b(*args, a, b):

print(args, a, b)

# 只能通过关键字传值

func_b('test', a=1, b=2)

比较特别的是POSITIONAL_ONLY,只能通过位置传值的参数。Python并没有明确的语法去定义一个只能通过位置传值的函数参数,但是在很多内置和扩展模块的函数会接受这种类型的参数。

实际获取函数参数时,需要用到inspect模块,通过这个模块的signature方法获取函数签名。

import inspect

def func_a(arg_a, *args, arg_b='hello', **kwargs):

print(arg_a, arg_b, args, kwargs)

if __name__ == '__main__':

# 获取函数签名

func_signature = inspect.signature(func_a)

func_args = []

# 获取函数所有参数

for k, v in func_signature.parameters.items():

# 获取函数参数后,需要判断参数类型

# 当kind为 POSITIONAL_OR_KEYWORD,说明在这个参数之前没有任何类似*args的参数,那这个函数可以通过参数位置或者参数关键字进行调用

# 这两种参数要另外做判断

if str(v.kind) in ('POSITIONAL_OR_KEYWORD', 'KEYWORD_ONLY'):

# 通过v.default可以获取到参数的默认值

# 如果参数没有默认值,则default的值为:class inspect_empty

# 所以通过v.default的__name__ 来判断是不是_empty 如果是_empty代表没有默认值

# 同时,因为类本身是type类的实例,所以使用isinstance判断是不是type类的实例

if isinstance(v.default, type) and v.default.__name__ == '_empty':

func_args.append({k: None})

else:

func_args.append({k: v.default})

# 当kind为 VAR_POSITIONAL时,说明参数是类似*args

elif str(v.kind) == 'VAR_POSITIONAL':

args_list = []

func_args.append(args_list)

# 当kind为 VAR_KEYWORD时,说明参数是类似**kwargs

elif str(v.kind) == 'VAR_KEYWORD':

args_dict = {}

func_args.append(args_dict)

print(func_args)

python函数参数类型及其顺序

根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...

Python 函数参数类型大全(非常全!!!)

Python 函数参数类型大全(非常全!!!) 1.在python编写程序里面具有函数文档,它的主要作用是为了让别人可以更好的理解你的函数,所以这是一个好习惯,访问函数文档的方式是: MyFuncti ...

详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

Python函数参数详解

Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...

Python函数参数默认值的陷阱和原理深究";

本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

Python: 函数参数小结

参数的类型: 函数的参数有2种类型: 1. 函数定义时用于接收值的形式参数Parameters. 2. 函数调用时用于传递值的实际参数Arguments. 参数的传递: 传递方式有2种: 1. 值传递 ...

python函数参数的pack与unpack

python函数参数的pack与unpack 上周在使用django做开发的时候用到了mixin(关于mixin我还要写一个博客专门讨论一下,现在请参见这里),其中又涉及到了一个关于函数参数打包(pa ...

python 函数参数介绍

python 函数参数介绍 python 使用过程总,总会遇到 *args,**kw形式的参数,总是一头雾水,而且网上介绍的或是叫法不一,为此专门深入实践进而了解了函数参数的使用 具体请看代码 #-* ...

python函数-参数

python函数-参数 实验室 # 演示形参是可变类型 def register(name, hobby, hobby_list=[]): hobby_list.append(hobby) print ...

随机推荐

全网络最正确的让 Linux 开机进入字符界面的方法及设置 FrameBuffer 分辨率的方法

引言 这个标题有点长,是为了在标题中就把问题说清楚,以便搜索引擎能够把有需要的朋友准确地带到我这里来.目前在网络上,很多关于 Linux 方面的知识是过时的和错误的.我标题中指出的两个知识点就是其中的 ...

oracle字符集查看修改

一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

转:java.io.IOException: Exceeeded maximum number of redirects: 5 解决版本

Jmeter运行的时候出现的重定向超过n次的问题: When trying to test a Silverlight application, I get the below error. Has ...

事件委托小demo(jq版)

centos常用配置收集

配置ntp服务器: # vi /etc/ntp.conf driftfile /var/lib/ntp/driftrestrict -4 default kod notrap nomodifyrest ...

STM32 USB 问题汇总(转)

源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...

Linux系统安全配置基线

一:共享账号检查 配置名称:用户账号分配检查,避免共享账号存在 配置要求:1.系统需按照实际用户分配账号: 2.避免不同用户间共享账号,避免用户账号和服务器间通信使用的账号共享. 操作指南:参考配置操 ...

单片机的基本构成、工作原理 LET′S TRY“嵌入式编程”: 1 of 6

单片机的基本构成.工作原理 LET′S TRY“嵌入式编程”: 1 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的基础知识.这些基础知识是硬件和软件技术人员都应该掌握的共通技术知识.有了电 ...

编程入门python之定义函数【转】

编程入门python之定义函数 零基础学编程by学哥 2017-02-06 10:51 今天讲python函数. 输入参数求三角形或圆形或长方形的面积 先输入1个参数:形状类型 1=三角形 2=圆形 ...

SaltStack安装及配置

1.简介SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,一般可以理解为简化版的puppet和加强版的func.SaltStack基于Python语言实现,结合 ...

你可能感兴趣的:(python形参定义类型)