当我没有输入字符串时,为什么 format() 会抛出 ValueError: Unknown format code 'f' for object of type 'str' ?

问题描述 投票:0回答:1

我使用的是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 python-2.7 python-unittest f-string
1个回答
0
投票

在 Python 2 上,

object.__format__
有效地委托给
format(str(self), format_spec)
。您可以在here查看实现。

由于

list
继承了
object.__format__
,您的第一个
format
调用实际上是在调用
format(str([3.1423]), '.3f')
。这就是为什么您收到错误消息的原因。

这仍然会在 Python 3 上产生错误。这只是一个不同的错误。

© www.soinside.com 2019 - 2024. All rights reserved.