Команда dir(..)
может использоваться для получения списка атрибутов, которые имеет объект. Например:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> dir(np)
['ALLOW_THREADS', 'BUFSIZE', 'CLIP', 'ComplexWarning', 'DataSource', 'ERR_CALL', 'ERR_DEFAULT', 'ERR_IGNORE', 'ERR_LOG', 'ERR_PRINT', 'ERR_RAISE', 'ERR_WARN', 'FLOATING_POINT_SUPPORT', 'FPE_DIVIDEBYZERO', 'FPE_INVALID', 'FPE_OVERFLOW', 'FPE_UNDERFLOW',..., 'var', 'vdot', 'vectorize', 'version', 'void', 'void0', 'vsplit', 'vstack', 'warnings', 'where', 'who', 'zeros', 'zeros_like']
(выход вырезается, чтобы упростить выборку и форматирование).
Он возвращает список строк, которые показывают, что находится в объекте. Обратите внимание, что эту функцию можно также использовать для программы в Python: вы можете, например, перебрать ее, фильтровать для определенного шаблона и скопировать эти атрибуты на другой объект. Например, вы могли бы написать copy_fields
функцию:
def copy_fields(frm,to):
for attr in dir(frm):
setattr(to,atr,getattr(frm,atr))
Здесь getattr(..)
и setattr(..)
являются функции, которые данный объект (frm
и to
) и имя атрибута (attr
) соответственно получить и установить этот атрибут.
Я совершенно уверен, что это то, что происходит (более или менее) за кулисами ipython
(хотя, вероятно, IPython также стремится вывести тип таким образом, что он может написать скобку ((
) для функций и т.д.
Наконец, помните, что dir(..)
не всегда может сообщать обо всех атрибутах (поскольку иногда атрибуты могут обрабатываться функциями, что приводит к тому, что объект имеет «практически» бесконечное количество атрибутов, то есть, например, для объектов в BeautifulSoup
где, если атрибут не является стандартизированным, BeautifulSoup рассматривает его как запрос). За шторами dir(..)
работает следующим образом:
Если у объекта есть метод с именем __dir__()
, этот метод будет называться и должен возвращать список атрибутов. Это позволяет объектам реализовать пользовательскую функцию __getattr__()
или __getattribute__()
для настроить способ dir()
сообщает об их атрибутах.
Если объект не обеспечивает __dir__()
, функция пытается его лучший для сбора информации из атрибута объекта __dict__
, если определен, и от его типа объекта. Полученный список не обязательно заполняется и может быть неточным, если у объекта есть пользовательский номер __getattr__()
.
(source)