2013-03-31 11 views
5

Jestem zdezorientowany przez następujące zachowanie w Pythonie 2.7 i Pythonie 3.3 w formatowaniu String. Jest to szczegółowe pytanie dotyczące interakcji operatora przecinkowego z typami prezentacji ciągów.Przecinki i ciągi w Pythonie 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'. 

Co mnie mylące dlatego wariant , pracuje, ten z bez wyraźnego typu prezentacji ciąg. docs mówi, że jeśli pominiesz ten typ, jest to "Tak samo jak s." A jednak tutaj działa inaczej niż s.

Odrzuciłbym to jako tylko przypadek zmarszczek/narożników, ale ta składnia jest używana jako przykład w dokumentach: '{:,}'.format(1234567890). Czy są inne "specjalne" zachowania ukryte w Pythonie, gdy typ prezentacji ciągów jest pominięty? Może zamiast "tak jak s" to, co naprawdę robi kod, to sprawdzanie typu formatowanej rzeczy?

Odpowiedz

2

W przykładzie, nie są interakcje z rodzajów prezentacji ciąg; wchodzisz w interakcje z typami prezentacji int. Obiekty mogą zapewniać własne zachowanie podczas formatowania, definiując metodę __format__. Jak zauważono w 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. 

Prezentacja typ s nie jest zrozumiałe, realizowany przez int obiektów (patrz wykaz udokumentowanych rodzajów prezentacji za obiekt typu here). Komunikat o wyjątku jest nieco mylący. Bez numeru , problem jest jaśniejszy:

>>> 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

Ach, łuski spadły z moich oczu! Każdy typ w Pythonie (potencjalnie) definiuje własny język prezentacji za pomocą '__format __ (self, format_spec)'. Potencjalnie "d'" lub "" "może oznaczać cokolwiek dla jakiegoś określonego typu, chociaż istnieje konwencja. Bit w dokumentach o braku typu "taki sam jak" s "dotyczy typów prezentacji ciągów. Po prostu nieco dalej w dokumentach, dla typów prezentacji całkowitych, mówi "Brak jest" taki sam jak "d" ". Teraz wszystko ma sens. – Nelson

0

Patrz PEP 378 -- Format Specifier for Thousands Separator

określenia '' wariant jest zdefiniowana jak pokazano powyżej dla typów 'd', 'e', ​​'f', 'g', 'E', 'g', " % "," F "i". Aby umożliwić przyszłych rozszerzeń, jest niezdefiniowany dla innych typów: dwójkowy, ósemkowy, HEX, charakter, etc

+0

Ah, brakowało mi włączenia "" w tym opisie; to byłby pusty ciąg znaków, brak typu? Jeśli tak, to przynajmniej ktoś zamierzał zaobserwować zachowanie, ale nadal jestem ciekawy, co się dzieje i dlaczego jest niezgodny z dokumentami. – Nelson