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)
s parameter
# 当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函数参数默认值的陷阱和原理深究";
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 /f driftfile /var/lib/ntp/driftrestrict -4 default kod notrap nomodifyrest ...
STM32 USB 问题汇总(转)
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语⾔实现,结合 ...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。