2013-03-31 3 views
5

Меня смущает следующее поведение Python 2.7 и Python 3.3 в форматировании строк. Это вопрос, связанный с детальным вопросом о том, как оператор запятой взаимодействует со строковыми представлениями.Запятые и строки в Python 2.7 string.format()

>>> format(10000, ",d") 
'10,000' 
>>> format(10000, ",") 
'10,000' 
>>> format(10000, ",s") 
ValueError: Cannot specify ',' with 's'. 

>>> "{:,}".format(10000) 
'10,000' 
>>> "{:,s}".format(10000) 
ValueError: Cannot specify ',' with 's'. 

Что меня смущает то, почему , вариант работает, тот, у кого нет явного типа строки представления. docs говорят, что если вы опустите тип, это «То же, что и s». И все же здесь он действует иначе, чем s.

Я бы отклонил это как просто морщинистый/угловой корпус, но этот синтаксис используется в качестве примера в документах: '{:,}'.format(1234567890). Существуют ли другие «специальные» поведения, скрытые в Python, когда тип представления строки опущен? Может быть, вместо того, чтобы «то же, что и», что действительно делает код, это проверка типа форматируемой вещи?

ответ

2

В вашем примере, вы не взаимодействуя с типами строк представления; вы взаимодействуете с типами презентаций int. Объекты могут предоставлять собственное поведение форматирования, определяя метод __format__. Как было отмечено в PEP 3101:

The new, global built-in function 'format' simply calls this special 
method, similar to how len() and str() simply call their respective 
special methods: 

    def format(value, format_spec): 
     return value.__format__(format_spec) 

Several built-in types, including 'str', 'int', 'float', and 'object' 
define __format__ methods. This means that if you derive from any of 
those types, your class will know how to format itself. 

Презентация типа s по понятным причинам не реализуется int объектов (см списки зарегистрированных типов представления на объект типа here). Сообщение об ошибке несколько вводит в заблуждение. Без , проблемы возникают ясен:

>>> format(10000, "s") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Unknown format code 's' for object of type 'int' 
+1

Ах, весы упали с моих глаз! Каждый тип в Python (потенциально) определяет свой собственный язык типа представления через '__format __ (self, format_spec)'. Поэтому потенциально '' d''или' ''' может означать что-либо вообще для определенного типа, хотя есть соглашение. Бит в документах о том, что тип не является таким же, как 's', для типов представления строк. Немного дальше по документам, для целых типов презентаций, он говорит, что «Нет» так же, как «d'». Так что теперь все имеет смысл. – Nelson

0

см PEP 378 -- Format Specifier for Thousands Separator

'' параметр задан, как показано выше, для типов 'D', 'е', 'F', 'G', 'E', 'G', ' % ',' F 'и' '. Чтобы будущие расширения, это не определено для других типов: двоичной, восьмеричной, шестнадцатеричной, характер и т.д.

+0

А, я пропустил включение '' '' в это описание; это будет пустая строка, нет типа? Если так, по крайней мере, кто-то планировал поведение, которое я вижу, но мне все еще интересно, что происходит и почему это противоречит документам. – Nelson

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