获取Python函数信息的方法

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

定义一个Person类:

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() 命令也可以获取函数的属性信息:

person = Person()
print(dir(person))

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

结果

['__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 属性来获取注释信息(三引号括起来的注释):

func = getattr(person, "talk")
print(func.__doc__)

结果

talk function
        :return:

获取函数参数

1、 通过 __code__ 属性读取函数参数信息

>> 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) # 返回局部变量个数

结果

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 可以获取参数名,参数默认值可以通过如下方式获得:

print(func.__defaults__)

结果

(None,)

2、通过inspect库来读取函数参数信息

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

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)

结果

['self', 'name', 'age', 'height']
(None,)
None
(name, age, height=None)

也可以在函数内部使用:

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)        

结果

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

原文链接:https://www.cnblogs.com/python1111/p/17296568.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:获取Python函数信息的方法 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Python 从列表中取值和取索引的方法

    在Python中,列表是一种常用的数据类型,它可以存储多个值,并且可以根据索引值来访问和修改列表中的元素。本攻略将详细介绍如何从列表中取值和取索引的方法,包括基本语法、示例说明和常见问题解答等方面。 基本语法 在Python中,可以使用方括号[]和索引值来访问列表中的元素。列表的索引值从0开始,表示列表中的第一个元素。以下是一个示例代码,演示如何从列表中取值…

    python 2023年5月13日
    00
  • Python时间整数问题

    【问题标题】:Python time integer issuePython时间整数问题 【发布时间】:2023-04-04 03:14:01 【问题描述】: 我正在尝试计算“当时”和“现在”之间的时间差。我改变了格式,以便更好地比较它(我不需要秒或纳秒等) ‘then’ 时间来自加密,并且正在被解析以进行比较,这就是我担心的错误。 def decrypt_…

    Python开发 2023年4月6日
    00
  • python求众数问题实例

    下面是Python求众数问题的完整攻略: 什么是众数? 众数是指在一组数据中出现次数最多的数,例如在数列 1, 2, 3, 3, 3, 4, 4 中,众数是 3。在实际的数据处理过程中,求众数是一项非常常见的任务。 方法一:使用统计函数 Python中有统计函数可以直接帮我们求解众数。 from statistics import mode data = […

    python 2023年5月14日
    00
  • Python使用numpy模块实现矩阵和列表的连接操作方法

    Python使用numpy模块实现矩阵和列表的连接操作方法 在Python中,numpy是一个常用的数值计算库,它提供了高效的数组操作和数学函数。在数据处理和科学计算中,常需要对矩阵和列表进行连接操作。本攻略将介绍如何使用Python的numpy模块实现矩阵和列表的连接操作。我们将使用numpy模块中的concatenate()函数来实现这个操作。 连接矩阵…

    python 2023年5月13日
    00
  • python open函数中newline参数实例详解

    下面是我对“Python open函数中newline参数实例详解”的攻略: Python open函数中newline参数实例详解 1. 简介 在Python的文件IO操作中,open()函数一般用来打开文件并返回一个文件对象。其中,newline参数指定了文件中的换行符,它只对文本模式(”t” 或 “r+”)有效。如果不指定newline参数,Pytho…

    python 2023年5月18日
    00
  • python 3调用百度OCR API实现剪贴板文字识别

    Python 3调用百度OCR API实现剪贴板文字识别 本文介绍如何使用Python 3调用百度OCR API实现剪贴板文字识别,同时提供了2个示例来展示如何调用OCR API以及如何通过Python将识别结果保存到文本文件。 前置条件 在使用本文提供的代码之前,您需要先完成以下事项: 注册百度OCR API并获取相应的API Key和Secret Key…

    python 2023年5月19日
    00
  • Python 进程操作之进程间通过队列共享数据,队列Queue简单示例

    Python 进程操作之进程间通过队列共享数据,队列Queue简单示例 什么是Queue Python中的Queue模块提供了多种多样的队列实现。队列类对象的主要操作包括 put、get、qsize和empty等。为了实现进程之间的同步,Queue模块提供了一个Queue的类。 Queue类是一个同步队列,用于在python多线程编程时在多个线程之间传递任务…

    python 2023年5月19日
    00
  • python如何获取列表中每个元素的下标位置

    在Python中,可以使用enumerate函数获取列表中每个元素的下标位置。下面将介绍两种常用的方法。 方法一:for循环和enumerate函数 使用for循环和enumerate函数可以遍历列表中的每个元素,并获取其下标位置。以下一个使用for循和enumerate函数获取列表中每个元素的下标位置的示例: # 使用for循环和enumerate函数获取…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部