说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
inspect 模块提供了一些有用的函数帮助获取对象的信息,例如模块、类、方法、函数、回溯、帧对象以及代码对象。例如它可以帮助你检查类的内容,获取某个方法的源代码,取得并格式化某个函数的参数列表,或者获取你需要显示的回溯的详细信息。
inspect 模块提供了以下主要的功能:
import inspect
class Test(object):
"""Test Class doc"""
def test(self):
self.fuc = lambda x: x
class Testone(Test):
pass
# 是不是一个类?
inspect.isclass(Test) # True
# 类的文档
inspect.getdoc(Test) # Test Class doc
# 是不是一个函数
inspect.isfunction(Test.test) # True
# 查看对象可调用的成员
inspect.getmembers(Test, callable)
Python 的内省(Introspection)与反射(Reflection)可以提高我们对代码掌控能力。
内省,有时也叫类型内省,是在运行时进行的一种对象检测机制。我们可以通过内省来获取一个对象的所有信息,比如这个对象的类型,其中包含哪些属性等等。
如 dir()
是内省机制中的一个重要内置函数,这个函数可以将一个对象的所有属性以字符串列表的形式返回。
如 类型检查 isinstance()
,但对于有继承关系的两个类,尽管它们并不同,它的结果始终是 True。inspect 模块就可以实现更加复杂的需求。
与内省相比,反射的功能要显得更为强大。反射使得程序具有在运行时动态修改自己的结构和行为的能力。如有一个空模块,我们可把所有的环境变量作为属性添加到这个模块中。
# 栈调用信息
inspect.stack()[0][3]
# 通过输入一个路径返回模块名称
path = "D:\py\my.py"
path = "D:\py"
path = 'hom/my.py'
inspect.getmodulename(path)
# 查看函数的路径
inspect.getabsfile(pd.Series)
# 查看函数代码
print(inspect.getsource(pd.Series.sum))
其中 inspect.getfullargspec
非常有用,可以查看函数的参数信息:
# 查看函数参数
inspect.getfullargspec(pd.Series.sum)
'''
FullArgSpec(args=['self', 'axis', 'skipna', 'level',
'numeric_only', 'min_count'],
varargs=None, varkw='kwargs',
defaults=(None, None, None, None, 0),
kwonlyargs=[], kwonlydefaults=None,
annotations={})
'''
# 查看类的参数,括号也可写(模块.类.__init__)
inspect.getfullargspec(pd.Series)
返回的信息包含:
inspect.getmembers(Test) 用于判定某对象是否有如下的特殊属性:
类型 | 属性 | 描述 |
---|---|---|
module 模块 | __doc__ |
文档字符串 |
__file__ |
文件名(内置模块没有文件名) | |
class 类 | __doc__ |
文档字符串 |
__name__ |
类定义时所使用的名称 | |
__qualname__ |
qualified name 限定名称 | |
__module__ |
该类型被定义时所在的模块的名称 | |
method 方法 | __doc__ |
文档字符串 |
__name__ |
该方法定义时所使用的名称 | |
__qualname__ |
qualified name 限定名称 | |
__func__ |
实现该方法的函数对象 | |
__self__ |
该方法被绑定的实例,若没有绑定则为 None | |
__module__ |
name of module in which this method was defined | |
函数 | __doc__ |
文档字符串 |
__name__ |
用于定义此函数的名称 | |
__qualname__ |
qualified name 限定名称 | |
__code__ |
包含已编译函数的代码对象 bytecode | |
__defaults__ |
tuple of any default values for positional or keyword parameters | |
__kwdefaults__ |
mapping of any default values for keyword-only parameters | |
__globals__ |
global namespace in which this function was defined | |
__annotations__ |
mapping of parameters names to annotations; "return" key is reserved for return annotations. | |
__module__ |
name of module in which this function was defined | |
回溯 | tb_frame |
此级别的框架对象 |
tb_lasti |
index of last attempted instruction in bytecode | |
tb_lineno |
current line number in Python source code | |
tb_next |
next inner traceback object (called by this level) | |
框架 | f_back |
next outer frame object (this frame's caller) |
f_builtins |
builtins namespace seen by this frame | |
f_code |
code object being executed in this frame | |
f_globals |
global namespace seen by this frame | |
f_lasti |
index of last attempted instruction in bytecode | |
f_lineno |
current line number in Python source code | |
f_locals |
local namespace seen by this frame | |
f_trace |
tracing function for this frame, or None | |
code | co_argcount |
number of arguments (not including keyword only arguments, * or ** args) |
co_code |
原始编译字节码的字符串 | |
co_cellvars |
单元变量名称的元组(通过包含作用域引用) | |
co_consts |
字节码中使用的常量元组 | |
co_filename |
创建此代码对象的文件的名称 | |
co_firstlineno |
number of first line in Python source code | |
co_flags |
bitmap of CO_* flags, read more here | |
co_lnotab |
编码的行号到字节码索引的映射 | |
co_freevars |
tuple of names of free variables (referenced via a function's closure) | |
co_posonlyargcount |
number of positional only arguments | |
co_kwonlyargcount |
number of keyword only arguments (not including ** arg) | |
co_name |
定义此代码对象的名称 | |
co_names |
局部变量名称的元组 | |
co_nlocals |
局部变量的数量 | |
co_stacksize |
需要虚拟机堆栈空间 | |
co_varnames |
参数名和局部变量的元组 | |
生成器 | __name__ |
名称 |
__qualname__ |
qualified name 限定名称 | |
gi_frame |
框架 | |
gi_running |
生成器在运行吗? | |
gi_code |
code | |
gi_yieldfrom |
object being iterated by yield from, or None | |
协程 | __name__ |
名称 |
__qualname__ |
qualified name 限定名称 | |
cr_await |
object being awaited on, or None | |
cr_frame |
框架 | |
cr_running |
is the coroutine running? | |
cr_code |
code | |
cr_origin |
where coroutine was created, or None. See sys.set_coroutine_origin_tracking_depth() | |
builtin | __doc__ |
文档字符串 |
__name__ |
此函数或方法的原始名称 | |
__qualname__ |
qualified name -- 限定名称 | |
__self__ |
instance to which a method is bound, or None |
inspect.ismodule(object) # 是否为模块
inspect.isclass(object) # 是否为类
# 是否为方法(bound method written in python)
inspect.ismethod(object)
# 是否为函数(包括 lambda 表达式)
inspect.isfunction(object)
# 是否为python生成器函数
inspect.isgeneratorfunction(object)
inspect.isgenerator(object) # 是否为生成器
inspect.istraceback(object) # 是否为 traceback
inspect.isframe(object) # frame
inspect.iscode(object) # 是否为 code
# 是否为 built-in 函数或 built-in 方法
inspect.isbuiltin(object)
# 是否为用户自定义或者built-in函数或方法
inspect.isroutine(object)
inspect.isabstract(object) # 是否为抽象基类
inspect.ismethoddescriptor(object) # 是否为方法标识符
# 是否为数字标识符,数字标识符有__get__ 和__set__属性
# 通常也有__name__和__doc__属性
inspect.isdatadescriptor(object)
# 是否为 getset descriptor
inspect.isgetsetdescriptor(object)
# 是否为member descriptor
inspect.ismemberdescriptor(object)
签名对象代表一个可调用对象的调用签名和返回注解(return annotation)。如果需要创建一个签名对象,可以使用 signature() 函数。所谓的可调用对象(callable object),一般为函数和方法,当然类也是可调用对象。
import pandas as pd
from inspect import signature
# 可调用检测
callable(pd.Series) # True
# 定义一个签名对象
sig = signature(pd.Series)
Parameter 类是用来包含函数参数的信息的,包括的信息有:
sig.parameters # 参数
'''
mappingproxy({'data': <Parameter "data=None">,
'index': <Parameter "index=None">,
'dtype': <Parameter "dtype=None">,
'name': <Parameter "name=None">,
'copy': <Parameter "copy=False">,
'fastpath': <Parameter "fastpath=False">})
'''
str(sig) # 转为字符查看
# '(data=None, index=None, dtype=None,
# name=None, copy=False, fastpath=False)'
# 指定参数的 Parameter 对象字符串
sig.parameters['copy'].__str__()
# 'copy=False'
# 指定参数的注解
sig.parameters['data'].annotation
# inspect._empty
# 以下是 <Parameter "xxx"> 参数对象的属性
# 没有默认值时
sig.parameters['copy'].empty # inspect._empty
# 参数名称
sig.parameters['copy'].name # 'copy'
# 默认值
sig.parameters['copy'].default # False
# 参数注解
sig.parameters['copy'].annotation # inspect._empty
# 参数的类型
sig.parameters['copy'].kind
# <_ParameterKind.POSITIONAL_OR_KEYWORD: 1>
# 参数的类型有以下几种
'''
POSITIONAL_ONLY 只能作为位置参数
POSITIONAL_OR_KEYWORD 位置参数或关键字参数
VAR_POSITIONAL *args,传入后会以元组的形式展现
KEYWORD_ONLY 只能作为关键字参数
VAR_KEYWORD **kwargs,传入会以字典的形式展现
'''
绑定参数(BoundArguments)是指函数调用时的实际参数。
# 绑定
res = sig.bind(data=0, name='hello')
res
# <BoundArguments (data=0, index=None, dtype=None,
# name='hello', copy=False, fastpath=False)>
res.arguments # 参数
'''
OrderedDict([('data', 0),
('index', None),
('dtype', None),
('name', 'hello'),
('copy', False),
('fastpath', False)])
'''
res.args # 位置参数值构成的元组
# (0,)
# res.kwargs # 关键字参数值构成
{'name': 'hello'}
res.signature # 签名对象
# <Signature (data=None, index=None, dtype=None,
# name=None, copy=False, fastpath=False)>
res.apply_defaults() # 为缺少的参数设置默认值
'''
将 BoundArguments 中没有专门设置的 argument 设置为默认参数:
- *args的默认值为空元组。
- **kwargs的默认值为空字典。
'''
BoundArguments 可以用到函数里面:
# 绑定
ba = sig.bind(data=[1,2,3,4])
# 应用到函数
pd.Series(*ba.args, **ba.kwargs)
'''
0 1
1 2
2 3
3 4
dtype: int64
'''
更新时间:2020-12-23 00:31:24 标签:python 类型