Đây là vấn đề tương tự như trong this question about floats.Định dạng chuỗi với “{0: d}” không chuyển đổi thành số nguyên
Khi bạn có một giá trị có thể được chuyển đổi thành số nguyên, số %d
cũ sẽ chuyển đổi, nhưng định dạng thì không.
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'
Có cách nào để thay đổi hành vi của định dạng, mà không cần chạm vào lớp giá trị phải được định dạng (mà không cần thêm một phương pháp __format__
đến lớp đó)?
Chỉnh sửa: Mục tiêu của tôi là lấy định dạng phụ thuộc vào chuỗi định dạng chứ không phải trên giá trị. Vì vậy, nếu chuỗi định dạng nói "d" hoặc "x", hãy chuyển đổi giá trị thành int và sau đó thành biểu diễn thập phân hoặc thập lục phân. Nếu chuỗi định dạng cho biết "s", hãy chuyển đổi chuỗi thành chuỗi trực tiếp. Như cũ %
đã làm.
Thực ra, tôi thậm chí có thể thêm phương thức __format__
vào lớp giá trị. Nhưng làm thế nào để kiểm tra, trong phương pháp đó, nếu đặc tả định dạng đã cho là một đặc tả định dạng số nguyên? Không cần triển khai lại trình phân tích cú pháp đặc tả định dạng của định dạng dựng sẵn.
Chỉnh sửa: Đây là giải pháp với __format__
và ngoại lệ. Bất kỳ ý tưởng tốt hơn?
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"
Nó nói mười là một chuỗi, bạn đang cố định dạng nó thành một số. –