inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等,有几个好用的方法:

getargspec(func)

返回一个命名元组ArgSpect(args, varargs, keywords, defaults),args是函数位置参数名列表,varargs是*参数名,keywords是**参数名,defaults是默认参数值的元组。

在用__init__参数自动初始化实例属性的实践中,是用字节码对象的co_varnames属性来获取函数的位置参数名的:

def attr_from_locals(locals_dict):
self = locals_dict.pop('self')
code = self.__init__.__func__.__code__
args = code.co_varnames[1:code.co_argcount]
for k in args:
setattr(self, k, locals_dict[k]) class Foo(object):
def __init__(self, name, color, num=1):
x = 1
attr_from_locals(locals())

而当__init__方法使用**特殊参数接收任意数量的关键字参数时,上述代码是不适用的。可行的办法是使用字节码的co_flags属性来判断**参数是否存在。

函数使用*args语法来接受任意数量的位置参数时,co_flags置位0x04,使用**kwargs语法时,置位0x08,函数为一个生成器时,置位0x2000,其它位保留:

>>> def foo(x, *args, **kwargv):
pass >>> foo.__code__.co_varnames
('x', 'args', 'kwargv')
>>> foo.__code__.co_flags & 0x04
4
>>> foo.__code__.co_flags & 0x08
8

inspect模块的getargspec()方法正是用此判断来获取函数的特殊参数的。现在可以方便的获取__init__的**参数了:

import inspect

def attr_from_locals(locals_dict):
self = locals_dict.pop('self')
args = inspect.getargspec(self.__init__.__func__).args[1:]
for k in args:
setattr(self, k, locals_dict[k])
keywords = inspect.getargspec(self.__init__.__func__).keywords
if keywords:
keywords_dict = locals_dict[keywords]
for k in keywords_dict:
setattr(self, k, keywords_dict[k]) class Foo(object):
def __init__(self, name, **kwargv):
attr_from_locals(locals()) f = Foo('bar', color='yellow', num=1)
print f.__dict__

结果为:

{'color': 'yellow', 'num': 1, 'name': 'bar'}

对象已经正确的初始化了。

getmembers(object[, predicate])

返回一个包含对象的所有成员的(name, value)列表。返回的内容比对象的__dict__包含的内容多,源码是通过dir()实现的。

predicate是一个可选的函数参数,被此函数判断为True的成员才被返回。

getmodule(object)

返回定义对象的模块

getsource(object)

返回对象的源代码

getsourcelines(object)

返回一个元组,元组第一项为对象源代码行的列表,第二项是第一行源代码的行号

ismodule,isclass,ismethod,isfunction,isbuiltin

一系列判断对象类型的方法,大都是包装了isinstance(object, types.FunctionType)之类语句的函数。

现在可以用类型判断来返回一个类的方法了:

class Foo(object):
'''Foo doc'''
def __init__(self, name):
self.__name = name def getname(self):
return self.__name inspect.getmembers(Foo, inspect.ismethod)

  

Python标准库inspect的更多相关文章

  1. Python标准库--inspect

    inspect模块是针对模块,类,方法,功能等对象提供些有用的方法.例如可以帮助我们检查类的内容,检查方法的代码,提取和格式化方法的参数等. import inspect import os clas ...

  2. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  3. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  4. Python 标准库一览(Python进阶学习)

    转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...

  5. Python标准库笔记(9) — functools模块

    functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...

  6. python 标准库大全

    python 标准库 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 string ...

  7. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  8. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  9. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

随机推荐

  1. jQuery UI 中Tabs Ajax载入时出现Http 304的问题

    最近发现jQueryUI中tabs的ajax载入,总是会出现304未修改的情况,明明数据有变化的么~应该返回200才对. 于是尝试在beforeLoad中设置: ui.ajaxSettings.cac ...

  2. 那种多空计算方法更正确呢?——从此图看应该是TEST005

    那种方法计算多空逆转更正确呢?——从此图1看应该是TEST005,但是实际上是ZCL_多空! TEST005具有滞后性!也就是说跌了一些在报警,可能已经跌了10%(如图2) ZCL_多空:当计算结果和 ...

  3. C# asp.net webapi下支持文件下载输出接口

    /// <summary>     /// 下载文件     /// </summary>     public class DownloadController : ApiC ...

  4. c# mongo 数组里对象更新

    var queryDetail = new BsonDocument("cNo", doc.cNo);                     queryDetail.AddRan ...

  5. Beta阶段冲刺前计划与安排

    凡事预则立,在Beta开始前,以小组为单位,在敏捷冲刺前发布一篇博客,描述: 1. 介绍小组新加入的成员,Ta担任的角色. 新加入的成员是丁蓉同学,在本团队中担任前端设计. 原因:在之前的团队中,她就 ...

  6. Python全栈-day4-语法基础2

    一.字符串 1.字符串基础 1)作用:用于描述姓名.性别.地址等信息 2)定义方式:单引号或者双引号以及三引号内添加字符 注:day3中介绍 name = 'zhang' user_name = &q ...

  7. Yii Listview

  8. django之视图view小知识

    CBV简版流程 AddPublisher.as_view() ——> view 函数 当请求来的时候才执行view view中执行: 1. 先实例化AddPublisher,给self def ...

  9. JS神经网络deeplearn.js:浏览器端机器智能框架

    JS神经网络deeplearn.js:浏览器端机器智能框架 通过 deeplearn.js,可以实现在浏览器中训练神经网络模型,也可在推理阶段运行预训练模型. deeplearn.js 以 TypeS ...

  10. CAN学习网站

    百度搜索:Controller Area Network http://www.esd-electronics-usa.com/Controller-Area-Network-CAN-Introduc ...