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
相关产品推荐
相关产品推荐

