Python同一模块(.py文件)内无法找到方法的问题及代码示例
解决Python同一文件/模块内找不到方法的问题
从你贴的代码来看,出现“找不到方法”的报错,大概率是依赖项缺失或者模块引用方式不对,咱们一步步拆解问题来解决:
一、同一文件内(比如model.py)找不到方法的排查
核心依赖未导入/定义
你的tokenize函数里用到了deepcut.tokenize和stop_list,但代码里完全没看到这俩的来源——Python当然会报“找不到名称”的错误!
赶紧补上:# model.py 开头先加这些 import deepcut # 定义停用词列表(可以手动写,也可以从文件加载) stop_list = {"的", "了", "是", "我", ...} # 替换成你的实际停用词另外,
CountVectorizer和joblib也得导入,不然创建和保存转换器的时候也会报错:from sklearn.feature_extraction.text import CountVectorizer import joblib代码执行顺序问题
好在你把tokenize定义写在了调用它的bow_transformer1前面,这部分没问题——记住Python是从上到下执行的,函数定义必须在调用之前,否则也会找不到方法。
二、跨模块(比如use_model.py调用model.py方法)的正确姿势
你现在在use_model.py里重复写了一遍tokenize,这不仅冗余,还容易因为stop_list、deepcut的定义不一致导致奇怪问题。正确做法是直接从model模块导入:
# use_model.py 里的正确写法 import deepcut from model import tokenize, stop_list # 直接导入model里的函数和变量 def preprocess(data): # 直接用导入的tokenize就行 processed_tokens = tokenize(data["text"]) # 你的预处理逻辑...
注意模块路径:
- 如果
model.py和use_model.py在同一个文件夹下,上面的导入直接生效; - 如果不在同一目录,要么把
model所在的文件夹加入Python环境变量,要么用相对导入(比如from .model import tokenize,但这要求你的代码是作为模块运行,不能直接双击执行脚本)。
三、加载保存的模型时的坑
当你在use_model.py里加载CountVectorizer1.pkl时,必须确保tokenize函数在当前环境中能被找到——因为joblib保存的转换器会依赖这个函数的定义。所以加载前一定要先导入model里的tokenize:
# use_model.py 加载模型的代码 import joblib from model import tokenize # 必须导入,不然加载时会找不到tokenize bow_transformer1 = joblib.load('CountVectorizer1.pkl')
内容的提问来源于stack exchange,提问作者patppd




