Python 3: Poznaj f-strings
W Pythonie 3.6 dodano nowy, łatwiejszy sposób interpolacji stringów - f-strings (PEP 498). Aby stworzyć f-string, wystarczy poprzedzić string literą „f”. Sam string można sformatować niemal tak samo, jak w przypadku metody str.format(). Możemy uzyskać więc w stringu pola, które zastąpimy - ujęte nawiasami klamrowymi. To prosty przykład:
>>> name = 'Mike'
>>> f"Hello {name}"
'Hello Mike'
W dokumentacji Pythona znalazłem zabawny przykład, który demonstruje jak możemy wkomponować pola zastępcze. Trochę go uprościłem:
>>> total = 45.758
>>> width = 14
>>> precision = 4
>>> f"Your total is {total:{width}.{precision}}"
'Your total is 45.76'
Tworzymy tu trzy zmienne. Pierwsza to liczba rzeczywista, a pozostałe dwie są liczbami całkowitymi. Następnie tworzymy nasz f-string, w którym chcemy umieścić zmienną total
. Ale, jak można zauważyć, w polu zastępczym stringa umieściliśmy zmienne width
i precision
, by sformatować samą sumę. W tym przypadku piszemy, że width (szerokość) pola sumy ma wynosić 14 znaków, a precision (dokładność) liczby rzeczywistej określamy jako 4. Wynik, jaki otrzymujemy to 45.76 – jak widać, jest zaokrąglony.
F-string jest pomocny również przy formatowaniu dat:
>>> import datetime
>>> today = datetime.datetime.today()
>>> f"{today:%B %d, %Y}"
'March 13, 2018'
Osobiście podoba mi się przykład podany w PEP 498 - pokazuje jak przy formatowaniu daty możemy wyodrębnić z niej dzień tygodnia:
>>> from datetime import datetime
>>> date = datetime(1992, 7, 4)
>>> f'{date} was on a {date:%A}'
'1992-07-04 00:00:00 was on a Saturday'
Tej samej zmiennej możemy użyć w naszym f-stringu wielokrotnie:
>>> spam = 'SPAM'
>>> f"Lovely {spam}! Wonderful {spam}!"
'Lovely SPAM! Wonderful SPAM!'
Dokumentacja radzi, by zachować ostrożność, gdy zagnieżdżamy w f-stringu cudzysłowy. Z pewnością nie możemy zrobić czegoś takiego:
>>> value = 123
>>> f"Your value is "{value}""
To błąd składniowy - taki sam jak w przypadku zwykłych ciągów znaków. Nie można również wstawić ukośnika wstecznego bezpośrednio w formatowanym stringu.
>>> f"newline: {ord('\n')}"
Traceback (most recent call last):
Python Shell, prompt 29, line 1
Syntax Error: f-string expression part cannot include a backslash: <string>, line 1, pos 0
W dokumentacji jest jednak wzmianka o tym, że można to obejść w ten sposób:
>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'
W tym przypadku zamieniamy znak nowej linii na jego wartość porzadkową.
Ostatni punkt w dokumentacji mówi o tym, że nie możemy używać f-stringa jako docstringa (notki dokumentacyjnej). Według Nicka Coghlana wynika to z tego, że docstringi muszą być znane podczas kompilacji, a f-stringi ustalane są dopiero w czasie życia programu.
Podsumowanie
Powyższe informacje powinny wystarczyć, jeśli chcesz wykorzystać f-strings w swoim własnym kodzie. To fajny dodatek do Pythona, który - jak zdążyłem zauważyć - w niektórych przypadkach ułatwia interpolację stringów. Powodzenia. Koduj na zdrowie!
Dodatkowa lektura
Więcej o f-strings: https://bit.ly/2Jzmvuo