【发布时间】:2012-07-13 04:05:30
【问题描述】:
这与this question about floats 中的问题大致相同。
当您有一个可以转换为整数的值时,旧的%d 会转换它,但格式不会。
class MyIntegerTenClass:
def __int__(self):
return 10
def __str__(self):
return 'ten'
ten = MyIntegerTenClass()
print '%d, %02X, %s' % (ten, ten, ten) # ok
print '{0}'.format(ten) # ok
print '{0:d}, {0:02X}'.format(ten) # ValueError: Unknown format code 'd' for object of type 'str'
有没有办法修改格式的行为,而不触及要格式化的值的类(不向该类添加__format__ 方法)?
编辑:我的目标是使格式取决于格式字符串,而不是值。
因此,如果格式字符串显示“d”或“x”,则将值转换为 int,然后转换为十进制或十六进制表示。
如果格式字符串为“s”,则直接将其转换为字符串。就像旧的 % 所做的那样。
实际上,我什至可以将__format__ 方法添加到值的类中。但是,如果给定的格式规范是整数格式规范,我该如何检查呢?无需重新实现内置格式的格式规范解析器。
编辑:这是__format__ 和异常的解决方案。有更好的想法吗?
class MyIntegerTenClass:
def __int__(self):
return 10
def __str__(self):
return 'ten'
def __format__(self, spec):
fmt = '{0:%s}'%spec
try:
return fmt.format(str(self))
except:
return fmt.format(int(self))
ten = MyIntegerTenClass()
print '%d, %02X, %s' % (ten, ten, ten) # ok, prints "10, 0A, ten"
print '{0:d}, {0:02X}, {0}'.format(ten) # ok, prints "10, 0A, ten"
【问题讨论】:
-
它说十是一个字符串,你正试图将它格式化为一个数字。
-
我只是在格式规范中使用
!s,在应用字段参数之前强制转换为字符串:'{0:d}, {0:02X}, {0!s}'.format(ten)。另外,使用return format(int(self), spec)不需要在这里新建字符串模板,有完美的format()函数。