这和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的行为,而不触及要格式化的值的类(而不向该类添加__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"
它说10是一个字符串,你想把它格式化成一个数字。
试着用石膏包起来:
传递一个整数而不是一个字符串,它就可以正常工作了。
解决这个问题的第一种方法可能是
try
它:如果
MyIntegerTenClass
可以作为字符串插入到格式字符串中,那么它将是。否则,它将转换为int并重新提交到format
。如果希望默认表示为
10
,而不是ten
,则只需交换转换行:测试输出:
作为补充,我不相信不定义} 对象开发更复杂的方法。不过,我认为基于异常的方法免费为您提供了很多内置功能。
__format__
就可以获得所需的行为;但是,可以使用^{相关问题 更多 >
编程相关推荐