2017-01-23 4 views
1

В ipython я могу использовать TAB для просмотра объектов объекта:Как показывают объекты объекта, как в IPython

In [1]: import numpy as np 

In [2]: np. 
Display all 590 possibilities? (y or n) 
np.ALLOW_THREADS    np.bartlett     np.errstate     np.isclose     np.nested_iters    np.seterrcall 
np.BUFSIZE     np.base_repr     np.euler_gamma    np.iscomplex     np.newaxis     np.seterrobj 
np.CLIP      np.bench      np.exp      np.iscomplexobj    np.newbuffer     np.setxor1d 
np.ComplexWarning    np.binary_repr    np.exp2      np.isfinite     np.nextafter     np.shape 
np.DataSource     np.bincount     np.expand_dims    np.isfortran     np.nonzero     np.shares_memory 
.... 

Есть программный способ сделать это вне ipython? Могу ли я напечатать эти объекты в обычном сценарии Python?

ответ

5

Команда 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)

3

НаПредставлениевкладки показать выше, потребует форматирования, которые я не буду здесь делать, но получать атрибуты объекта может быть сделано с dir(MyObject) встроенной функцией. Это вернет список всех атрибутов.