Python版本早于2.6的字符串格式

use*_*646 34 python format

当我在Python 2.5.2中运行以下代码时:

for x in range(1, 11):
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)
Run Code Online (Sandbox Code Playgroud)

我明白了:

Traceback (most recent call last):
  File "<pyshell#9>", line 2, in <module>
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)
AttributeError: 'str' object has no attribute 'format'
Run Code Online (Sandbox Code Playgroud)

我不明白这个问题.

dir('hello')没有format属性.

我怎么解决这个问题?

Sil*_*ost 47

str.format方法在Python 3.0引入,并向后移植到Python 2.6及更高版本.


big*_*ose 36

您的示例代码似乎是为Python 2.6或更高版本编写的,其中引入了该str.format方法.

对于2.6以下的Python版本,使用%运算符将值序列插入格式字符串:

for x in range(1, 11):
    print '%2d %3d %4d' % (x, x*x, x*x*x)
Run Code Online (Sandbox Code Playgroud)

你也应该知道,该运营商可以通过插值的名字来自一个映射,而不仅仅是位置参数:

>>> "%(foo)s %(bar)d" % {'bar': 42, 'foo': "spam", 'baz': None}
'spam 42'
Run Code Online (Sandbox Code Playgroud)

结合内置vars()函数将命名空间的属性作为映射返回的事实,这可以非常方便:

>>> bar = 42
>>> foo = "spam"
>>> baz = None
>>> "%(foo)s %(bar)d" % vars()
'spam 42'
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的描述,但它没有描述如何在所提供的示例中实现格式化. (5认同)

hbw*_*hbw 8

我相信这是一个Python 3.0功能,虽然它是2.6版本.但是如果你有一个Python版本,那么这种类型的字符串格式将不起作用.

如果您尝试一般打印格式化的字符串,请通过%运算符使用Python的printf样式语法.例如:

print '%.2f' % some_var
Run Code Online (Sandbox Code Playgroud)


Loï*_*lff 7

你使用哪个Python版本?

编辑 Python 2.5,使用"x = %s" % (x)(用于打印字符串)

如果要打印其他类型,请参见此处.


Jas*_*mbs 7

虽然现有的答案描述了原因并指出了修复的方向,但它们实际上都没有提供解决方案来完成问题所要求的问题.

您有两种方法可以解决问题.第一种是升级到Python 2.6或更高版本,它支持格式字符串构造.

第二个选项是使用%运算符旧字符串格式.您所呈现的等效代码如下.

for x in range(1,11):
  print '%2d %3d %4d' % (x, x*x, x*x*x)
Run Code Online (Sandbox Code Playgroud)

这段代码剪切在Python 2.5中产生与Python 2.6及更高版本中的示例代码完全相同的输出.