18、【转载】python中inspect模块

转载自:https://blog.csdn.net/weixin_35955795/article/details/53053762

前言

我在学习到实战Day5 - python教程 - 廖雪峰的官方网站时,遇到了inspect模块,之前对这个inspect模块一无所知啊,所以本着打破砂锅问到底的精神,决定对inspect模块做一些探究。

根据度娘搜到的,inspect模块主要提供了四种用处:

(1). 对是否是模块,框架,函数等进行类型检查。

(2). 获取源码

(3). 获取类或函数的参数的信息

(4). 解析堆栈

我在这次课程中,只用到了第三种用处,即获取类或函数的参数的信息,下面我来探究一下。

探究

结合我正在学习的课程,我自己也对inspect做了一些探究。根据在课程中用到的一些函数及方法,我做了一个python脚本。

# test
import inspect

def fn(a, b=0, *c, d, e=1, f=‘hello‘, **g):
    pass

sig = inspect.signature(fn)
print("inspect.signature(fn)的值是:%s" % sig)  #(a, b=0, *c, d, e=1, f=‘hello‘, **g)
print("inspect.signature(fn)的类型:%s" % (type(sig)))  #<class ‘inspect.Signature‘>
print("\n")

params = sig.parameters
print("signature.paramerters属性的值是:%s" % params)  #OrderedDict([(‘a‘, <Parameter "a">), (‘b‘, <Parameter "b=0">), (‘c‘, <Parameter "*c">), (‘d‘, <Parameter "d">), (‘e‘, <Parameter "e=1">), (‘f‘, <Parameter "f=‘hello‘">), (‘g‘, <Parameter "**g">)])
print("ignature.paramerters属性的类型是%s" % type(params))    #<class ‘mappingproxy‘>
print("\n")

for name, param in params.items():
    print(‘*‘ * 20, ‘Start‘, ‘*‘ * 20)

    print("mappingproxy.items()返回的两个值分别是:%s和%s" % (name, param))
    print("mappingproxy.items()返回的两个值的类型分别是:%s和%s" % (type(name), type(param)))  #<class ‘str‘>和<class ‘inspect.Parameter‘>
    print("\n")

    k = param.kind
    print("Parameter.kind属性的值是:%s" % k)
    print("Parameter.kind属性的类型是:%s" % type(k))   #<enum ‘_ParameterKind‘>
    print("\n")

    dft = param.default
    print("Parameter.default的值是: %s" % dft)
    print("Parameter.default的属性是: %s" % type(dft))

    print(‘*‘ * 20, ‘End‘, ‘*‘ * 20)
    print("\n")

pk = inspect.Parameter.POSITIONAL_OR_KEYWORD
print("inspect.Parameter.POSITIONAL_OR_KEYWORD的值是:%s" % pk)
print("inspect.Parameter.POSITIONAL_OR_KEYWORD的类型是:%s" % type(pk))

ko = inspect.Parameter.KEYWORD_ONLY
print("inspect.Parameter.KEYWORD_ONLY的值是:%s" % ko)
print("inspect.Parameter.KEYWORD_ONLY的类型是:%s" % type(ko))

执行以上脚本,将得到如下输出:

inspect.signature(fn)的值是:(a, b=0, *c, d, e=1, f=‘hello‘, **g)
inspect.signature(fn)的类型:<class ‘inspect.Signature‘>

signature.paramerters属性的值是:OrderedDict([(‘a‘, <Parameter "a">), (‘b‘, <Parameter "b=0">), (‘c‘, <Parameter "*c">), (‘d‘, <Parameter "d">), (‘e‘, <Parameter "e=1">), (‘f‘, <Parameter "f=‘hello‘">), (‘g‘, <Parameter "**g">)])
ignature.paramerters属性的类型是<class ‘mappingproxy‘>

******************** Start ********************
mappingproxy.items()返回的两个值分别是:a和a
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:POSITIONAL_OR_KEYWORD
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: <class ‘inspect._empty‘>
Parameter.default的属性是: <class ‘type‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:b和b=0
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:POSITIONAL_OR_KEYWORD
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: 0
Parameter.default的属性是: <class ‘int‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:c和*c
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:VAR_POSITIONAL
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: <class ‘inspect._empty‘>
Parameter.default的属性是: <class ‘type‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:d和d
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:KEYWORD_ONLY
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: <class ‘inspect._empty‘>
Parameter.default的属性是: <class ‘type‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:e和e=1
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:KEYWORD_ONLY
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: 1
Parameter.default的属性是: <class ‘int‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:f和f=‘hello‘
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:KEYWORD_ONLY
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: hello
Parameter.default的属性是: <class ‘str‘>
******************** End ********************

******************** Start ********************
mappingproxy.items()返回的两个值分别是:g和**g
mappingproxy.items()返回的两个值的类型分别是:<class ‘str‘>和<class ‘inspect.Parameter‘>

Parameter.kind属性的值是:VAR_KEYWORD
Parameter.kind属性的类型是:<enum ‘_ParameterKind‘>

Parameter.default的值是: <class ‘inspect._empty‘>
Parameter.default的属性是: <class ‘type‘>
******************** End ********************

inspect.Parameter.POSITIONAL_OR_KEYWORD的值是:POSITIONAL_OR_KEYWORD
inspect.Parameter.POSITIONAL_OR_KEYWORD的类型是:<enum ‘_ParameterKind‘>
inspect.Parameter.KEYWORD_ONLY的值是:KEYWORD_ONLY
inspect.Parameter.KEYWORD_ONLY的类型是:<enum ‘_ParameterKind‘>

总结

  • inspect.signature(fn)将返回一个inspect.Signature类型的对象,值为fn这个函数的所有参数
  • inspect.Signature对象的paramerters属性是一个mappingproxy(映射)类型的对象,值为一个有序字典(Orderdict)。
    • 这个字典里的key是即为参数名,str类型
    • 这个字典里的value是一个inspect.Parameter类型的对象,根据我的理解,这个对象里包含的一个参数的各种信息
  • inspect.Parameter对象的kind属性是一个_ParameterKind枚举类型的对象,值为这个参数的类型(可变参数,关键词参数,etc)
  • inspect.Parameter对象的default属性:如果这个参数有默认值,即返回这个默认值,如果没有,返回一个inspect._empty类。

原文地址:https://www.cnblogs.com/zwb8848happy/p/8849702.html

时间: 2024-11-06 00:49:29

18、【转载】python中inspect模块的相关文章

Python中logging模块的基本用法

在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 怎样进行日志记录相关配置 日志记录使用常见误区 下面我们来梳理一下整个演讲的过程,其实其核心就是介绍了 logging 模块的使用方法和一些配置. 日志记录的重要性 在开发过程中,如果程序运行出现了问题,我们是可以使用我们自己的 Debug 工具来检测到到底是哪一步出现了问题,如果出现了问题的话,

Python中ConfigParser模块应用

Python中ConfigParser模块应用 Python的ConfigParser模块定义了3个对INI文件进行操作的类 RawConfigParser,ConfigParser和SafeConfigParser.其中RawCnfigParser是最基础的INI文件读取类,ConfigParser.SafeConfigParser支持对%(value)s变量的解析. 下面看看怎样通过ConfigParser类来解析一个ini文件. 配置文件settings.cfg [DEFAULT] myk

python中threading模块详解(一)

python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一.Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行. 这里对使用多线程并发,和不适用多线程并发做

Python中optionParser模块的使用方法[转]

本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例如下: ? 1 2 3 4 5 6 7 8

python的inspect模块2

转自:http://blog.csdn.net/mldxs/article/details/8652010 一.inspect模块主要提供了四种用处: (1).对是否是模块,框架,函数等进行类型检查. (2).获取源码 (3).获取类或函数的参数的信息 (4).解析堆栈 使用inspect模块可以提供自省功能,下面是关于自省的一些介绍, 首先通过一个例子来看一下本文中可能用到的对象和相关概念. import sys                  # 模块,sys指向这个模块对象 def fo

正则表达式与Python中re模块的使用

正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 另外,给大家介绍一个在线测试正则表达式的神器网站:http://tool.chinaz.com/regex 大家可以去这里练习正则表达式 下面总结一下正则表达式与re模块的基础与使用. 正则表达式 使用场景 关于正则表达式的基本概念这里就不赘述了,大家可以去各种百科里查找它的定义.正则的使用场景主要分为两个: 一是:检测某一段字符串是否符合规则,也就是我们常说的"校验"

Python中time模块详解

在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST

python中的模块安装

python中的模块研究: 需要用import导入的模块都是用python实现的. 内建的部分是用c.c++实现的. pypi:第三方的python包. 在windows上安装python: 1.安装python到C:\PythonXX,添加系统环境变量path:C:\PythonXX. 安装pypi库的方法三种方法: 1.在pypi上下载安装包离线安装 cd  $package-dir python   setup.py  install 在windos的cmd上也可以这样安装. 3.用eas

【转】关于python中re模块split方法的使用

注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于python中re模块split方法的使用 已有 3094 次阅读 2014-3-12 11:30 |系统分类:科研笔记 今天在写一段小代码的时候需要用到re.split()方法,在使用的过程中发现了一个以前不知道的新用法,发现这个用法还是挺实用的,就把它记录下来: >>> m = re.s