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