解决main.py调用evaluation.py中f_score函数时的NameError问题
解决main.py调用f_score时的NameError问题
嘿,我来帮你搞定这个NameError的问题!你现在遇到的情况是Python找不到你想调用的f_score函数,结合你的项目结构和代码,主要有几个地方需要调整:
一、先搞定模块导入的路径问题
你的项目结构是这样的:
src/ ├── __init__.py ├── evaluation.py └── main.py
如果你的运行方式是在src目录外面执行python src/main.py,这时候Python的默认搜索路径里不包含src目录,所以直接写from evaluation import *会找不到这个模块。这里有两种靠谱的解决办法:
方法1:用相对导入(推荐)
因为main.py和evaluation.py在同一个包(src)下面,把导入语句改成相对导入的形式:
# 只导入f_score函数(更规范) from .evaluation import f_score # 或者如果你确实需要导入所有内容 from .evaluation import *
方法2:手动把src目录加入Python路径
如果不想用相对导入,可以在main.py的最顶部加一段代码,把当前脚本所在的src目录加入Python的搜索路径:
import sys from pathlib import Path # 获取当前脚本所在的src目录路径 src_dir = Path(__file__).parent sys.path.append(str(src_dir)) # 现在就能正常导入了 from evaluation import f_score
二、修复evaluation.py里的函数逻辑错误
另外,你的evaluation.py里的f_score函数有个致命问题:你只写了F1公式的注释,但根本没计算f1的值,最后直接返回了一个未定义的f1变量——就算导入成功,调用时也会报错。你得补全函数的计算逻辑,比如这样:
from collections import Counter def f_score(pred, answers): ''' f1 = (2 * precision * recall) / (precision + recall) ''' # 计算真正例、预测正例、真实正例总数 pred_counts = Counter(pred) answer_counts = Counter(answers) true_positive = sum(min(pred_counts[k], answer_counts[k]) for k in pred_counts) # 计算精确率和召回率,避免除以0的情况 precision = true_positive / sum(pred_counts.values()) if sum(pred_counts.values()) > 0 else 0.0 recall = true_positive / sum(answer_counts.values()) if sum(answer_counts.values()) > 0 else 0.0 # 计算F1分数 if precision + recall == 0: f1 = 0.0 else: f1 = (2 * precision * recall) / (precision + recall) return f1
三、调用函数时别忘了传参数
最后,你在main.py里写的f_score()没有传参数,这个函数需要接收pred(预测结果)和answers(真实标签)两个参数,调用的时候得传入对应的序列,比如:
from .evaluation import f_score # 示例调用,替换成你自己的真实数据 my_predictions = ["cat", "dog", "cat", "bird"] my_ground_truth = ["cat", "dog", "dog", "bird"] f1_result = f_score(my_predictions, my_ground_truth) print(f"F1 Score: {f1_result}")
这样调整之后,不仅不会再出现NameError,你的f_score函数也能正常计算出正确的F1分数啦!
内容的提问来源于stack exchange,提问作者Ansonparkour
相关产品推荐
相关产品推荐

