Przejdź do zawartości

Zanurkuj w Pythonie/type, str, dir i inne wbudowane funkcje

Z Wikibooks, biblioteki wolnych podręczników.

type, str, dir i inne wbudowane funkcje

[edytuj]

Python posiada mały zbiór bardzo użytecznych wbudowanych funkcji. Wszystkie inne funkcje znajdują się w różnych modułach. Była to świadoma decyzja projektowa, aby uniknąć przeładowania rdzenia języka, jak to ma miejsce w przypadku innych języków (jak np. Visual Basic czy Object Pascal).

Funkcja type

[edytuj]

Funkcja type zwraca typ danych podanego obiektu. Wszystkie typy znajdują się w module types. Funkcja ta może się okazać przydatna podczas tworzenia funkcji obsługujących kilka typów danych.

Przykład. Wprowadzenie do type
>>> type(1)           #(1)
<type 'int'>
>>> li = []
>>> type(li)          #(2)
<type 'list'>
>>> import odbchelper
>>> type(odbchelper)  #(3)
<type 'module'>
>>> import types      #(4)
>>> type(odbchelper) == types.ModuleType
True
  1. Argumentem type może być cokolwiek: stała, łańcuch znaków, lista, słownik, krotka, funkcja, klasa, moduł, wszystkie typy są akceptowane.
  2. Kiedy podamy funkcji type dowolną zmienną, zostanie zwrócony jej typ.
  3. type także działa na modułach.
  4. Możemy używać stałych z modułu types, aby porównywać typy obiektów. Wykorzystuje to funkcja info, co wkrótce zobaczymy.

Funkcja str

[edytuj]

Funkcja str przekształca dane w łańcuch znaków. Każdy typ danych może zostać przekształcony w łańcuch znaków.

Przykład. Wprowadzenie do str
>>> str(1)                                        #(1)
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen
['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)                                 #(2)
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper)                               #(3)
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)                                     #(4)
'None'
  1. Można było się spodziewać, że str działa na tych prostych, podstawowych typach takich jak np. liczby całkowite. Prawie każdy język programowania posiada funkcję konwertującą liczbę całkowitą na łańcuch znaków.
  2. Jakkolwiek funkcja str działa na każdym obiekcie dowolnego typu, w tym przypadku jest to lista składająca się z kilku elementów.
  3. Argumentem funkcji str może być także moduł. Zauważmy, że łańcuch reprezentujący moduł zawiera ścieżkę do miejsca, w którym się ten moduł znajduje. Na różnych komputerach może być ona inna.
  4. Subtelnym, lecz ważnym zachowaniem funkcji str jest to, że argumentem może być nawet wartość None (Pythonowej wartości pusta, często określanej w innych językach przez null). Dla takiego argumentu funkcja zwraca napis 'None'. Wkrótce wykorzystamy tę możliwość.

Funkcja unicode

[edytuj]

Funkcja unicode pełni tą samą funkcję, co str, ale zamiast łańcucha znaków tworzy unikod.

Przykład. Wprowadzenie do unicode
>>> unicode(1)                              #(1)
u'1'
>>> unicode(odbchelper)                     #(2)
u"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> print unicode(horsemen[0])    
u'war'
>>> unicode('jeździectwo')                  #(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 2: ordinal not in range(128)
>>> unicode('jeździectwo', 'utf-8')         #(4)
u'je\u017adziectwo'
  1. Podobnie, jak w przypadku str, do funkcji unicode możemy przekazać dowolny obiekt np. może to być liczba. Przekonwertowaliśmy liczbę na napis unikodowy.
  2. Argumentem funkcji unicode może być także moduł.
  3. Ponieważ litera "ź" nie należy do ASCII, więc Python nie potrafi jej zinterpretować. Zostaje rzucony wyjątek.
  4. Do funkcji unicode możemy przekazać drugi, opcjonalny argument encoding, który określa, w jakim systemie kodowania jest zakodowany łańcuch znaków. Komputer, na którym został uruchomiony ten przykład, korzystał z kodowania UTF-8, więc przekazany łańcuch znaków także będzie w tym systemie kodowania.

Funkcja dir

[edytuj]

Kluczową funkcją wykorzystaną w info jest funkcja dir. Funkcja ta zwraca listę atrybutów i metod pewnego obiektu np. modułu, funkcji, łańcuch znaków, listy, słownika... niemal wszystkiego.

Przykład. Wprowadzenie do dir
>>> li = []
>>> dir(li)                                        #(1)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__',
'__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__',
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)                                         #(2)
[[...,'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys',
'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)                                #(3)
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
  1. li jest listą, dlatego też dir(li) zwróci nam listę wszystkich metod, które posiada lista. Zwróćmy uwagę na to, że zwracana lista zawiera nazwy metod w formie łańcucha znaków, a nie metody same w sobie. Metody zaczynające się i kończące dwoma znakami podkreślenia są metodami specjalnymi.
  2. d jest słownikiem, dlatego dir(d) zwróci listę nazw metod słownika. Co najmniej jedna z nich, metoda keys, powinna wyglądać znajomo.
  3. Dzięki temu funkcja ta staje się interesująca. odbchelper jest modułem, więc za pomocą dir(odbchelper) otrzymamy listę nazw atrybutów tego modułu włączając w to wbudowane atrybuty np. __name__, czy też __doc__, a także jakiekolwiek inne np. zdefiniowane przez nas funkcje. W tym przypadku odbchelper posiada tylko jedną, zdefiniowaną przez nas metodę -- funkcję buildConnectionString opisaną w rozdziale "Pierwszy program".

Funkcja callable

[edytuj]

Funkcja callable zwraca True, jeśli podany obiekt może być wywoływany, a False w przeciwnym przypadku. Do wywoływalnych obiektów zaliczamy funkcje, metody klas, a nawet same klasy. (Więcej o klasach możemy przeczytać w następnym rozdziale.)

Przykład. Wprowadzenie do callable
>>> import string
>>> string.punctuation                              #(1)
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                                     #(2)
<function join at 00C55A7C>
>>> callable(string.punctuation)                    #(3)
False
>>> callable(string.join)                           #(4)
True
>>> print string.join.__doc__                       #(5)
join(list [,sep]) -> string

    Return a string composed of the words in list, with
    intervening occurrences of sep.  The default separator is a
    single space.

    (joinfields and join are synonymous)


  1. Nie zaleca się, żeby wykorzystywać funkcje z modułu string (chociaż wciąż wiele osób używa funkcji join), ale moduł ten zawiera wiele przydatnych stałych jak np. string.punctuation, który zawiera wszystkie standardowe znaki przestankowe, więc z niego tutaj skorzystaliśmy.
  2. Funkcja string.join łączy listę w łańcuch znaków.
  3. string.punctuation nie jest wywoływalny, jest łańcuchem znaków. (Typ string posiada metody, które możemy wywoływać, lecz sam w sobie nie jest wywoływalny.)
  4. string.join można wywołać. Jest to funkcja przyjmująca dwa argumenty.
  5. Każdy wywoływalny obiekt może posiadać notkę dokumentacyjną. Kiedy wykonamy funkcję callable na każdym atrybucie danego obiektu, będziemy mogli potencjalnie określić, którymi atrybutami chcemy się bardziej zainteresować (metody, funkcje, klasy), a które chcemy pominąć (stałe itp.).

Wbudowane funkcje

[edytuj]

type, str, unicode, dir i wszystkie pozostałe wbudowane funkcje są umieszczone w specjalnym module o nazwie __builtin__ (nazwa z dwoma znakami podkreślenia przed i po nazwie). Jeśli to pomoże, możemy założyć, że Python automatycznie wykonuje przy starcie polecenie from __builtin__ import *, które bezpośrednio importuje wszystkie wbudowane funkcje do używanej przez nas przestrzeni nazw. Zaletą tego, że funkcje te znajdują się w module, jest to, że możemy dostać informacje o wszystkich wbudowanych funkcjach i atrybutach poprzez moduł __builtin__. Wykorzystajmy funkcje info podając jako argument ten moduł i przejrzyjmy wyświetlony spis. Niektóre z ważniejszych funkcji w module __builtin__ zgłębimy później. (Niektóre z wbudowanych klas błędów np. AttributeError, powinny wyglądać znajomo.).

Przykład. Wbudowane atrybuty i funkcje
>>> from apihelper import info
>>> import __builtin__
>>> info(__builtin__, 20)
ArithmeticError      Base class for arithmetic errors.
AssertionError       Assertion failed.
AttributeError       Attribute not found.
EOFError             Read beyond end of file.
EnvironmentError     Base class for I/O related errors.
Exception            Common base class for all exceptions.
FloatingPointError   Floating point operation failed.
IOError              I/O operation failed.

[...ciach...]

Materiały dodatkowe

[edytuj]