Python ma co najmniej sześć sposobów formatowania łańcucha:
In [1]: world = "Earth"
# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'
# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'
# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'
# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'
# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'
In [7]: from string import Template
# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'
Krótka historia różnych metod:
printf
formatowanie w stylu istnieje od czasów dzieciństwa PythonaTemplate
Klasy wprowadzono 2,4 Pythonformat
Metodę wprowadzono 2,6 Pythonf
-strings zostały wprowadzone w Pythonie 3.6
Moje pytania to:
- Czy
printf
formatowanie w stylu jest przestarzałe, czy też zostanie wycofane? - W
Template class
, czysubstitute
metoda jest przestarzała, czy będzie przestarzała? (Nie mówię o tymsafe_substitute
, co, jak rozumiem, oferuje unikalne możliwości)
Podobne pytania i dlaczego uważam, że nie są duplikatami:
Formatowanie napisów w Pythonie:% vs. .format - traktuje tylko metody 1 i 2 i pyta, która z nich jest lepsza; moje pytanie wyraźnie dotyczy dezaprobaty w świetle Zen Pythona
Opcje formatowania napisów: plusy i minusy - traktuje tylko metody 1a i 1b w pytaniu, 1 i 2 w odpowiedzi, a także nic o deprecacji
zaawansowane formatowanie ciągów a ciągi szablonów - głównie o metodach 1 i 3 i nie dotyczy wycofywania
Wyrażenia formatujące łańcuchy (Python) - w odpowiedzi wspomniano, że pierwotne podejście „%” ma zostać wycofane . Ale jaka jest różnica między planowanym wycofaniem , oczekującym wycofaniem a faktycznym wycofaniem ? A
printf
metoda-style nie podnosi nawet aPendingDeprecationWarning
, więc czy to naprawdę będzie przestarzałe? Ten post jest również dość stary, więc informacje mogą być nieaktualne.
Formatter
zajęciach?Odpowiedzi:
Chociaż w dokumentach istnieją różne wskazania, że
.format
i f-stringi są lepsze od%
stringów, nie ma istniejącego planu, aby kiedykolwiek zdezaktualizować to drugie.W zatwierdzeniu Wydanie nr 14123: Wyraźnie wspomnij, że formatowanie ciągu znaków% w starym stylu ma zastrzeżenia, ale nie zniknie w najbliższym czasie. zainspirowany numerem Wskazuje, że obecnie nie ma planów wycofania formatowania w stylu printf , dokumenty w
%
-formatowaniu zostały zmodyfikowane tak, aby zawierały następującą frazę:(Podkreśl moje.)
Fraza ta została później usunięta w zatwierdzeniu Zamknij # 4966: przebuduj dokumentację sekwencji, aby lepiej wyjaśnić stan współczesnego Pythona . Może się to wydawać oznaką, że plan wycofania
%
formatowania powrócił na karty ... ale zanurzenie się w narzędziu do śledzenia błędów ujawnia, że intencja była odwrotna. W narzędziu do śledzenia błędów autor zatwierdzenia charakteryzuje zmianę w następujący sposób :Innymi słowy, wprowadziliśmy dwie kolejne zmiany w
%
dokumentach -formatting, które mają wyraźnie podkreślić , że nie być przestarzała, nie mówiąc już usunięte. Dokumenty pozostają uparte co do względnych zalet różnych rodzajów formatowania ciągów, ale są również jasne, że%
-formatowanie nie zostanie wycofane ani usunięte.Co więcej, plik ostatnia zmiana tego akapitu w marcu 2017 r. Zmieniła go z tego ...
... do tego:
Zwróć uwagę, że zmiana z „pomaga unikać” na „może pomóc uniknąć” oraz jak wyraźne zalecenia
.format
i f-strings zostały zastąpione puszystą, dwuznaczną prozą o tym, jak każdy styl „zapewnia własne kompromisy i korzyści” . Oznacza to, że nie tylko formalne wycofanie nie jest już na kartach, ale obecni dokumentatorzy otwarcie przyznają, że%
formatowanie ma przynajmniej pewne „zalety” w stosunku do innych podejść.Wnioskowałbym z tego wszystkiego, że ruch mający na celu wycofanie lub usunięcie
%
formatowania nie tylko zawahał się, ale został całkowicie i trwale pokonany.źródło
%
. Teraz, gdy polityka „zakazu modyfikowania kodu na dużą skalę” została odrzucona, ich zastrzeżenia również znikają. Na dłuższą metę utrzymanie obu formularzy bez żadnych korzyści%
w pewnym momencie i tak zostanie usunięta. Po prostu nie wiemy jeszcze kiedy, więc warto było stonować język.Nowa
.format()
metoda ma zastąpić starą%
składnię formatowania. Ta ostatnia została pomniejszona (ale nie została jeszcze oficjalnie wycofana ). Dokumentacja metody stwierdza, że:(Podkreślenie moje).
Aby zachować wsteczną kompatybilność i ułatwić przejście, stary format został pozostawiony w miejscu, do teraz . Z pierwotnej propozycji PEP 3101 :
Zwróć uwagę, dopóki nie przyjdzie czas na wycofanie starszego systemu ; nie został uznany za przestarzały, ale nowy system ma być używany za każdym razem, gdy piszesz nowy kod .
Zaletą nowego systemu jest to, że można połączyć krotkę i słownikowe podejście starego programu
%
formatującego:i jest rozszerzalny za pomocą
object.__format__()
haka używanego do obsługi formatowania poszczególnych wartości.Zauważ, że stary system miał
%
iTemplate
klasę, gdzie ta ostatnia pozwala na tworzenie podklas, które dodają lub zmieniają jego zachowanie. System nowego stylu maFormatter
klasę, która wypełnia tę samą niszę.Python 3 dalej odszedł od wycofania, zamiast tego ostrzegając w sekcji
printf
Formatowanie ciągów w stylu :Python 3.6 dodał również sformatowane literały ciągów , które wstawiają wyrażenia do ciągów formatu. Są to najszybsze metody tworzenia łańcuchów z wartościami interpolowanymi i powinny być używane zamiast
str.format()
wszędzie tam, gdzie można użyć literału.źródło
Formatter
możesz tworzyć niestandardowe formaty, takie jak te, którychdatetime
używają obiekty. Ponadto, ponieważ.format
jest to funkcja, możesz jej użyć do bardziej bezpośredniego tworzenia wywoływalnego leniwego formatowania: np.fmt = '{} - {}'.format; fmt(a, b)
Template
jest powiązany%
ze starym systemem lub z nim . W szczególności PEP, z którym łączysz, stany Chociaż istnieje pewne pokrywanie się między tą propozycją astring.Template
, wydaje się, że każda z nich służy odrębnej potrzebie, a jedna nie wyklucza drugiej. W Twojej odpowiedzi można być zdezorientowanym, żeTemplate
formatowanie, będące częścią starego systemu , również jest przestarzałe.Formatter
klasa może zaspokoić te same potrzeby costring.Template()
.[...]should be preferred to the % formatting[...]
ta część została usunięta z dokumentacji. docs.python.org/3/library/stdtypes.html#str.format%
Operator do formatowania ciąg nie jest przestarzała i nie zostanie usunięty - pomimo innych odpowiedzi.Za każdym razem, gdy temat jest poruszany na liście deweloperów Pythona, istnieją silne kontrowersje, co do tego, co jest lepsze, ale nie ma kontrowersji, czy usunąć klasyczny sposób - pozostanie. Pomimo oznaczenia w PEP 3101, Python 3.1 pojawił się i zniknął, a
%
formatowanie wciąż istnieje.Stwierdzenia dotyczące zachowania stylu klasycznego są jasne: jest proste, szybkie, szybkie do wykonania w przypadku krótkich rzeczy. Korzystanie z tej
.format
metody nie zawsze jest bardziej czytelne - i prawie nikt - nawet spośród głównych programistów, może użyć pełnej składni dostarczonej przez.format
bez konieczności patrzenia na odniesienie. Nawet w 2009 roku pojawiały się takie komunikaty: http: // mail. python.org/pipermail/python-dev/2009-October/092529.html - od tego czasu temat ledwo pojawiał się na listach.Aktualizacja 2016
W obecnej wersji rozwojowej Pythona (która stanie się Pythonem 3.6) istnieje trzecia metoda interpolacji ciągów, opisana w PEP-0498 . To definiuje nowy prefiks ofertowe
f""
(oprócz prąduu""
,b""
ar""
).Prefiks ciągu przez
f
wywoła metodę na obiekcie ciągu w czasie wykonywania, która automatycznie interpoluje zmienne z bieżącego zakresu do ciągu:źródło
__format__
. Na przykład,format(Decimal('0.1'), '.20f')
vs'%.20f' % Decimal('0.1')
. Ten ostatni wymusza Decimal na float.f
w Pythonie 3?f-strings
powyżej są nową funkcją w języku od wersji Python 3.6. Nie istnieje w poprzednich wersjach i spowoduje w nich błąd składni.Wydaje się, że ostatnie stanowisko Guido w tej sprawie jest wskazane tutaj:
Co nowego w Pythonie 3.0
I sam PEP3101 , który ma ostatnią modyfikację datowaną na (piątek, 30 września 2011), więc przypuszczam, że nie ma postępu w tej ostatniej.
źródło
Patrząc na starsze dokumenty Pythona i PEP 3101, było stwierdzenie, że operator% zostanie w przyszłości wycofany i usunięty z języka. Następujące stwierdzenie było w Dokumentach Pythona Pythonie 3.0, 3.1 i 3.2:
Jeśli przejdziesz do tej samej sekcji w dokumentach Pythona 3.3 i 3.4, zobaczysz, że instrukcja została usunięta. Nie mogę również znaleźć żadnego innego stwierdzenia w dokumentacji nigdzie indziej wskazującego, że operator zostanie wycofany lub usunięty z języka. Należy również zauważyć, że PEP3101 nie był modyfikowany od ponad dwóch i pół roku (piątek, 30 września 2011).
Aktualizacja
PEP461 Dodawanie formatowania% do bajtów i bajtów jest akceptowane i powinno być częścią Pythona 3.5 lub 3.6. To kolejny znak, że operator% żyje i działa.
źródło