为什么需要在Python的.format方法中进行显式字符串转换?

时间:2018-10-01 06:40:26

标签: python numpy

以下代码给出TypeError。

from sklearn.model_selection import KFold
kf = KFold(n_splits=5,shuffle=False).split(range(25))

print('{} {:^61} {}'.format('Iteration','Training set observations','Testing set observations'))
for iteration, data in enumerate(kf, start=3):
    print('{:^9} {} {:^25}'.format(iteration, data[0], data[1]))
  

TypeError:不支持的格式字符串传递给   numpy.ndarray。格式

当我们使用str(data[1])

时,代码会提供正确的输出

为什么需要这种显式的字符串转换?

1 个答案:

答案 0 :(得分:2)

例如https://docs.python.org/3.4/library/string.html#format-specification-mini-language中的

  

通常的约定是,空格式字符串("")会产生与您在值上调用str()相同的结果。非空格式字符串通常会修改结果。

因此,当:^25data[1]匹配时,它将调用__format__()对象的data[1]方法,该对象是numpy.ndarray。这些对象遵循Python的list行为,即格式字符串为非空时会引发TypeError。空格式字符串会导致在str()上调用data[0](在您的示例中),这样就可以了。非空格式字符串(即:^25的{​​{1}})在Python的列表中失败,因为Python中的标准列表可以是异类对象的集合,因此是单个格式规范可能不适用于以下列表:data[1][1, 2.3, 'four']遵循相同的约定。


也请参见https://github.com/numpy/numpy/issues/5543,以获取numpy的{​​{1}}页面上的未解决问题。似乎该问题与您在帖子中提到的同一问题有关。