2016-11-29 3 views
1

В питоне есть спецификатор преобразования как
Создание нового спецификатор преобразования в Python

'{0!s}'.format(10) 

который печатает

'10' 

Как я могу сделать мои собственные спецификаторы преобразования как

'{0!d}'.format(4561321) 

которые печатают целые числа в следующем формате

4,561,321 

Или преобразует его в двоичный файл как

'{0!b}'.format(2) 

, который печатает

10 

какие классы мне нужно, чтобы наследовать и какие функции мне нужно изменить? Если возможно, укажите небольшой пример.

Спасибо!

+0

Я не думаю, что это возможно. Однако вы можете: ''{0! B}'. Format (MyInt (2))' и получить это, выполнив ['__format__'] (https://docs.python.org/3.5/reference/datamodel. html # объект .__ формат__) специальный способ. – Bakuriu

+0

@Bakuriu, что будет MyInt()? – lordzuko

ответ

2

То, что вы хотите сделать, невозможно, потому что встроенные типы не могут быть изменены, а литералы всегда относятся к встроенным типам.

Существует специальный метод для обработки форматирования значений, то есть __format__, однако он обрабатывает только строку формата, а не спецификатор преобразования, то есть вы можете настроить, как {0:d} обрабатываются, но не так, как это {0!d}. Единственное, что работает с !, - s и r.

Обратите внимание, что d и b уже существуют в формате спецификаторов:

>>> '{0:b}'.format(2) 
'10' 

В любом случае вы могли бы реализовать свой собственный класс, который обрабатывает форматирование:

class MyInt: 
    def __init__(self, value): 
     self.value = value 
    def __format__(self, fmt): 
     if fmt == 'd': 
      text = list(str(self.value)) 
     elif fmt == 'b': 
      text = list(bin(self.value)[2:]) 
     for i in range(len(text)-3, 0, -3): 
      text.insert(i, ',') 
     return ''.join(text) 

Используется как:

>>> '{0:d}'.format(MyInt(5000000)) 
5,000,000 
>>> '{0:b}'.format(MyInt(8)) 
1,000 
+0

Спасибо, я это должен сработать для меня. – lordzuko

1

Старайтесь не создавать свои собственные и не использовать defa которые уже присутствуют в python. Вы можете использовать,

'{0:b}'.format(2) # for binary 
'{0:d}'.format(2) # for integer 
'{0:x}'.format(2) # for hexadecimal 
'{0:f}'.format(2) # for float 
'{0:e}'.format(2) # for exponential 

Пожалуйста, обратитесь к https://docs.python.org/2/library/string.html#formatspec для получения дополнительной информации.

+0

Спасибо, что помогает! – lordzuko

Смежные вопросы