函数内省
当你拿到一个“函数对象”的时候,你可以继续知道,它的名字,参数定义状况等信息。类似与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)
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/15858047.html