Python定位函数定义地址

技术背景

事情是这样的,在一次使用MindSpore编程的过程中,遇到一个报错"TypeError: get_parameters() got an unexpected keyword argument 'expand'"。首先我定位到了这个报错的函数,然后找到相关函数的定义:"def get_parameters(self, expand=True):",我们发现这里是有带expand参数的。更奇怪的是,当使用MindSpore的静态图模式时会报错,而如果想切换到动态图模式去定位这个问题时,程序又能够正常运行。

问题思路

首先,我们能够在定义的位置查到这个这个函数,并且函数自带了这个参数,因此只有一种可能性--使用函数的时候索引到了其他函数的位置。因此,解决问题的思路就变成了:先在报错的函数体内,打印被调用的函数地址,查找到实际调用的函数位置和相关的定义。然后解决函数调用的冲突,基本方法就是改变其中一个函数的名称,最简单的方案就是在其中一个函数下加一条下划线。但是既然是我们自己本地开发的函数跟MindSpore框架的函数名有冲突,那么自然是应该修改本地的函数名称定义。最后,我们可以通过打印函数调用位置,再次确认下调用的函数位置是否正确。

相关代码

要打印一个函数的调用位置很简单,只需要加上__code__即可:

print (get_parameters.__code__)

第一次运行的时候,打印出来的内容为:

<code object get_parameters at 0x7f48f004ced0, file "../../sponge/potential/energy/bond.py", line 167>

找到本地调用的函数后,就可以进入到这个文件中,把冲突的函数名做一个调整。到这里并没有结束,为了避免同样的问题在其他函数体内出现,我们应该替换掉所有相似的问题函数名。这里使用的开发工具是VS Code,在VS Code的侧边栏有一个搜索功能,可以搜索出当前项目内所有包含这个函数名称的文件内容:

然后我们就可以找到对应的文件全部修改一遍。修改完成后,再次执行打印函数地址的代码,得到的结果是:

<code object jit_forbidden at 0x7fdfc5612270, file "/home/dechin/anaconda3/envs/mindspore-latest/lib/python3.7/site-packages/mindspore/_check_jit_forbidden_api.py", line 33>

这里就是一个正常的调用地址了。同时,我们的代码也执行成功没有报错了,问题解决完成。

总结概要

Python众多的第三方库,为我们的日常代码开发带来了极大的便利性,同时在开发过程中也需要注意这样的一个问题:开发的代码中有些命名可能跟第三方库冲突,例如本文介绍的基于MindSpore框架开发的过程中,定义一个本地的Cell类之后,发现本地的函数get_parameters跟Cell类本身的get_parameters冲突,因此可以使用Python的内置函数__code__对冲突函数的地址进行定位,然后进行修改。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/func-path.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

posted @ 2024-03-11 15:51  DECHIN  阅读(33)  评论(0编辑  收藏  举报