tam sayıya dönüştürülmez. Bu, this question about floats ile aynı sorunla ilgilidir.“{0: d}” ile dize biçimlendirmesi,
Bir tam sayıya dönüştürülebilen bir değere sahip olduğunuzda, eski %d
bunu dönüştürür, ancak biçimlendirmez.
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'
(bu sınıfa bir __format__
yöntem eklemeden) biçimlendirilmesini değer sınıfı dokunmadan, format davranışını değiştirmek için bir yol var mı?
Düzenleme: Amacım, biçimlendirmeyi biçim dizesine bağlı olarak değil, değerde elde etmektir. Biçim dizgisi "d" veya "x" yazıyorsa, değeri int'ye ve ardından ondalık veya onaltılık gösterime dönüştürün. Biçim dizgisi "s" yazıyorsa, onu doğrudan dizeye dönüştürün. Eski %
gibi.
Aslında, değerin sınıfına bir __format__
yöntemi ekleyebilirim. Ancak, belirtilen biçim belirtimi bir tamsayı biçim belirtimiyse, bu yöntemde nasıl denetlerim? Yerleşik formatın biçim belirtimi ayrıştırıcısını yeniden oluşturmadan.
Düzenleme: İşte, __format__
ile bir çözüm ve istisnalar. Daha iyi bir fikir var mı?
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"
On bir dizedir, bir sayı olarak biçimlendirmeye çalışıyor. –