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

assertAlmostEqual触发TypeError:字符串无法转整数,已做类型检查仍报错

问题分析:assertAlmostEqual触发TypeError,已确认值为浮点数仍报错

代码与错误信息

测试代码

def assertSamplesEqual(self, a, b, msg=None):
  if isinstance(a.value, float) and isinstance(b.value, float):
    self.assertAlmostEqual(
        a.value, b.value, msg or
        'Samples %s and %s have different values' % (a, b))
  else:
    self.assertEqual(
        a.value, b.value, msg or
        'Samples %s and %s have different values' % (a, b))

触发的错误

third_party/py/perfkitbenchmarker/test_util.py:52 in assertSamplesEqualUpToTimestamp
    self.assertAlmostEqual(
<embedded stdlib>/unittest/case.py:882 in assertAlmostEqual
    if round(diff, places) == 0:
TypeError: 'str' object cannot be interpreted as an integer

错误原因

问题出在**assertAlmostEqual的参数顺序误用**,和你做的浮点数类型检查无关。

Python unittest中assertAlmostEqual的官方签名是:

assertAlmostEqual(first, second, places=7, msg=None, delta=None)

第三个参数是places,要求传入整数(指定比较时保留的小数位数),但你直接把msg字符串放在了第三个参数的位置,相当于把错误信息传给了需要整数的places参数,导致内部执行round(diff, places)时触发类型错误。

你打印type(a.value)得到float是正确的,但这个错误和值的类型无关,完全是参数传递顺序的问题。

修复方案

通过指定关键字参数的方式传递msg,避免参数顺序混淆:

def assertSamplesEqual(self, a, b, msg=None):
    error_msg = msg or 'Samples %s and %s have different values' % (a, b)
    if isinstance(a.value, float) and isinstance(b.value, float):
        self.assertAlmostEqual(a.value, b.value, msg=error_msg)
        # 若需自定义小数位数,可加上places参数,比如places=5
        # self.assertAlmostEqual(a.value, b.value, places=5, msg=error_msg)
    else:
        self.assertEqual(a.value, b.value, msg=error_msg)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:50:40