修改函数名时代码运行异常,两文件同名函数也出现报错故障
问题根因排查方向
- 全局命名冲突:如果两个文件都被导入到同一个运行上下文(比如同一份主程序同时import两个文件),全局作用域下的同名函数会发生覆盖,后导入的文件的函数会把先导入的同名称函数顶替掉,导致先导入的文件里调用该函数的逻辑全部出错
- 硬编码的函数名引用:如果其中某份文件里存在字符串形式硬编码的函数名调用(比如用
getattr()、eval()、字符串形式的回调配置、定时任务配置指定函数名),修改函数名后没有同步修改这些硬编码的字符串引用,就会出现找不到函数的报错 - 跨文件依赖绑定:如果A文件里提前引入了B文件的某个函数并做了别名绑定/提前引用(比如
from B import func as util_func,后续代码全用util_func调用),修改B文件的func名称后没有同步修改A文件的import语句,也会触发导入错误 - 命名空间污染:如果代码用了
from xxx import *这种导入方式,会直接把对应模块的所有函数都导入到当前命名空间,同名函数覆盖的概率会大幅提升
解决方案
- 给两个文件的函数都加上模块前缀调用,不要直接导入函数本身,示例如下:
# 不要使用该写法 from file1 import process from file2 import process # 调整为如下写法 import file1 import file2 # 调用时分别用 file1.process() 和 file2.process() 区分即可
- 如果是函数内部硬编码引用导致的问题,把硬编码的函数字符串替换成可动态获取的函数对象属性,不要写死字符串名称
场景截图
运行正常的情况

无法运行的情况

内容的提问来源于stack exchange,提问作者Nicolas MEDVEDY
相关产品推荐
相关产品推荐

