在Python 2.7.1中,我可以创建一个命名元组:
from collections import namedtuple
Test = namedtuple('Test', ['this', 'that'])
我可以填充它:
my_test = Test(this=1, that=2)
我可以这样打印出来:
print(my_test)
测试(这= 1,那= 2)
但为什么我不能这样打印呢?
print("my_test = %r" % my_test)
TypeError:并非在字符串格式化期间转换所有参数
答案 0 :(得分:9)
由于my_test
是一个元组,它将为元组中的每个项目寻找%
格式。为了解决这个问题,将它包装在另一个元组中,其中唯一的元素是my_test
:
print("my_test = %r" % (my_test,))
不要忘记逗号。
答案 1 :(得分:2)
你可以这样做:
>>> print("my_test = %r" % str(my_test))
my_test = 'Test(this=1, that=2)'
答案 2 :(得分:2)
它将它作为2个参数解压缩。与:比较:
print("dummy1 = %s, dummy2 = %s" % ("one","two"))
在你的情况下,试着把它放在一个元组中。
print("my_test = %r" % (my_test,))
答案 3 :(得分:0)
之前的答案是有效的,但如果您不打算打印名称,这里有一个选项。这是一个单线程设计,只打印任意长度的命名元组的内容。给定一个分配给“named_tuple”的命名元组,下面产生一个逗号描述的键=值对的字符串:
', '.join(['{0}={1}'.format(k, getattr(named_tuple, k)) for k in named_tuple._fields])
答案 4 :(得分:0)
正如4.7.2. printf-style String Formatting所述,%
字符串格式化或插值运算符存在问题:
[printf-style字符串格式化操作]表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或str.format()接口有助于避免这些错误
例如,您现在可以这样做:
from collections import namedtuple
Test = namedtuple('Test', ['this', 'that'])
my_test = Test(this=1, that=2)
print("my_test = {0!r}".format(my_test))