2.3. type, str, dir и другие встроенные функции

В языке Python есть небольшой набор очень полезных встроенных функций. Все остальные функции распределены по модулям. В самом деле, это удачное проектное решение позволяет предотвратить разбухание ядра языка, как это произошло с некоторыми другими скриптовыми языками (например, Visual Basic).

Функция type возвращает тип произвольного объекта. Возможные значения типов перечислены в модуле types. Определение типа полезно в функциях, способных обрабатывать данные нескольких типов.

Пример 2.6. Функция 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 1
1 Функция type воспринимает объект произвольного типа и возвращает его тип. Аргумент действительно может быть произвольного типа: число, строка, список, словарь, кортеж, функция, класс, модуль и даже сам тип.
2 В качестве аргумента может использоваться переменная.
3 Функция type работает и c модулей.
4 Вы можете использовать константы, определенные в модуле types для сравнения типов объектов. Именно это и делает, как мы скоро увидим, функция help.

Функция str преобразует данные в строку. Для любого типа данных можно получить строковое представление.

Пример 2.7. Функция str

>>> str(1) 1 '1' >>> 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 Вы, наверное, ожидали, что str будет работать с такими простыми типами данных, как целые числа, так как почти каждый язык содержит функцию для преобразования целого числа в строку.
2 Однако, str работает и с объектами других типов. В данном случае мы получаем строковое представление списка.
3 Функция str работает и с модулями. Обратите внимание, что строковое представление модуля содержит путь к модулю на диске, так что в вашем случае он будет отличаться.
4 Важно также, что str работает и с объектом None, “нулевым” значением в языке Python. В этом случае она возвращает строку 'None'. Мы воспользуемся этим в функции help.

Сердцем функции help является мощная функция dir. dir возвращает список атрибутов и методов произвольного объекта: модуля, функции, строки, списка, словаря… в общем, любого объекта.

Пример 2.8. Функция dir

>>> li = [] >>> dir(li) 1 ['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>> d = {} >>> dir(d) 2 ['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values'] >>> import odbchelper >>> dir(odbchelper) 3 ['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
1 li является списком, так что dir(li) дает список имен всех методов списка. Обратите внимание, что возвращаемый список содержит имена методов в виде строк, а не сами методы.
2 d является словарем, поэтому dir(d) дает список имен методов словаря. Как минимум один из них, keys, вам уже знаком.
3 Здесь начинается самое интересное. odbchelper является модулем, так что dir(odbchelper) дает список всех имен, определенных в модуле, включая специальные атрибуты, такие как __name__ и __doc__. В данном случае, odbchelper содержит одну пользовательскую функцию, buildConnectionString, которую мы изучали в главе Знакомство с языком Python.

Наконец, функция callable возвращает 1, если аргумент может быть вызван, в противном случае возвращает 0. Вызов поддерживают такие объекты, как функции, методы и даже классы. (Более подробно о классах читайте в главе 3.)

Пример 2.9. Функция callable

>>> import string >>> string.punctuation 1 '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' >>> string.join 2 <function join at 00C55A7C> >>> callable(string.punctuation) 3 0 >>> callable(string.join) 4 1 >>> 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 На смену большинству функций модуля string пришли методов строк (хотя многие до сих пор используют функцию join), но модуль также содержит множество полезных констант. Например string.punctuation содержит все стандартные символы пунктуации.
2 Функция string.join объединяет строки списка в одну строку.
3 string.punctuation является строкой и вызов не поддерживает. (Строки имеют методы, которые можно вызвать, но вы не можете вызвать саму строку.)
4 string.join ялвляется функцией и поддерживает вызов с двумя аргументами.
5 Любой объект, поддерживающий вызов, может иметь строку документации. Применяя функцию callable к каждому атрибуту объекта, мы можем определить, какие атрибуты представляют для нас интерес (методы, функции, классы), и какие можно игнорировать (константы и т. д.), не имея каких-либо начальных знаний об объекте.

type, str, dir и другие втроенные функции языка Python сгруппированы в специальном модуле __builtin__ (обратите внимание на два символа подчеркивания в начале и два в конце). Встроенные функции доступны напрямую, как если бы интерпретатор при запуске автоматически выполнял from __builtin__ import *.

Вы можете получить информацию о встроенных функциях (и других объектах) как об отдельной группе исследуя модуль __builtin__. Для этих целей у нас есть функция help. Попробуйте проделать это сейчас сами. Позже мы более подробно рассмотрим наиболее важные встроенные функции (некоторые классы исключений, например AttributeError, вам должны быть уже знакомы.)

Пример 2.10. Втроенные функции и другие объекты

>>> from apihelper import help >>> import __builtin__ >>> help(__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. [... и т. д. ...]
Замечание
Python распространяется вместе с прекрасной документацией. Вам следует внимательно прочитать, чтобы заиметь представления о предоставляемых им возможностях. Но, в то время как при использовании большинства других языков вам необходимо все время возвращать к чтению документации (страниц man или, не дай Бог, MSDN), чтобы вспомнить, как использовать тот или иной модуль, Python в основном содержит эту документацию в себе.

Дополнительная литература