首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在python中,我如何知道我的函数是在哪段代码中被调用的?

在Python中,可以使用inspect模块来获取函数被调用的信息。具体步骤如下:

  1. 首先,导入inspect模块:import inspect
  2. 在函数内部,使用inspect.stack()方法获取当前调用栈的信息:stack = inspect.stack()
  3. 调用栈是一个列表,其中每个元素都是一个包含调用信息的元组。可以通过访问元组的元素来获取所需的信息。
  4. 调用栈的第一个元素是当前函数的调用信息,第二个元素是调用当前函数的函数的调用信息,以此类推。
  5. 可以使用inspect.getframeinfo()方法来获取调用信息的更多细节。
  6. 通过访问调用信息的元素,如文件名、行号等,可以确定函数被调用的位置。

下面是一个示例代码:

代码语言:txt
复制
import inspect

def my_function():
    stack = inspect.stack()
    caller_frame = stack[1]
    caller_info = inspect.getframeinfo(caller_frame[0])
    print(f"My function is called from {caller_info.filename} at line {caller_info.lineno}")

def another_function():
    my_function()

another_function()

运行以上代码,输出将会是类似于以下内容:

代码语言:txt
复制
My function is called from example.py at line 10

请注意,inspect模块提供了许多其他有用的函数和类,可以用于获取更多关于代码结构和执行的信息。详细信息可以参考Python官方文档中的inspect模块文档:https://docs.python.org/3/library/inspect.html

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言在ARM中函数调用时,栈是如何变化的?

r11 是栈帧指针 fp。 3. r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。...被调用函数在返回之前不必恢复 r12。 4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。 5....如何能让读者接受吸收的更快,我一直觉得按照学习效率来讲的话顺序应该是视频,图文,文字。...反正我是比较喜欢视频类的教学。这里给大家画下栈变化的过程是什么样子的。这里的图是结合上面的代码来画的,希望有助于读者的理解。...fun代码 13.c入栈 14.可以看到函数fun的数据 形参a,b 在上一层函数的栈中.

14.3K84

别@我了,我就一个写代码的,我哪知道哪家是不正规的,Python爬取美团店铺数据,并可视化展示数据

前言 今天教的是爬取每天按摩店的数据,不爬不知道呀,光是一个城市的前10页数据,都有1000多家店了,全部爬完,那不得至少3000家以上?...现在的市场需求都那么大吗 代码主要内容 动态数据抓包 json数据解析 requests模块的使用 保存csv 环境介绍 python 3.8 解释器 pycharm 编辑器 开始代码,先导包 import...= response.json()['data']['searchResult'] # for 遍历 提取列表中的每一个元素内容 for index in searchResult: # pprint.pprint..., 'limit': '32', 'offset': page, 'cateId': '-1', 'q': '按摩', } 这个是第二页和第三页的数据内容...pyecharts.globals import ThemeType #引入主题 df = pd.read_csv('美团按摩店top2.csv',encoding='utf-8',engine="python

74950
  • 我是如何调试 Webpack 问题的

    emmm,成功勾起我的好奇心了,虽然写过一些 Webpack 源码分析的文章,但 webpack-dev-server 确实不在我的知识范围,好在我有秘籍《如何阅读源码 —— 以 Vetur 为例》,是时候展示真正的技术了...局部分析 切入点:验证 serve-index 包的作用 经过上面的分析,虽然我还不知道问题具体出在哪里,但大致可以判定跟 serve-index 包强相关,先搜一下 webpack-dev-server...不过,作为一个有追求的程序员怎么会止步于此呢,我们继续往下挖呀:到底是那一段代码决定了流程会不会进入 serveIndex 中间件?...嗯,有思路了,我们沿着 webpack-dev-server 的 middleware 队列,找到 serveIndex 之前都有哪些中间件,分析这些中间件的代码应该就能解答: 到底是那一段代码决定了流程会不会进入...但是,express 中间件架构下,从 next 调用到实际中间件函数隔着很远的调用链路,很难通过断点的调用堆栈判断出上一级中间件,以及更更上一级中间件在哪里啊: 这时候不能硬刚,得换一个技巧了 ——

    1.1K30

    我是如何调试 Webpack 问题的

    emmm,成功勾起我的好奇心了,虽然写过一些 Webpack 源码分析的文章,但 webpack-dev-server 确实不在我的知识范围,好在我有秘籍《如何阅读源码 —— 以 Vetur 为例》,是时候展示真正的技术了...虽然不知道这是在那一层生成的,但可以肯定绝对不是我写的,而且这是在 HTTP 层面发生的。...不过,作为一个有追求的程序员怎么会止步于此呢,我们继续往下挖呀:到底是那一段代码决定了流程会不会进入 serveIndex 中间件?...但是,express 中间件架构下,从 next 调用到实际中间件函数隔着很远的调用链路,很难通过断点的调用堆栈判断出上一级中间件,以及更更上一级中间件在哪里啊: ?.../lib/util.js 文件中被使用了 23 次 那,就先挑软柿子捏,看看 middleware.js 文件中是怎么用的: const { getFilenameFromUrl } = require

    2.9K30

    Python DeBug的7个步骤【Programming】

    想想看,当蛋糕没有起酥的时候,忘记加发酵粉是多么的明显。 是时候查看一下堆了。很有可能问题出在代码中,而不是Python核心,甚至不是第三方软件包,所以先扫描堆栈,在代码中寻找代码行。...“但是Maria,”我听到你说,“如果我有一个堆栈跟踪,这些都是有帮助的,但是我只有一个失败的测试。我该从哪里开始呢?” Pdb,Python调试器。 在您的代码中找到一个您知道此调用应该命中的位置。...但是看看你把print语句放在哪里的函数,你不知道你是怎么到那里的。查看代码是一个很好的方式来了解你将要去的地方,但是对于了解你去过的地方来说是很糟糕的。...是的,我已经在我的代码库中查找了一个函数调用的位置,但是这可能会变得很乏味,并且对于一个流行的函数来说并不能缩小范围。Pdb非常有用。 您按照我的建议,插入pdb断点并运行测试。...如果通过查看堆栈,您不知道另一个调用是如何或者在哪里出错的,那么在堆栈中找到属于您的一些代码,并在该文件中放置一个断点,在堆栈跟踪中的断点之上放置一行。再试一次新的测试。

    1.2K00

    怎样学Python 第二十一课 模块简介

    (注:CoD是使命召唤游戏) 现在想象一下,如果你在像阿拉斯加这样的特定环境中露营,你肯定需要特殊装备才能在那里露营,想象一下,如果你每次驻扎时都必须为每一个单一的环境带来每一件装备,这将是一个巨大的痛苦...Python也是如此,为什么要把所有的函数和类放在一个地方? 它什么也不做,只是减缓了解释者的速度,如果我们将所有代码分成不同的组,那么只需选择我们需要并运行的代码就会更容易,更快速!...现在我们已经了解了哪些模块,我们可以演示如何使用它们,这里用作实例的是Python的os模块。 方法1:导入整个模块 当我们想要使用某个模块时,我们需要导入该模块。...如果我们导入整个模块,我们需要在调用该函数之前指定模块名称,以便解释器知道在哪里查找该函数。...getcwd()函数,我们可以在不指定模块的情况下调用它了。

    77560

    类和函数傻傻分不清楚?三个例子讲明白

    函数的本质就是一段有特定功能、可以重复使用的代码,这段代码已经被提前编写好了,并且为其起一个“好听”的名字。在后续编写程序过程中,如果需要同样的功能,直接通过起好的名字就可以调用这段代码。...很显然,这样的答案并没有让人搞明白类和函数到底不一样在哪里。但是里面提到了类是创建一个对象,所以类是面向对象程序设计(Object Oriented Programming)。也就是我们常说的OOP。...简单来说当Python中没有可以完全表达我们要表示的内容的数据类型时,那么就需要使用一个类。来看下面的例子。 如果我正在计算某人的年龄,则只需使用int 因为它可以满足我的需求。...,但是在使用函数的时候,我们需要记住学生是谁,成绩存储在哪里,似乎不是很困难(如果需要输出的学生更多呢),但是OOP避免了这一点。...如果我们在一个类中只有一个函数,那么请坚持只写一个函数。 如果需要在函数调用之间保留一些状态,那么最好使用带有该函数的类作为方法

    1.3K20

    性能测试代码级分析能力应用

    调用耗时分析调用耗时是代码级分析能力中比较核心的部分,系统展示当前请求在此实例中执行所用方法的详情,包括方法名和耗时信息。...其中,方法名主要指当前调用过的每个方法的名,一般也会包括其参数信息,方便测试工程师判断异常点在哪段代码中。耗时信息指当前方法完成执行的时间。...下面我将给出一个简单的Python示例来演示如何使用cProfile模块来进行耗时分析。...cProfile是Python的一个内置性能分析工具,它可以帮助开发者了解程序运行时各个部分的执行时间和调用次数等信息。这里提供一个简单的例子来展示如何使用cProfile进行函数的耗时分析。...SQL分析在常规系统中存在大量的SQL调用,这些SQL调用也可能成为性能瓶颈,因此对于SQL句的分析至关重要。

    9510

    15分钟带你了解虚拟内存

    而起意写这篇文章主要还是因为在python,人工智能的大浪潮下,我发现好多人对这方面真的无限趋近于不知道。...我希望通过这篇文章可以帮助你可以通过推理的方法回答出虚拟内存的各种问题,可以知道这个东西是如何真正和程序结合起来的。...,如何hack一个程序 本文所有的代码都很简单,只有c语言代码和python代码,并且我都跑过,如果你使用以下的环境,应该代码都能跑起来看到结果: 一台Linux发行版的机器,我用的,一个树莓pi Python...如果你真的不知道,那么我觉得还是应该去学习下内存的知识的以及计算机程序是如何被执行起来的。...剩下来我想展示的是函数的地址,所谓调用函数,其实就是执行某一个地址的代码。

    69450

    Python编程遇问题,文科生怎么办?

    如果你没有良好的Python编程基础,在尝试应用数据科学方法时遇到了问题和困难,又不知道该如何有效解决,那么这篇文章就是为你写的。请务必认真阅读哟。 ?...这一大段代码用空行分割,一共是3个部分。前面10行是第一部分。中间2行第二部分,后面是第三部分。我们把它拆分成3个Jupyter中的代码段落,单独执行。 ? 上面的运行结果,证明我们的猜测是对的。...你在命令提示符下,自己都找不到dot命令,你能指望Python有多智能呢? 怎么办?方法其实并不难,只需要加上必要的路径,让电脑知道dot这个命令在哪里,就可以了。...大卫用的是macOS。安装Graphviz之后,mac操作系统记录下来了Graphviz的各项可执行命令。Python因此也知道了dot这个命令在哪里。所以调用起来没有任何问题。...例如读完了我那篇《如何用Python做词云?》后,有读者在微信公众号后台留言,询问我如何在绘制词云的时候,把词云变成需要的形状。 ? 读者想要的,其实是这样的效果: ?

    89120

    如何能正常获取17track物流网站的物流信息?

    格式化就可以看到上图的代码,一眼看去,这代码很像我之前这篇请求网页时,怎么给我返回了一段 JavaScript 代码,都是前面一个大数组,然后在一个地方把这个数组的顺序,然后通过一个函数来将这个数组的元素来解密成正常的函数名...这样子就找到生成位置了,现在就是查看右边的调用栈,查看是在哪个地方开始执行的,看看他们之间的调用关系。 ? 3....把生成的参数代码扣出来 在上面的cookie 生成可以看到是一个数组,然后使用 join() 来连接起来的 ? 我们可以观察这个数组在哪里生成和赋值的,也通过调用栈可以看到参数生成地方是在这里 ?...然后对比原文件中的参数 ,发现这个是我们传的 formdata,所以为了测试先赋值一个即可。 ? 接着是这个错误,这个未定义,也是在原文件中看他的定义处即可。可以这样看 ?...这就是所谓的内存爆破,这时因为里面有个函数检测到了你展开了代码,所以就来内存爆破,这个都是我在请求网页时,怎么给我返回了一段 JavaScript 代码这里得到经验的,如果你需要调试寻找的话,可以先在我们扣出来的代码随便写个错误

    2.4K20

    Rc-lang开发周记5 函数其二&OOP其一

    函数在VM的实现 回顾 之前没有提及函数相关的内容在vm是怎么实现的,所以这里首先提及这个话题 函数的实现无外乎就是调用与返回的情况,这里再多加一个关于getlocal和setlocal以及计算的实现部分...一些语言this相关 说到this指针,我想到了两个语言 第一个是Python,因为Python是需要显式传递self的 另一个是C#,C#的extension机制大概是这个样子,通过这种方式来给某个类添加类函数...目前我已知的做法有如下几种 C++中对于类似的类在实例化的时候会有一个一字节的空间占用,为的是区分地址 而Rust则有一个叫ZeroSizedTypes的东东,在谷歌搜索的时候搜索到了这样一段代码 use...我想这是因为Ruby的一切皆对象的缘故。哪怕只是一个单独的函数,也是定义在Kernel中,本质上还是一个成员函数。...而这个initialize也是和普通的成员函数是一致的,特别之处只是会在Object的new中被调用,甚至和普通成员函数一样可以被外部调用 == disasm: #

    32830

    动画图解程序?这个可视化运行环境太方便了

    所以,每当有人对自己的代码没有给出预想结果而百思不得其解,无奈寻求帮助时,我都会建议在程序中增加输出,一方面是根据不同输出的先后顺序来判断程序的运行路径,另一方面则是观察各变量在运行过程中的实际数值,确认是在哪里发生了错误...理解每一行源代码在程序执行时在计算机中的过程。...、列表、函数、模块的代码片段。...看看效果如何: 左边是代码,箭头表示当前运行到的位置。 通过下面的按钮和进度条可以直接控制程序的进行。 右上是输出。 右下就是程序的可视化模拟。...在这个例子里,可以清楚地看到过程中变量的变化,何时调用了函数等信息。 借助 Python Tutor,除了可以让编程新手更容易理解程序的运行过程,还能可视化地展示算法执行,如排序、链表插入等。

    38210

    笨办法学 Python3 第五版(预览)(二)

    这意味着x = x + y与x += y是相同的。 readline() 如何知道每行在哪里?...确保你知道如何做到这一点,如果不知道,可以回顾练习 0 中学习如何从终端运行 Python 代码。 我将教你如何研究一段代码以揭示其秘密。...有了这个想法,让我们逐行分解ex22.py中的代码: 1-2 我从你已经了解的常规命令行参数处理开始。 5 我在一个方便命名为main的函数中开始这段代码的主要部分。这将在脚本末尾调用以启动事务。...当这是假的时候,Python 将跳过 9-10 行。 9 然后我调用一个单独的函数来实际打印这一行。这简化了我的代码,使我更容易理解它。如果我想了解这个函数的作用,我可以跳转到它并进行研究。...一旦我知道print_line做什么,我就可以将我的记忆与名称print_line联系起来,然后忘记细节。 10 我在这里写了一小段强大的魔法。我在main函数内部再次调用main。

    20710

    深入浅出理解闭包

    上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据: 变量、函数表达式——变量声明,默认赋值为undefined; this——赋值; 函数声明——赋值; 如果在函数中,除了以上数据之外,...在执行代码之前,首先将创建全局上下文环境。 image.png 然后是代码执行。代码执行到第12行之前,上下文环境中的变量都在执行过程中被赋值。 image.png 执行到第13行,调用bar函数。...image.png 好了,我很耐心的给大家介绍了一段简短代码的执行上下文环境的变化过程,一个完整的闭环。其中上下文环境的变量赋值过程我省略了许多,因为那些并不难,一看就知道。...对于本文第一段代码,在fn函数中,取自由变量x的值时,要到哪个作用域中取?——要到创建fn函数的那个作用域中取——无论fn函数将在哪里调用。 上面描述的只是跨一步作用域去寻找。...另外,对于函数来说,上下文环境是在调用时创建的,这个很好理解。拿参数做例子,你不调用函数,我哪儿知道你要给我传什么参数? 8.2. 作用域: 首先,它很抽象。

    73920

    如何用 Python 和 API 收集与分析网络数据?

    14个组中,有一多半都和他们一样,做的是维基百科页面访问量分析。 为什么会这样呢? 因为我在布置作业的时候,很贴心地给了一个样例,是我之前写的一篇教程《如何用R和API免费获取Web数据?》。...就好像你要去见朋友,总得知道见面的地址在哪里; 请求方式:本例中的 GET ,是利用 HTTP 协议请求传递数据的主要形式之一; 请求参数:这里你要提供两个信息给 API 接口,一是“地区名称”或者“地区...但是,样例,样例在哪里呢? 在我《Python编程遇问题,文科生怎么办?》一文中,我曾经提到过,这种样例,对于普通用户的重要性。 没有“葫芦”,他们又如何“照葫芦画瓢”呢?...既然这个例子中,官方文档没有提供如此详细的代码和讲解样例,那我就来为你绘制个“葫芦”吧。 下面,我给你逐步展示,如何在 Python 3 下,调用该 API 接口,读取、分析数据,和绘制图形。...它是一个字典,每一项分别包括城市代码,和对应的城市名称。 根据我们输入的城市代码,函数就可以自动在结果数据框中添加一个列,注明对应的是哪个城市。

    3.3K20

    程序员应如何理解高并发中的协程

    注意这段代码是用python写的,但本篇关于协程的讨论适用于任何一门语言,因为协程并不是一种语言的特性。而我们只不过恰好使用了python来用作示例,因其足够简单。 那么协程是什么呢?...,但是在协程下当执行完print("a")后func就会因“暂停并返回”这段代码返回到调用函数。...从图中我们可以看到,我们首先来到funcA函数,执行一段时间后发现调用了另一个函数funcB,这时控制转移到该函数,执行完成后回到main函数的调用点继续执行。 这是普通的函数调用。 接下来是协程。...在这里,我们依然首先在funcA函数中执行,运行一段时间后调用协程,协程开始执行,直到第一个挂起点,此后就像普通函数一样返回funcA函数,funcA函数执行一些代码后再次调用该协程,注意,协程这时就和普通函数不一样了...我们需要做的就是在堆区中申请一段空间,让后把协程的整个栈区保存下,当需要恢复协程的运行时再从堆区中copy出来恢复函数运行时状态。 再仔细想一想,为什么我们要这么麻烦的来回copy数据呢?

    93320

    【瑞数】维普期刊JS逆向详细流程

    中场休息 分析到这里,我们知道了签名生成的流程如下: 当用户点击搜索按钮,触发点击事件; 构建请求对象(请求对象的参数没有签名关键字); 由于 send 方法被修改,所以调用 send 方法时,签名就在这个过程中被生成...; 签名代码来源分析 其实你应该发现了,分析了这么久的 JS 代码,却不知道这大段 JS 存放在哪里?...换句话说就是,这些 JS 代码并不是存在一个 JS 文件里的,实际上是通过 eval 函数将一大堆字符串加载进了内存。 ? 此时就需要寻找以上 JS 代码是如何加载进内存。...---- 签名代码在何处加载到内存? 仔细想一想,一段字符串想以 js 代码的形式加载进内存,必定会使用 eval 方法。 所以,我们只需要找到哪里使用了调用 eval 即可。...实际情况是使用 python 来完成代码注入。 画个图来说明下,即使用 Python 修改 html 源码,使得 html 中的 js 代码能过将目标代码注入到签名代码中 ?

    3K20

    你做的 9 件事表明你不是专业的 Python 开发人员

    I am 22 years old 二、使用默认可变参数 在 Python 中,只要您将可变值作为参数传递给函数,默认参数就会在函数被调用时发生变化。...// 第二次调用 >>> l2 = append(1) >>> l2 [0, 1] ❝ 简而言之也就是说由于 l 在 append 函数中被默认初始化为一个 list,第二次调用时,l 并没有重置,导致返回时还带有第一次调用的结果...使用 import * 导入会破坏您的命名空间,方法是将该命名模块中的所有函数和类导入您的代码,这可能会与您定义的函数或导入的其他库的函数发生冲突。...九、不关注 pep8 ❝ pep8就是Python官方指定的编码规范 ❞ 我们大多数人都犯了这个罪, ❝ 我承认我有罪 在我被取消之前,我知道我在这篇文章中的一些代码可能违反了 PEP-8 的规则,但事实是痛苦的...❝ 老外的这篇文章在 medium 的邮件推荐中,可能老外知道自己这篇文章的示例代码也违反了 pep8 规范,怕被取消推荐了,我猜的,不保真。

    22420
    领券