我使用的是Python 2.7。 (对于这个特定的代码切换到 Python 3 不是一个选择,请不要建议它。)我正在为一些代码编写单元测试。
这是相关代码:
class SingleLineGrooveTable:
VEFMT = '.3f'
@classmethod
def formatve(cls, value, error=None):
er = 0
if error is not None:
er = error
v = value
elif len(value) > 1:
v, er = value
else:
v = value
return format(v, cls.VEFMT), format(er, cls.VEFMT)
我的测试是:
import unittest
class TestSingleLineGrooveTable(unittest.TestCase):
def test_formatve_no_error(self):
e_v = '3.142'
e_er = '0.000'
r_v, r_er = SingleLineGrooveTable.formatve([3.1423])
self.assertEqual(e_v, r_v)
self.assertEqual(e_er, r_er)
(是的,我知道这很有趣,我在测试中遇到了名称中带有“no_error”的错误......)
当我运行测试时,它会在函数的 return 语句上抛出
ValueError: Unknown format code 'f' for object of type 'str'
。但我不知道它从哪里得到 str 。可能相关,此代码和我使用它的代码几乎是从其他人的代码(我无法再联系)复制而来,所以也许我以错误的方式调用它,但仍然是一个列表,不是字符串!
这是怎么回事?我该如何解决这个问题?
在 Python 2 上,
object.__format__
有效地委托给 format(str(self), format_spec)
。您可以在here查看实现。
由于
list
继承了 object.__format__
,您的第一个 format
调用实际上是在调用 format(str([3.1423]), '.3f')
。这就是为什么您收到错误消息的原因。
这仍然会在 Python 3 上产生错误。这只是一个不同的错误。