python inspect模块

作用

用于获取函数签名对象


基本用法

import inspect

# 待获取签名的函数

def func(x:int, y:str, z:list) -> None:

    pass

# 获取签名对象,包括函数名,参数等

sig = inspect.signature(func) 

print(sig)

 # 获取签名中的参数,返回有序字典

params = sig.parameters 

print(params)

# 通过循环并解构

for k, v in enumerate(params.items()):

    name, param = v

    print(param.annotation, param.kind, param.name)

# 获取签名中的返回值类型

ret = sig.return_annotation

print(ret)


例: 判断输入的实参是否为标注的类型

import datetime, time

import inspect

def check_str(func):

   def wrapper(*args, **kwargs):

       obj = inspect.signature(func)

       params = obj.parameters

       for k, v in enumerate(params.items()):

           name, param = v

           for i in args:

               if not isinstance(i, param.annotation):

                   print("{}: {} is not string".format(name, i))

                   raise TypeError

       ret = func(*args, **kwargs)

       return ret

   return wrapper

@check_str

def str_add(str1:str, str2:str):

   t1 = datetime.datetime.now()

   new_str = str1 + str2

   time.sleep(3)

   delta_time = (datetime.datetime.now() - t1).total_seconds()

   print(new_str, round(delta_time), sep="\n")

str_add(3, "4")

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 9,207评论 0 27
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,136评论 0 9
  • 其实 asyncio 的学习一点也不快乐 一、python 的多线程和多进程 要想理解 asyncio 的异步编程...
    宝宝家的隔壁老王阅读 10,335评论 2 10
  • 元宵节,古时候称为上元节。元宵节是农历年的第一个月圆之夜。人们有赏灯吃元宵的习惯。有句古话是:“三十儿的火,十五的...
    微凉一季阅读 2,985评论 0 1
  • 今天,听拾点夜听里有这样一篇文章说:我喜欢的,不过刚好是你,如果不是你,也会是别人。我不知道说这句话的时候,笔者经...
    瑾沉阅读 2,523评论 0 0