美文网首页
inspect.Parameter.KEKWORD_ONLY 引

inspect.Parameter.KEKWORD_ONLY 引

作者: 土豆特别想爬山 | 来源:发表于2020-06-01 18:10 被阅读0次

在看廖雪峰老师的python实战时,用到了inspect函数,突然发现对函数传参类型比较陌生,在此记录一下。

inspect官方文档:https://docs.python.org/zh-cn/3/library/inspect.html

inspect模块四大功能: 

1、类型检查(type checking) 

2、获取源码(getting source code) 

3、获取类和方法的参数信息(inspecting classes and functions) 

4、解析堆栈(examining the interpreter stack)

主要涉及函数:

inspect.signature(fn): 返回一个inspect.Signature类型的对象,值为fn这个函数的所有参数。

inspect.Signature对象的paramerters属性: 一个mappingproxy(映射)类型的对象,值为一个有序字典(Orderdict)。

inspect.Parameter对象的kind属性: 一个_ParameterKind枚举类型的对象,值为这个参数的类型(可变参数,关键词参数,etc)。

inspect.Parameter对象的default属性: 如果这个参数有默认值,即返回这个默认值,如果没有,返回一个inspect._empty类。

关于函数的传参类型:

1.POSITIONAL_OR_KEYWORD

如果没有任何*的声明,那么就是POSITIONAL_OR_KEYWORD类型的,如同语义一样,POSITIONAL_OR_KEYWORD类型的参数可以通过位置POSITIONAL传参调用,也可以过关键字KEYWORD传参。

2.VAR_POSITIONAL

第二种是可变的位置参数,通过一个*前缀来声明,如果你看到一个*xxx的函数参数声明(不是函数调用!声明和调用是两种不同的含义的),那一定是属于VAR_POSITIONAL类型的,如同语义,这种类型的参数只能通过位置POSITIONAL传参调用,不支持关键字KEYWORD传参,在函数内部,VAR_POSITIONAL类型的参数以一个元祖(tuple)显示,有一点需要注意的,VAR_POSITIONAL类型可以不传任何参数调用也不会报错,而且只允许存在一个。

3.KEYWORD_ONLY

第三种是关键字参数,这种参数只会在VAR_POSITIONAL类型参数的后面而且不带**前缀。如同语义,这类参数只能用关键字KEYWORD来传参,不可以用位置传参,因为位置传的参数全让前面的VAR_POSITIONAL类型参数接收完了,所以KEYWORD_ONLY只能通过关键字才能接收到参数值。

举个例子:

def func(*, a)

    pass

调用时func(a=1),可以执行;

调用时func(1),报错,只能关键字传参调用;

4.VAR_KEYWORD

第四种是可变的关键字参数,VAR_KEYWORD类型的参数通过**前缀来声明(不是函数调用!声明和调用是两种不同的含义的)。如同语义,这种类型的参数只能通过关键字KEYWORD调用,但可以接收任意个关键字参数,甚至是0个参数,在函数内部以一个字典(dict)显示。VAR_KEYWORD类型的参数只允许有一个,只允许在函数的最后声名。

默认参数

VAR类型不允许设置默认参数

POSITIONAL_OR_KEYWORD和KEYWORD_ONLY可以自定义默认参数,而VAR_POSITIONAL和VAR_KEYWORD不允许自定义默认参数的,因为VAR_POSITIONAL的默认参数是tuple()空元祖,而VAR_KEYWORD的默认参数是dict()空字典。如果自定义了默认参数的话,调用函数的时候可以不必传参,如果默认值是空的话,那就必须传参数才能调用。 

默认参数的位置

POSITIONAL_OR_KEYWORD类型的默认参数一定要放在后面,否则会报错,KEYWORD_ONLY虽然没有强制要求,因为都是用关键字传参,谁先谁后都无所谓,但最好还是尽可能地放在后面吧。

默认参数不默认?

默认参数绝对不能设置为可变类型(比如list, dict, set),如果你在函数内改变了默认参数,下次再调用时它就不再是默认值了。

接收参数优先级

先接收POSITIONAL_OR_KEYWORD

再接收KEYWORD_ONLY

再接收VAR_POSITIONAL和VAR_KEYWORD,这两者没有交集

参考:

https://blog.csdn.net/qq_26398495/article/details/80109689

https://www.imooc.com/article/13053

相关文章

  • inspect.Parameter.KEKWORD_ONLY 引

    在看廖雪峰老师的python实战时,用到了inspect函数,突然发现对函数传参类型比较陌生,在此记录一下。 in...

  • 源灵序:目录

    引卷 引卷【1】 引卷【2】 引卷【3】 引卷【4】 引卷【5】 引卷【6】 引卷【7】 引卷【8】 引卷【9】 ...

  • 夏天总有些挥之不去的记忆,而记忆里的你,身上总是弥漫着淡淡的药味。 梦如此侵蚀着我残存的记忆,我知道,我为我的自私...

  • 人们说,扶风是个苦命的小人。 他姓穆,名扶风,是个男小孩,邻居都喊伊扶风。本来家庭和睦的,爹长的秀气娘长的好看,一...

  • 《引》

    我 像行走在沙漠里的骆驼 步履不停,却方向不明 没有你的牵引 终究会倒在沙尘漫天里 我 像航行在大海上的帆船 轨迹...

  • 各位好,在下白景夜,原本是个富家公子,现如今是君流帝国烟雨城中醉生楼的掌柜的,平时给别人写写故事养活自己的小人物。...

  • 寻山不望水 焉得此间美 叠梦不留情 怎得真心人

  • “是这个吗?你不是一直想要这个吗?我给你……”一个浑身滴血的男人手里捏着一颗跳动的心脏,看着前方那一道倩影。...

  • 一直非常喜欢画画,这个九月有些空闲时间,遂决定开始画画。 写这篇文章之前,我已经试验过一个计划了: 目标:学会画人...

  • 她笑看远方万家灯火,续而转头看他身上白衣似雪。 一行清泪划过脸庞,滴滴答答落在她那芊芊玉手上。似是未曾察觉,甩甩手...

网友评论

      本文标题:inspect.Parameter.KEKWORD_ONLY 引

      本文链接:https://www.haomeiwen.com/subject/eieszhtx.html