これは、 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 に変換してから、10 進数または 16 進数表現に変換します。フォーマット文字列が「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"