Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >获取Python函数信息的方法

获取Python函数信息的方法

原创
作者头像
Python学习者
发布于 2023-04-14 10:48:05
发布于 2023-04-14 10:48:05
66900
代码可运行
举报
文章被收录于专栏:Python学习者Python学习者
运行总次数:0
代码可运行

Python的反射机制可以动态获取对象信息以及动态调用对象,本文介绍如何获取对象中的函数注释信息以及参数信息。

定义一个Person类:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Person():
    def talk(self, name, age, height=None):
        """talk function
        :return:
        """
        print(f"My name is {name}")
        print(f"My age is {age}")
        if height is not None:
            print(f"My height is {height}")

dir() 命令也可以获取函数的属性信息:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
person = Person()
print(dir(person))

func = getattr(person, "talk")
print(dir(func))

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'talk']

['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

获取函数注释信息

可以通过 doc 属性来获取注释信息(三引号括起来的注释):

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
func = getattr(person, "talk")
print(func.__doc__)

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
talk function
        :return:

获取函数参数

1、 通过 __code__属性读取函数参数信息
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>> print(dir(func.__code__))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']>>

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
print("co_name: ", func.__code__.co_name)  # 返回函数名
print("co_argcount: ", func.__code__.co_argcount)  # 返回函数的参数个数
print("co_varnames: ",func.__code__.co_varnames) # 返回函数的参数
print("co_filename: ", func.__code__.co_filename) # 返回文件绝对路径
print("co_consts: ", func.__code__.co_consts)
print("co_firstlineno: ",func.__code__.co_firstlineno) # 返回函数行号
print("co_kwonlyargcount: ",func.__code__.co_kwonlyargcount) # 关键字参数
print("co_nlocals: ",func.__code__.co_nlocals) # 返回局部变量个数

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
co_name:  talk
co_argcount:  4
co_varnames:  ('self', 'name', 'age', 'height')
co_filename:  D:/ProgramWorkspace/PythonNotes/00-Python-Essentials/demo.py
co_consts:  ('talk function\n        :return:\n        ', 'My name is ', 'My age is ', None, 'My height is ')
co_firstlineno:  44
co_kwonlyargcount:  0
co_nlocals:  4

通过 code.co_varnames 可以获取参数名,参数默认值可以通过如下方式获得:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(func.__defaults__)

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
(None,)
2、通过inspect库来读取函数参数信息

除了用code 属性外还可以使用inspect库来读取函数参数,使用getfullargspec和signature方法来读取函数参数:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import inspect

# inspect.getargspec(func) # python2
argspec = inspect.getfullargspec(func)
print(argspec.args)
print(argspec.defaults)
print(argspec.varkw)
sig = inspect.signature(func)
print(sig)

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
['self', 'name', 'age', 'height']
(None,)
None
(name, age, height=None)

也可以在函数内部使用:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Person():
    def talk(self, name, age, height=None):
        """talk function
        :return:
        """
        frame = inspect.currentframe()
        args, _, _, values = inspect.getargvalues(frame)
        print(inspect.getframeinfo(frame))
        print(f'function name: {inspect.getframeinfo(frame).function}')
        for i in args:
            print(f"{i} = {values[i]}")

if __name__ == '__main__':
    p = Person()
    p.talk("zhangsan", 18, height=175)        

结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
Traceback(filename='D:/ProgramWorkspace/PythonNotes/00-Python-Essentials/demo.py', lineno=44, function='talk', code_context=['        print(inspect.getframeinfo(frame))\n'], index=0)
function name: talk
self = <__main__.Person object at 0x0000023E4CF17B08>
name = zhangsan
age = 18
height = 175

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3学习笔记 | 二十一、Python的函数-函数的高级话题
当我们使用函数时,就开始面对如何将组件组合在一起的选择。例如,如何将任务分解成为更有针对性的函数(导致了聚合性),函数将如何通讯(耦合性)等。我们要深入考虑函数的大小概念,因为它们直接影响到代码的可用性。 耦合性:对于输入使用参数并且对于输出使用return语句。 耦合性:只有真正必要的情况下使用全局变量。 耦合性:不要改变可变类型的参数,除非调用者希望这么做。 聚合性:每一个函数都应该有一个单一的、统一的目标。 大小:每一个函数应该相对较小。 耦合性:避免直接改变在另一个模块文件中的变量。
TeamsSix
2019/09/24
5970
Python3学习笔记 | 二十一、Python的函数-函数的高级话题
记一次有趣的Python沙箱逃逸
今天@AD1024大佬在群里分享了个有趣的CTF题(nc problem1.tjctf.org 8006),是关于Python沙箱逃逸的。dalao原意是为了吐槽flag在的文件就是flag.txt,不过咱研究了下这沙箱逃逸,似乎有点不一般。eval、exer、open这类的函数肯定是屏蔽了,关键是它不仅屏蔽了import,双下划线都不给用。而且最骚的是,这还直接是REPL环境!ROT13的套路也没救了。
KAAAsS
2022/01/14
4150
记一次有趣的Python沙箱逃逸
Python随笔(三)虚拟机运行原理 原
说到Python的运行机制,就不得不从.pyc文件和字节码说起 PyCodeObject对象的创建时机是模块加载的时候,即import。
Pulsar-V
2019/04/01
1.3K0
Python随笔(三)虚拟机运行原理
                                                                            原
python笔记76-types.FunctionType 动态创建函数
FunctionType 需传一个CodeType 类型,可以从compile() 函数编译后的code取出编译后的code 类型
上海-悠悠
2023/01/03
5060
python笔记76-types.FunctionType 动态创建函数
怎么通过isinstance(Obj,Class)验证?【isinstance】
最近有这样一个项目,这个项目可以用一个成熟的项目的构造树,读取树,再检索的过程,现在有新的需求,另一个逻辑构造同样节点结构的树,pickle序列化保存,再使用原来项目的读取、检索函数,当我完成存储正准备读取的时候,这个成熟的项目的健壮性,拒绝了我的树,这里的拒绝逻辑具体用到了instance,这是一个判断obj是不是class的实例的python内置函数,(据说,obj是继承的子类也过,感兴趣可以验证下,我这里的任务是识别为该类实例化的对象) 使用dir(my_tree)、dir(original_tree)可以看到对象属性方法的不同:
来杯Sherry
2024/04/27
2580
怎么通过isinstance(Obj,Class)验证?【isinstance】
Python中的类在声明的时候继承object的原因
首先说明python3中无论写不写(object),默认的会自动带上,所以在python3中写不写都一样 class Student1: pass class Student2(object): pass print(dir(Student1())) print(dir(Student2())) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '
知识浅谈
2020/06/16
1.6K0
Python函数属性和PyCodeObj
python中的函数是一种对象,它有属于对象的属性。除此之外,函数还可以自定义自己的属性。注意,属性是和对象相关的,和作用域无关。
py3study
2020/01/20
8810
Python类和对象概念_Python自学第七节
了解类和对象概念首先要先了解函数的概念,在了解函数的概念基本就可以理解类和对象的概念。
张旭博客
2022/12/27
2740
一个Python3和Python2的range差异
Python 3 中执行100000000 in range(100000001)会比Python 2快的非常多。
用户1416054
2018/08/02
3490
零基础学习 Python 之函数的应用
函数是很有深度的,需要我们深入探究,实践过程中,有很多对函数的不同理解,需要我们在学习的过程中不断的思考,下面我们在昨天文章(零基础学习 Python 之与函数的初次相见)的基础上,再学习一些函数的相关应用。
编程文青李狗蛋
2019/11/07
3370
Python 高级教程之探索 Python code object
Code objects 是 CPython 实现的低级细节。 代码对象是 CPython 对一段可运行 Python 代码的内部表示,例如函数、模块、类体或生成器表达式。当你运行一段代码时,它会被解析并编译成一个代码对象,然后由 CPython 虚拟机 (VM) 运行。代码对象包含直接操作 VM 内部状态的指令列表,例如“将堆栈顶部的两个对象加在一起,将它们弹出,然后将结果放入堆栈”。这类似于像 C 这样的语言的工作方式:您将代码编写为人类可读的文本,该代码由编译器转换为二进制格式,然后运行二进制代码(C 的机器代码和 Python 的所谓字节码)直接由 CPU(对于 C)或由 CPython VM 的虚拟 CPU 执行。
海拥
2022/05/07
8080
Python中类-带括号与不带括号的区别
  有时候看到群里一些人问一些基础的知识,虽然很基础,网上随便一查即可知道,但是往往很多人就是连这些基础的知识都很模糊,甚至不清楚,这里再来复习一下python中类的一个知识点(仅此)。
全栈测试开发日记
2023/02/02
3K0
python中一些有用的函数------
函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。
py3study
2020/01/15
4740
Python 一等函数
在 Python 中,不仅整数、字符串、字典是一等对象,连函数也被当做一等公民。这说明了什么问题,先来看看一等对象的定义:
CS实验室
2021/03/22
5300
Python 一等函数
利用Python3内置文档资源高效学习及官方中文文档
从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串、列表、字典等数据结构的内置方法,和大量内置的标准库,诸如functools、time、threading等等,而我们怎么快速学习掌握并学会使用这个Python的工具集呢? 我们可以利用Python的内置文档大量资源既可以掌握许多关于Python工具集的基本使用。
一墨编程学习
2019/06/15
5090
对象内省
在电脑编程中,内省是对象再运行时检测自我的能力,在Python中,万物皆对象,所以我们可以去检测这些对象。Python有些自带函数和模块来帮助我们。
Helloted
2022/06/07
1900
[python]父类、子类、子类实例属性
本文旨在说明 父类、子类、子类实例的属性继承关系: >>> A = type('A', (), {'name':1}) >>> B = type('B',(A,), {'addr':'beijing'})    #B的父类为A >>> A.__dict__ mappingproxy({'name': 1, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute
py3study
2020/01/19
2.1K0
【测试开发】python系列教程: 标准数据类型(五)Set(集合)
集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
雷子
2022/12/29
2170
python--inspect模块
1. inspect.getmembers(object[, predicate])
yaohong
2019/09/11
7970
Python的内置函数(三十八)、 rstrip()
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
狼啸风云
2020/01/14
4910
相关推荐
Python3学习笔记 | 二十一、Python的函数-函数的高级话题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档