You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Unittest中全局函数无法被识别的问题解决方法

解决unittest中全局函数无法识别的问题

问题原因

你遇到的NameError是因为Python的名称修饰(Name Mangling)机制:当在类的方法内调用以双下划线开头的名称时,Python会自动将其重命名为_类名__名称的格式。你的函数名___log_test_values以三个下划线开头,前两个下划线触发了这个机制,导致解释器尝试寻找_TranslateTestCase___log_test_values,而非你定义的全局函数。

解决方法

方法1:修改函数名(推荐)

直接把函数名改成不以双下划线开头的形式,避免触发名称修饰。类方法里不需要global声明,全局函数可以直接调用:

import unittest
import pickle

def log_test_values(values):
    with open('/tmp/test_values.bin', 'wb') as f:
        f.write(pickle.dumps(values))

class TranslateTestCase(unittest.TestCase):
    def test_word_starting_with_vowel(self):
        return_value = 'apple'
        log_test_values(return_value)

if __name__ == "__main__":
    unittest.main()

方法2:通过模块名调用全局函数(仅保留原名时使用)

如果一定要保留原函数名,可以通过当前模块直接引用它,绕开名称修饰:

import unittest
import pickle
import __main__

def ___log_test_values(values):
    with open('/tmp/test_values.bin', 'wb') as f:
        f.write(pickle.dumps(values))

class TranslateTestCase(unittest.TestCase):
    def test_word_starting_with_vowel(self):
        return_value = 'apple'
        __main__.___log_test_values(return_value)

if __name__ == "__main__":
    unittest.main()

额外提示

unittest框架本身不会处理测试函数的返回值,你通过自定义函数记录返回值到磁盘的方式是可行的。如果后续需要批量处理测试数据,也可以考虑将日志函数封装成独立模块,方便多个测试用例调用。

内容的提问来源于stack exchange,提问作者Saurabh Misra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:25:32