Zanurkuj w Pythonie/Potęga introspekcji: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana ProstaNawigacja->Subst:ProstaNawigacja
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 1:
W tym rozdziale dowieszdowiemy się o jednej z mocnych stron Pythona -- introspekcji. Jak już wieszwiemy, [[../Wszystko jest obiektem|wszystko w Pythonie jest obiektem]], natomiast introspekcja jest kodem, który postrzega funkcje i moduły znajdujące się w pamięci jako obiekty, a także pobiera o nich informacje i operuje nimi.
{{Podświetl|py}}
W tym rozdziale dowiesz się o jednej z mocnych stron Pythona - introspekcji. Jak już wiesz, [[../Wszystko jest obiektem|wszystko w Pythonie jest obiektem]], natomiast introspekcja jest kodem, który postrzega funkcje i moduły znajdujące się w pamięci jako obiekty, a także pobiera o nich informacje i operuje nimi.
 
== Nurkujemy ==
Zacznijmy od kompletnego, działającego programu. Przeglądając kod na pewno rozumiesz już niektóre jego fragmenty. Przy niektórych liniach znajdują się liczby w komentarzach; korzystamy tu z koncepcji, które wykorzystywaliśmy już w [[Python/Twój pierwszy program|rozdziale drugim]]. Nie przejmuj się, jeżeli nie rozumiesz części tego programu. W rozdziale tym wszystkiego się jeszcze nauczysz.
 
'''Przykład 4.1. <tt class="lang-none">apihelper.py</tt>'''
 
{{Python/Przykład
def info(object, spacing=10, collapse=1): #(1) (2) (3)
|4.1|{{Python/Src|apihelper.py}}
"""Drukuje metody i dokumentacje.
|tekst=
Zastosowanie dla modulow, klas, list, slownikow lub lancuchow znakow."""
def info(object, spacing=10, collapse=1): #(1) (2) (3)
methodList = [method for method in dir(object) if callable(getattr(object, method))]
"""Wypisuje metody i ich notki dokumentacyjne.
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "\n".join(["%s %s" %
Argumentem może być moduł, klasa, lista, słownik, czy też łańcuch znaków."""
methodList = [methode for methode in dir(object) if callable(getattr(object, methode))]
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "\n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])<br>
if __name__ == "__main__": #(4) (5)
print info.__doc__
# Ten moduł ma jedną funkcję <ttcode>info</ttcode>. Zgodnie ze swoją [[../Deklarowanie funkcji|deklaracją]], wymaga ona trzech argumentów: <ttcode>object</ttcode>, <ttcode>spacing</ttcode> oraz <ttcode>collapse</ttcode>. Dwa ostatnie parametry są opcjonalne, co za chwilę zobaczyszzobaczymy.
# Funkcja <ttcode>info</ttcode> posiada wieloliniowywieloliniową [[../Dokumentowanie funkcji|napisnotkę dokumentacyjnydokumentacyjną]], który opisuje jej zastosowanie. Zauważ, że funkcja nie zwraca żadnej wartości. Ta funkcja będzie wykorzystywana, aby wykonać pewną czynność, a nie żeby otrzymać pewną wartość.
# Kod wewnątrz funkcji jest [[../Wcięcia kodu|wcięty]].
# [[../Testowanie modułów|Sztuczka]] z <ttcode>if __name__</ttcode> pozwala wykonać programowi coś użytecznego, kiedy zostanie uruchomiony samodzielnie. Kod pod tą instrukcją nie zostanie wykonany, jeśli kod ten wykorzystamy jako moduł w innym programie. W tym wypadku program wypisuje po prostu napisnotkę dokumentacyjnydokumentacyjną (tzw. ''docstring'') funckjifunkcji <ttcode>info</ttcode>.
# [[../Testowanie modułów|Instrukcja <ttcode>if</ttcode>]] wykorzystuje <ttcode>==</ttcode> (dwa znaki równości), aby porównać dwie wartości. W instrukcji <ttcode>if</ttcode> nie musimy korzystać z nawiasów okrągłych.
}}
 
Funkcja <ttcode>info</ttcode> została zaprojektowana tak, aby ułatwić tobiesobie pracę w IDE Pythona. IDE bierze jakiś obiekt, który posiada funkcje lub metody (jak na przykład moduł zawierający funkcje lub listę, która posiada metody) i wyświetla funkcje i ich napisynotki dokumentacyjne.
 
'''Przykład 4.2. Proste zastosowanie <tt class="lang-none">apihelper.py</tt>'''
 
{{Python/Przykład
'''Przykład |4.2. |Proste zastosowanie <tt class="lang-none">{{Python/Src|apihelper.py</tt>'''}}
|tekst=
>>> from apihelper import info
>>> li = []
>>> info(li)
{{samp|append L.append(object) -- append object to end
count L.count(value) -> integer -- return number of occurrences of value
extend L.extend(list) -- extend list by appending list elements
Linia 40 ⟶ 44:
remove L.remove(value) -- remove first occurrence of value
reverse L.reverse() -- reverse *IN PLACE*
sort L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1}}
}}
 
Domyślnie wynik jest formatowany tak, by był łatwy do odczytania. NapisyNotki dokumentacyjne składające się z wielu linii zamieniane są na jednoliniowe, ale możemy zmienić tę opcję możemy zmienić ustawiając wartość <ttcode>0</ttcode> dla argumentu <ttcode>collapse</ttcode>. Jeżeli nazwa funkcji jest dłuższa niż ''10 znaków'', możeszmożemy określić inną wartość dla argumentu <ttcode>spacing</ttcode>, by ułatwić sobie czytanie.
 
{{Python/Przykład
'''Przykład |4.3. |Zaawansowane użycie <tt class="lang-none">{{Python/Src|apihelper.py</tt>'''}}
|tekst=
>>> import odbchelper
>>> info(odbchelper)
{{samp|buildConnectionString Build a connection string from a dictionary Returns string.}}
>>> info(odbchelper, 30)
{{samp|buildConnectionString Build a connection string from a dictionary Returns string.}}
>>> info(odbchelper, 30, 0)
{{samp|buildConnectionString Build a connection string from a dictionary
Returns string.}}
}}
 
<noinclude>
{{Nawigacja|../|
Linia 60 ⟶ 68:
[[../Użycie argumentów opcjonalnych i nazwanych|Użycie argumentów opcjonalnych i nazwanych]]|
}}
{{Podświetl|py}}
</noinclude>