这与这个关于 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"