Zanurkuj w Pythonie/Formatowanie napisów w oparciu o słowniki
Formatowanie napisów w oparciu o słowniki
[edytuj]Dlaczego uczyliśmy się na temat funkcji locals i globals? Ponieważ teraz możemy się nauczyć formatowania napisów w oparciu o słowniki. Jak już mówiliśmy, regularne formatowanie napisów umożliwia w łatwy sposób wstawianie wartości do napisów. Wartości są wyszczególnione w krotce i w odpowiednim porządku wstawione do napisu, gdzie występuje pole formatujące. O ile jest to skuteczne, nie zawsze tworzy kod łatwy do czytania, zwłaszcza, gdy zostaje wstawianych wiele wartości. Żeby zrozumieć o co chodzi, nie wystarczy po prostu jednorazowo prześledzić napis; trzeba ciągle skakać między czytanym napisem, a czytaną krotką wartości.
Mamy tutaj alternatywną metodę formatowania napisu, wykorzystującą słowniki zamiast krotek.
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> "%(pwd)s" % params #(1)
'secret'
>>> "%(pwd)s nie jest poprawnym hasłem dla %(uid)s" % params #(2)
'secret nie jest poprawnym hasłem dla sa'
>>> "%(database)s of mind, %(database)s of body" % params #(3)
'master of mind, master of body'
- Zamiast korzystać z krotki wartości, formujemy napis formatujący, który korzysta ze słownika
params. Ponadto zamiast prostego pola%sw napisie, pole zawiera nazwę w nawiasach okrągłych. Nazwa ta jest wykorzystana jako klucz w słownikuparamsi zostaje zastąpione odpowiednią wartością,secret, w miejscu wystąpienia pola%(pwd)s. - Takie formatowanie może posiadać dowolną liczbę odwołań do kluczy. Każdy klucz musi istnieć w podanym słowniku, ponieważ inaczej formatowanie zakończy się niepowodzeniem i zostanie rzucony wyjątek
KeyError. - Możemy nawet wykorzystać ten sam klucz kilka razy. Każde wystąpienie zostanie zastąpione odpowiednią wartością.
Zatem dlaczego używać formatowania napisu w oparciu o słowniki? Może to wyglądać na nadmierne wmieszanie słownika z kluczami i wartościami, aby wykonać proste formatowanie napisu. W rzeczywistości jest bardzo przydatne, kiedy już się ma słownik z kluczami o sensownych nazwach i wartościach, jak np. locals.
def handle_comment(self, text):
self.pieces.append("<!--%(text)s-->" % locals()) #(1)
- Formatowanie za pomocą słowników jest powszechnie używane z wbudowaną funkcją
locals. Oznacza to, że możemy wykorzystywać nazwy zmiennych lokalnych wewnątrz napisu formatującego (w tym przypadkutext, który został przykazany jako argument do metody klasy) i każda nazwa zmiennej zostanie zastąpiona jej wartością. Jeślitextprzechowuje wartość'Początek stopki', formatowany napis"<!--%(text)s-->" % locals()zostanie wygenerowany jako'<!--Początek stopki-->'.
def unknown_starttag(self, tag, attrs):
strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs]) #(1)
self.pieces.append("<%(tag)s%(strattrs)s>" % locals()) #(2)
- Kiedy metoda ta zostaje wywołana,
attrsjest listą krotek postaci klucz/wartość, podobnie jak zwrócona wartość metody słownikaitems, a to oznacza, że możemy wykorzystać wielozmienne przypisanie, aby wykonać na niej iterację. Powinniśmy już być zaznajomieni z tymi operacjami, ale występuje ich tutaj sporo, więc prześledźmy je po kolei:- Przypuśćmy, że
attrswynosi [('href', 'index.html'), ('title', 'Idź do strony domowej')]. - W pierwszym przebiegu odwzorowywania listy,
keyprzyjmie wartość'href', avalueweźmie wartość'index.html'. - Formatowanie napisu
' %s="%s"' % (key, value)przekształci się na' href="index.html"'. Napis ten będzie pierwszym elementem zwróconej listy. - W drugim przebiegu,
keyprzyjmie wartość'title', avaluewartość'Idź do strony domowej'. - Formatowanie napisu przekształci to na
' title="Idź do strony domowej"'. - Po wykonaniu wyrażenia listowego zwrócona lista będzie przechowywała te dwa wygenerowane napisy, a
strattrsbędzie połączeniem obydwu tych elementów, czyli będzie przechowywał' href="index.html" title="Idź do strony domowej"'.
- Przypuśćmy, że
- Teraz formatując napis za pomocą słownika, wstawiamy wartość zmiennej
tagistrattrsdo napisu. Zatem jeślitagwynosił'a', w ostateczności otrzymamy wynik'<a href="index.html" title="Idź do strony domowej'">'i to następnie dodajemy doself.pieces.
| Uwaga!
Korzystanie ze słownikowego formatowania napisu i funkcji |