函数内省

当你拿到一个“函数对象”的时候,你可以继续知道,它的名字,参数定义状况等信息。类似与JAVA的反射

>>> def f(a,b=80,c=None, *args,**kwargs):
...     d = 80
# 获得函数的默认值,仅限关键字参数的默认值在__kwdefault__属性中
>>> f.__defaults__
(80, None)
# 参数的名称在__code__属性中
>>> f.__code__
<code object f at 0x000001BC5049C0E0, file "<stdin>", line 1>
# 参数名称,不过里面包含有函数创建的局部变量
>>> f.__code__.co_varnames
('a', 'b', 'c', 'args', 'kwargs', 'd')
# co_argcount 决定参数的个数,不包含* 和 ** 的变长参数
>>> f.__code__.co_argcount
3

inspect 模块:可以把函数参数和参数的默认值一一对应起来

>>> from inspect import signature
>>>
>>> sig = signature(f)
>>> sig
<Signature (a, b=80, c=None, *args, **kwargs)>
>>> str(sig)
'(a, b=80, c=None, *args, **kwargs)'
>>> for name, param in sig.parameters.items():
...     print(param.kind,':',name,'=',param.default)
...
POSITIONAL_OR_KEYWORD : a = <class 'inspect._empty'>
POSITIONAL_OR_KEYWORD : b = 80
POSITIONAL_OR_KEYWORD : c = None
VAR_POSITIONAL : args = <class 'inspect._empty'>
VAR_KEYWORD : kwargs = <class 'inspect._empty'>

inspect.Paramter 对象kind 属性的五种取值:

POSITIONAL_ONLY         = _POSITIONAL_ONLY   (仅限位置参数)
POSITIONAL_OR_KEYWORD   = _POSITIONAL_OR_KEYWORD (可以通过定位参数和关键字参数传入)
VAR_POSITIONAL          = _VAR_POSITIONAL   (定位参数元组,例如:*args)
KEYWORD_ONLY            = _KEYWORD_ONLY      (仅限关键字参数, *号之后的关键仔参数)
VAR_KEYWORD             = _VAR_KEYWORD        (关键字参数字典,例如:**kwargs)
posted @ 2022-01-31 10:03  chuangzhou  阅读(56)  评论(0编辑  收藏  举报