Zanurkuj w Pythonie/type, str, dir i inne wbudowane funkcje
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.
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
- Argumentem
type
może być cokolwiek: stała, łańcuch znaków, lista, słownik, krotka, funkcja, klasa, moduł, wszystkie typy są akceptowane. - Kiedy podamy funkcji
type
dowolną zmienną, zostanie zwrócony jej typ. type
także działa na modułach.- Możemy używać stałych z modułu
types
, aby porównywać typy obiektów. Wykorzystuje to funkcjainfo
, 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.
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'
- 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. - 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. - 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. - 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 przeznull
). 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.
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'
- Podobnie, jak w przypadku
str
, do funkcjiunicode
możemy przekazać dowolny obiekt np. może to być liczba. Przekonwertowaliśmy liczbę na napis unikodowy. - Argumentem funkcji
unicode
może być także moduł. - Ponieważ litera "ź" nie należy do ASCII, więc Python nie potrafi jej zinterpretować. Zostaje rzucony wyjątek.
- Do funkcji
unicode
możemy przekazać drugi, opcjonalny argumentencoding
, 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.
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']
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.d
jest słownikiem, dlategodir(d)
zwróci listę nazw metod słownika. Co najmniej jedna z nich, metodakeys
, powinna wyglądać znajomo.- 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 przypadkuodbchelper
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.)
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)
- Nie zaleca się, żeby wykorzystywać funkcje z modułu
string
(chociaż wciąż wiele osób używa funkcjijoin
), 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. - Funkcja
string.join
łączy listę w łańcuch znaków. string.punctuation
nie jest wywoływalny, jest łańcuchem znaków. (Typstring
posiada metody, które możemy wywoływać, lecz sam w sobie nie jest wywoływalny.)string.join
można wywołać. Jest to funkcja przyjmująca dwa argumenty.- 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.).
>>> 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...]
Wraz z Pythonem dostajemy doskonałą dokumentację, zawierającą wszystkie potrzebne informacje o modułach oferowanych przez ten język. Porównując do innych języków, z Pythonem nie dostajemy podręcznika man, czy odwołań do innych zewnętrznych podręczników, wszystko co potrzebujemy znajdujemy wewnątrz samego Pythona. |