これはthis question about floatsとほぼ同じ問題です。「{0:d}」の文字列の書式設定が整数に変換されません
数値が整数に変換されると、古い%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"
10は文字列で、数値として書式を設定しようとしています。 –