| 名称 | 说明 | 
|---|---|
| annotations | 参数和返回值的注解 | 
| call | 可调用对象协议 | 
| closure | 判断是否是闭包函数,即自由变量的绑定,一般是None | 
| code | 编译成字节码的函数元数据和函数定义体 | 
| defaults | 形式参数的默认值 | 
| get | 实现只读描述符协议 | 
| globals | 函数所在模块中的全局变量 | 
| kwdefaults | 仅限关键字形式参数的默认值 | 
| name | 函数名称 | 
| qualname | 函数的限定名称 | 
def demo(para1: int = 1, para2: str = '1') -> str:"""Args:para1: intpara2: strReturns: str"""return para1 * para2print(f"对象的所有属性(方法)名: {demo.__dir__()}")print(demo.__repr__())print('判断是否是闭包函数:%s' % demo.__closure__)print('函数的doc注释:%s' % demo.__doc__)print('函数名称: %s' % demo.__name__)print('函数所在模块名 %s' % demo.__module__)print(f'默认参数当前值组成的元组: {demo.__defaults__}')print(f'定义函数的模块的全局命名空间: {demo.__globals__}')print(f'注解组成的字典: {demo.__annotations__}')print(f'查看对象所在类: {demo.__class__}')"""对象的所有属性(方法)名: ['__repr__', '__call__', '__get__', '__new__', '__closure__', '__doc__', '__globals__', '__module__', '__code__', '__defaults__', '__kwdefaults__', '__annotations__', '__dict__', '__name__', '__qualname__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']<function demo at 0x7f9441edd5f0>判断是否是闭包函数:None函数的doc注释:Args:para1: intpara2: strReturns: str函数名称: demo函数所在模块名 __main__默认参数当前值组成的元组: (1, '1')定义函数的模块的全局命名空间: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f9441e6c710>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/zaygee/work_script/Script/python_test/round_two/7_25_test.py', '__cached__': None, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py'>, 'A': <class '__main__.A'>, 'a': <__main__.A object at 0x7f9441e7c910>, 'demo': <function demo at 0x7f9441edd5f0>}注解组成的字典: {'para1': <class 'int'>, 'para2': <class 'str'>, 'return': <class 'str'>}查看对象所在类: <class 'function'>"""
获取参数信息
1、可通过 code 获取 2、通过 from inspect import signature
def make_averager():"""计算移动平均值"""series = []def averager(new_value):# series 是自由变量:指未在本地作用域中绑定的变量series.append(new_value)print(f'series : {series}')total = sum(series)return total/len(series)return averageravg = make_averager()print(avg(10))print(avg(11))print(avg(12))# 获取函数创建的局部变量名称,其中参数名称是前N个字符串,由co_argcount可得# 获取函数创建的局部变量名称: ('new_value', 'total')print(f'获取函数创建的局部变量名称: {avg.__code__.co_varnames}')# 获取函数参数个数# 获取函数参数个数 : 1print(f'获取函数参数个数 : {avg.__code__.co_argcount}')# 获取函数中的自由变量# 获取函数中的自由变量 : ('series',)print(f'获取函数中的自由变量 : {avg.__code__.co_freevars}')
from inspect import signaturesig = signature(avg)# OrderedDict([('new_value', <Parameter "new_value">)])print(sig.parameters)for name, param in sig.parameters.items():# POSITIONAL_OR_KEYWORD : new_value = <class 'inspect._empty'>print(param.kind, ':', name, '=', param.default)"""POSITIONAL_OR_KEYWORD: 可通过定位参数和关键字参数传入的形参VAR_POSITIONAL: 定位参数元祖VAR_KEYWORD: 关键字参数字典"""
