inspect模块提供了一系列函数用于帮助使用自省。

inspect模块主要提供了四种用处:

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

(2).获取源码

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

(4).解析堆栈

 

1. 检查对象类型

  • inspect.is{module|class|function|method|builtin|coroutine|generator}(obj): 检查对象是否为模块、类、函数、方法、内建函数或方法。
  • inspect.isroutine(obj): 用于检查对象是否为函数、方法、内建函数或方法等等可调用类型。用这个方法会比多个is*()更方便,不过它的实现仍然是用了多个is*()。 

2. 获取对象信息

  • inspect.getmembers(object[, predicate]): 
    这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), ...]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。
  • inspect.getmodule(object): 
    还在为第2节中的__module__属性只返回字符串而遗憾吗?这个方法一定可以满足你,它返回object的定义所在的模块对象。
  • inspect.get{file|sourcefile}(object): 
    获取object的定义所在的模块的文件名|源代码文件名(如果没有则返回None)。用于内建的对象(内建模块、类、函数、方法)上时会抛出TypeError异常。
  • inspect.get{source|sourcelines}(object): 
    获取object的定义的源代码,以字符串|字符串列表返回。代码无法访问时会抛出IOError异常。只能用于module/class/function/method/code/frame/traceack对象。
  • inspect.getargspec(func): 仅用于方法,获取方法声明的参数,返回元组,分别是(普通参数名的列表, *参数名, **参数名, 默认值元组)。如果没有值,将是空列表和3个None。如果是2.6以上版本,将返回一个命名元组(Named Tuple),即除了索引外还可以使用属性名访问元组中的元素。  
  • inspect.getargvalues(frame): 仅用于栈帧,获取栈帧中保存的该次函数调用的参数值,返回元组,分别是(普通参数名的列表, *参数名, **参数名, 帧的locals())。如果是2.6以上版本,将返回一个命名元组(Named Tuple),即除了索引外还可以使用属性名访问元组中的元素。 
  • inspect.getcallargs(func[, *args][, **kwds]): 返回使用args和kwds调用该方法时各参数对应的值的字典。这个方法仅在2.7版本中才有。
  • inspect.getmro(cls): 返回一个类型元组,查找类属性时按照这个元组中的顺序。如果是新式类,与cls.__mro__结果一样。但旧式类没有__mro__这个属性,直接使用这个属性会报异常,所以这个方法还是有它的价值的。 返回当前的栈帧对象。

示例:

1、获取某个模块中的函数

detect的classes怎么填 detect inspect_元组

detect的classes怎么填 detect inspect_detect的classes怎么填_02

def fidelity_promotion(order):
    """积分为1000或以上, 5%折扣"""
    discount = 0
    if order.customer.fidelity >= 1000:
        discount = order.total() * 0.05
    return discount


def bulk_promotion(order):
    """单个商品数量为20个或以上, 10%折扣"""
    discount = 0
    for item in order.cart:
        if item.quantity >= 20:
            discount += item.total() * 0.01
    return discount


def large_order_promotion(order):
    """订单中不同的商品达到10个或以上, 7%折扣"""
    discount = 0
    distinct_items = {item.product for item in order.cart}
    if len(distinct_items) >= 10:
        discount = order.total() * 0.07
    return discount

promotions

 

import promotions
import inspect
from pprint import pprint

promos = [func for func in inspect.getmembers(promotions, inspect.isfunction)]
pprint(promos)
>>>
[('bulk_promotion', <function bulk_promotion at 0x013930C0>),
 ('fidelity_promotion', <function fidelity_promotion at 0x01372300>),
 ('large_order_promotion', <function large_order_promotion at 0x01393078>)]