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



下面的代码给出了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]))

类型错误:传递到 的格式字符串不受支持 numpy.ndarray.格式

当我们使用str(data[1])时,代码给出了正确的输出

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

来自,例如,https://docs.python.org/3.4/library/string.html#format-specification-mini-language:

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

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


另请参阅 https://github.com/numpy/numpy/issues/5543 有关未解决的问题,请参阅numpyGitHub页面。该问题似乎与您在帖子中提到的相同问题有关。

最新更新