inspect.Parameter.KEKWORD_ONLY 引

2020-06-01  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读