如何使用返回多个值作为格式字符串输入的函数,而不会出现TypeError: not enough arguments for format string
错误?
>>> def foo():
... return 1, 2
...
>>> foo()
(1, 2)
>>> print "%d,%d,%d" % foo(), 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
预期输出:"1,2,3"
元素索引
string.format()
更强大,可以访问列表元素甚至属性:
>>> print "{0[0]},{0[1]},{1}".format(foo(), 3)
1,2,3
连接元组
foo(), 3
的问题在于它是一个元组和一个整数,这是两种不同的类型。相反,您可以通过串联来创建一个3元组。如果您使用string.format()
,则会有点棘手,因为您需要首先使用*
运算符对其进行解压缩,以便将其用作参数:
>>> foo() + (3,)
(1, 2, 3)
>>> print "%d,%d,%d" % (foo() + (3,))
1,2,3
>>> print "{},{},{}".format(*foo() + (3,))
1,2,3
临时变量
当然,你总是可以这样做,这很明显但很冗长:
>>> foo1, foo2 = foo()
>>> print "%d,%d,%d" % (foo1, foo2, 3)
1,2,3
print "%d,%d,%d" % foo(), 3
不起作用的原因是Python认为您试图在此处打印两项:"%d,%d,%d" % foo()
和3
。因此,第一个表达式显然失败了,因为项目数量足够:
>>> def func():
... print "%d,%d,%d" % foo(), 3
...
>>> import dis
>>> dis.dis(func)
2 0 LOAD_CONST 1 ('%d,%d,%d')
3 LOAD_GLOBAL 0 (foo)
6 CALL_FUNCTION 0
9 BINARY_MODULO
10 PRINT_ITEM
11 LOAD_CONST 2 (3)
14 PRINT_ITEM
15 PRINT_NEWLINE
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
事实上,即使是像"%d,%d,%d" % foo() + (3,)
这样的东西也不起作用,因为我想操作符优先级在这里起作用:
>>> def func():
print "%d,%d,%d" % foo() + (3,)
...
>>> dis.dis(func)
2 0 LOAD_CONST 1 ('%d,%d,%d')
3 LOAD_GLOBAL 0 (foo)
6 CALL_FUNCTION 0
9 BINARY_MODULO
10 LOAD_CONST 3 ((3,))
13 BINARY_ADD
14 PRINT_ITEM
15 PRINT_NEWLINE
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
工作版本为:
>>> print "%d,%d,%d" % (foo() + (3,))
1,2,3
获取任意数量的参数并用一些分隔符打印它们的通用解决方案是使用str.join
def foo():
return 1, 2
>>> print(','.join(map(str,foo())))
1,2
的另一个例子
def bar():
return 4,5,6,7
>>> print(','.join(map(str,bar())))
4,5,6,7