2.2.6.2 Operacje formatujące napisy

 

Napisy i obiekty Unicode posiadają dodatkową operację wbudowaną: operator % (modulo). Operację tę nazywamy również formatowaniem lub interpolacją. Po zastosowaniu format % wartości (gdzie format jest napisem lub obiektem Unicode) elementy formatujące wyspecyfikowane w format są zastąpione elementami z wartości. Efekt jest podobny do zastosowania funkcji sprintf() języka C. Jeśli format jest obiektem Unicode, lub jeśli jakikolwiek obiekt poddany konwersji z użyciem symbolu %s jest obiektem Unicode, wynik również będzie obiektem Unicode.

Jeśli format wymaga jednego argumentu, wartości może być pojedyńczym obiektem, nie krotką.2.8 W przeciwnym wypadku wartości musi być krotką zawierającą dokładnie taką ilość elementów, jaka jest zdefiniowana z napisie formatującym lub pojedyńczym obiektem odwzorowującym (na przykład słownikiem).

Element określający konwersję składa się z dwóch lub większej ilości znaków i posiada następujące składniki, które muszą wystąpić w następującej kolejności:

  1. Znak "%", który określa początek definicji.
  2. Nazwa klucza odwzorowania (opcjonalnie), zawarta w nawiasach okrągłych (n.p.. (nazwa)).
  3. Flaga konwersji (opcjonalnie), które mają wpływ na niektóre typy danych biorące udział w konwersji.
  4. Minimalna szerokość pola (opcjonalnie). Jeśli zdefiniowana jako "*" (gwiazdka) wartość pola jest odczytywana z następnego pola w tabeli wartości a obiekt do konwersji następuje po minimalnej szerokości i ew. precyzji.
  5. Precyzja (opcjonalnie), podana jako "." (kropka) po której następuje wartość precyzji. Jeśli zdefiniowana jako "*" (gwiazdka) wartość pola jest odczytywana z następnego pola w tabeli wartości a obiekt do konwersji następuje po precyzji.
  6. Modyfikator długości (opcjonalnie).
  7. Typ do konwersji.

Jeśli prawy argument operacji jest słownikiem (lub innym rodzajem odwzorowania), format napisu musi zawierać w nawiasie nazwę klucza z tego słownika. Zastosowany klucz określa element odwzorowania, którego wartość ma zostać sformatowana w napisie wynikowym. Na przykład:

>>> print '%(jezyk)s ma %(#)03d rodzaje cudzysłowów.' % \
{'jezyk': "Python", "#": 2}
Python ma 002 rodzaje cudzysłowów.

W tym przykładzie nie mógł wystąpić identyfikator *, ponieważ wymaga on listy parametrów w postaci sekwencji.

Flagi konwersji, które mogą być użyte w konwersji:

Flaga  Znaczenie 
# Konwersja używa "alternatywnej formy" (patrz dalej).
0 Wypełnienie zerami.
- Wyrównanie do lewej (jeśli zastosowany wraz z formatowaniem "0" spowoduje zignorowanie tego formatowania).
  (spacja) Należy pozostawić spację przed liczbą dodatnią (lub pustym napisem) w wyniku konwersji ze znakiem.
+ Umieszczenie symbolu znaku ("+" lub "-") (anuluje flagę "spacji").

Opcjonalny modyfikator długości może być jednym z symboli: h, l, lub L, ale zostanie zignorowany, ponieważ nie jest potrzebny w Pythonie.

Typy konwersji:

Konwersja  Znaczenie  Uwagi 
d Liczba całkowita dziesiętna ze znakiem.  
i Liczba całkowita dziesiętna ze znakiem.  
o Liczba ósemkowa bez znaku. (1)
u Liczba dziesiętna bez znaku.  
x Liczba szesnastkowa bez znaku (małe litery). (2)
X Liczba szesnastkowa bez znaku (wielkie litery). (2)
e Liczba zmiennoprzecinkowa w formacie wykładniczym (małe litery).  
E Liczba zmiennoprzecinkowa w formacie wykładniczym (wielkie litery).  
f Liczba zmiennoprzecinkowa w formacie dziesiętnym  
F Liczba zmiennoprzecinkowa w formacie dziesiętnym  
g Zastosuj konwersję "e" jeśli wykładnik jest większy niż -4 lub mniejszy od wartości precyzji, w przeciwnym wypadku zastosuj "f".  
G Zastosuj konwersję "E" jeśli wykładnik jest większy niż -4 lub mniejszy od wartości precyzji, w przeciwnym wypadku zastosuj "F".  
c Pojedyńczy znak (liczba całkowita lub napis jednoznakowy).  
r Napis (konwertuje jakikolwiek obiekt Pythona z wykorzystaniem funkcji repr()). (3)
s Napis (konwertuje jakikolwiek obiekt Pythona z wykorzystaniem funkcji str()).  
% Brak konwersji, wynik zawiera znak "%".  

Uwagi:

(1)
Zastosowanie alternatywnego formatowania w przypadku, gdy wynik nie jest zerem spowoduje wstawienie zera ("0") na początku sformatowanej liczby (po ewentualnym lewym wypełnieniu).
(2)
Zastosowanie alternatywnego formatowania w przypadku, gdy wynik nie jest zerem spowoduje wstawienie na początku sformatowanej liczby (po ewentualnym lewym wypełnieniu) ciągu znaków '0x' lub '0X' (w zależności od tego, czy wykorzystaliśmy format "x", czy "X").
(3)
Formatowanie %r zostało dodane w wersji 2.0 Pythona.

Napisy Pythona posiadają wartość długości, w związku z tym konwersja %s nie zakłada zakończenia napisu znakiem '\0'.

Dla względów bezpieczeństwa precyzja liczb zmiennoprzecinkowych jest obcinana do 50. Konwersja %f dla liczb a wartości bezwzględnej powyżej 1e25 są zastępowane przez konwersje %g.2.9 Wszystkie inne błędy wywołują wyjątki.

Dodatkowe operacja na napisach są zdefiniowane w modułąch standardowych string oraz re. 



... krotką.2.8
Jeśli chcemy sformatować krotkę, argumentem musi być krotka jednoelemntowa zawierająca krotkę, którą chcemy sformatować w napisie.
...%g.2.9
Ten dobór jest dość umowny. Celem takiej decyzji było uniknięcie długich łańcuchów nic nie mówiących cyfr bez wymuszania poprawnego użycia i bez zmuszania użytkowników do rozpoznania dokładnej precyzji liczb zmiennoprzecinkowych na danej platformie sprzętowej.
Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.