具有来自多个 return 值函数的参数的字符串格式

String formatting with argument from multiple return value function

如何使用 return 多个值的函数作为格式字符串的输入,而不出现 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() 更强大,让你 access list elements or even attributes:

>>> 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

采用任意数量的参数并使用一些定界符打印它们的一般解决方案是使用 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

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,) 这样的东西也行不通,因为我猜 operator precedence 在这里发挥作用:

>>> 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