python 为什么格式字符串在列表上而不是元组上引发错误

yhxst69z  于 2022-11-27  发布在  Python
关注(0)|答案(1)|浏览(112)

为什么将一个列表传递给下面的format方法会失败,而将相同的列表强制传递给元组却能正常运行?
从我的测试来看,元组并不是(乘)继承自Python的原子数值类型(我认为也不复杂),所以总体上我对解释器告诉我的内容感到困惑,以及为什么它似乎可以愉快地将我的元组视为包含要格式化的值,而不是我的(其他条件相同)列表的值。

#!/usr/bin/env python3

import math
from multiprocessing import Pool

def func(x):
    return math.sin(x)

if __name__ == "__main__":
    with Pool(5) as p:
        x = p.map(func, range(1, 4))
        x_tuple = tuple(x)
        try:
            print(", ".join([r"%2f"] * len(x)) % x)
            print(f"Print with list succeeded")
        except Exception as e:
            print(f"Print with list fails: {e}")
        try:
            print(", ".join([r"%2f"] * len(x_tuple)) % x_tuple)
            print(f"Print with tuple succeeded")
        except:
            print(f"Print with tuple fails: {e}")

    print(f"{isinstance(x, float) = }")
    print(f"{isinstance(x, int) = }")

上面给出了以下输出:

Print with list fails: must be real number, not list
0.841471, 0.909297, 0.141120
Print with tuple succeeded
isinstance(x, float) = False
isinstance(x, int) = False
z9zf31ra

z9zf31ra1#

这就是format % values的工作原理;如手册中所述:
如果 format 需要一个参数,则 values 可以是一个非元组对象。否则,values 必须是一个元组,其项数与格式字符串指定的项数完全相同,或者是一个Map对象(例如字典)。
(See:printf样式字符串格式)
这样做的原因是为了支持只有一个值的简化形式;比如"Hello %s" % name当您使用列表时,它将其解释为简化形式; "Hello %s" % x也可以这样工作,使用%s化整个列表。但是,不能使用%f化整个列表,如果可以的话,剩余的%f说明符将没有值。

相关问题