Zanurkuj w Pythonie/Abstrakcyjne źródła wejścia: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Nie podano opisu zmian |
ok, przetłumaczone |
||
Linia 1:
{{Podświetl|py}}
== Abstrakcyjne źródła wejścia ==
Linia 134 ⟶ 132:
# Teraz możemy przekazać obiekt pliko-podobny (w rzeczywistości <tt>StringIO</tt>) do <tt>minidom.parse</tt>, który wywoła metodę <tt>read</tt> z tego obiektu i szczęśliwie wszystko przeparsuje, nie zdając sobie nawet sprawy, że wejście to pochodzi z łańcucha znaków.
To już wiemy, jak za pomocą pojedyńczej funkcji, <tt>minidom.parse</tt>, sparsować dokument XML przechowywany na stronie internetowej, lokalnym pliku, czy łańcuchu znaków. Dla strony internetowej wykorzystamy <tt>urlopen</tt>, aby dostać ''obiekt pliko-podobny''; dla lokalnego pliku, wykorzystamy <tt>open</tt>; a w przypadku łańcucha znaków skorzystamy z <tt>StringIO</tt>. Lecz teraz pójdźmy trochę do przodu i uogólnijmy też te różnice.
'''
<nowiki>
Linia 158 ⟶ 156:
</nowiki>
#
# Najpierw sprawdzamy, czy <tt>source</tt> jest URL-em. Robimy to brutalnie: próbujemy otworzyć to jako URL i cicho pomijamy błędy spowodowane próbą otworzenia czegoś, co nie jest URL-em. Jest to właściwie eleganckie w tym sensie, że jeśli <tt>urllib</tt> będzie kiedyś obsługiwał nowe typy URL-i, nasz program także je obsłuży i to bez konieczności zmiany kodu. Jeśli <tt>urllib</tt> jest w stanie otworzyć <tt>source</tt>, to <tt>return</tt> wykopie nas bezpośrednio z funkcji i poniższe instrukcje <tt>try</tt> nie będą nigdy wykonywane.
# W innym przypadku, gdy <tt>urllib</tt> wrzasnął na nas i powiedział, że <tt>source</tt> nie jest poprawnym URL-em, zakładamy, że jest to ścieżka do pliku znajdującym się na dysku i próbujemy go otworzyć. Ponownie, nic nie robimy, by sprawdzić, czy <tt>source</tt> jest poprawną nazwą pliku (zasady określające poprawność nazwy pliku są szalenie różne na różnych platformach, dlatego prawdopodobnie i tak byśmy to źle zrobili). Zamiast tego, na ślepo otwieramy plik i cicho pomijamy wszystkie błędy.
# W tym miejscu zakładamy, że <tt>source</tt> jest łańcuchem znaków, który przechowuje dokument XML (ponieważ nic innego nie zadziałało), dlatego wykorzystujemy <tt>StringIO</tt>, aby utworzyć ''obiekt pliko-podobny'' i zwracamy go. (Tak naprawdę, ponieważ wykorzystujemy funkcje <tt>str</tt>, <tt>source</tt> nie musi być nawet łańcuchem znaków; może być nawet dowolnym obiektem, a z którego zostanie wykorzystana jego tekstową <ref>łańcuchowo-znakowa</ref> reprezentacja, a która jest zdefiniowana przez specjalną metodę <tt>__str__</tt>.)
Teraz możemy wykorzystać funkcje <tt>openAnything</tt> w połączeniu z <tt>minidom.parse</tt>, aby utworzyć funkcje, która przyjmuje źródło <tt>source</tt>, które w jakiś sposób odwołuje się do dokumentu XML (może to robić za pomocą adresu URL, lokalnego pliku, czy też dokumentu przechowywanego jako łańcuch znaków), i parsuje je.
'''
<nowiki>
class KantGenerator:
|