Сначала командой dir() распечатываем список атрибутов объектов. Потом функцией help(), или .__doc__ вытаскиваем строки комментариев из атрибута (или) объекта. Help() - это обертка __doc__? Следует помнить также, что функция help может извлекать информацию не только из встроенных, но и из любых других модулей (в том числе - моих).
Кроме того, обычно отдельно online поставляется подробная документация в HTML формате - это документация, которую мы читаем обычно на сайте (но устаревшая). Еу не надо путать с PyDoc - это всего-лишь HTML примочка для чтения .doc
Некоторые примеры использования справки¶
Комментарии # Документация внутри файла
Функция dir Получение списка атрибутов объектов Строки документирования: __doc__ Документация внутри файла,присоединяемая к объектам
PyDoc: функция help Интерактивная справка по объектам
PyDoc: отчеты в формате HTML Документация к модулям для просмотра в броузере
import sys
>>> dir(sys)
list(sys.__dict__.keys())
print sys.__package__, sys.__name__, sys._current_frames
print(sys.__doc__)
print(sys.getrefcount.__doc__)
help(sys.getrefcount)
print(int.__doc__)
p. 666 Интерпретатор Python сначала отыскивает список all в модуле, и если он отсутствует, инструкция from * копирует все имена, которые не начинаются с единственного символа подчеркивания.
p. 666 В языке периодически появляются изменения, которые могут повлиять на работоспособность существующего программного кода. Сначала они появляются в виде расширений, которые по умолчанию отключены. Чтобы включить такие расширения, используется инструкция импорта специального вида: from future import имяфункциональнойособенности
p. 670 Список sys.argv в языке Python содержит аргументы командной строки – список строк со словами, введенными в командной строке, где первый элемент списка всегда содержит имя файла сценария
sys.argv
sys.path
Посты чуть ниже также могут вас заинтересовать
Итак, пора освоить команды для использования в дебаггере... Времени на то, чтобы сесть и написать пост на эту тему нету - нужны наборы стандартных методик, например,
ОтветитьУдалить1. Посмотреть аргументы командой pdb дебаггера args
шутка... не для зануд
2-3. Сначала смотрим список атрибутов объекта при помощи команды dir(), потом вызываем справку по каждому атрибуту help()
Это любимый "прием" М.Лутца.
4. Словарь объекта , например list(sys.__dict__.keys())
5- В посте есть несколько команд из библиотеки SYS
ОтветитьУдалитьToDo: Надо бы посмотреть и эту и другие библиотеки... Не забыть это сделать
Справка по sys распечатана выше, изучить!
УдалитьЧтобы узнать, какие атрибуты содержат объекты встроенных типов, передайте
ОтветитьУдалитьфункции dir литерал (или существующий объект) требуемого типа. Например,
чтобы увидеть атрибуты списков и строк, можно передать функции пустой
объект:
>>> dir([])
[‘__add__’, ‘__class__’, ...остальные имена опущены...
‘append’, ‘count’, ‘extend’, ‘index’, ‘insert’, ‘pop’, ‘remove’,
‘reverse’, ‘sort’]
>>> dir(‘’)
[‘__add__’, ‘__class__’, ‘__contains__’, ...остальные имена опущены...
‘capitalize’, ‘center’, ‘count’, ‘encode’, ‘endswith’, ‘expandtabs’,
‘find’, ‘format’, ‘index’, ‘isalnum’, ‘isalpha’, ‘isdecimal’, ‘isdigit’,
‘isidentifier’, ‘islower’, ‘isnumeric’, ‘isprintable’, ‘isspace’, ‘istitle’,
‘isupper’, ‘join’, ‘ljust’, ‘lower’, ‘lstrip’, ‘maketrans’, ‘partition’, ‘replace’,
‘rfind’, ‘rindex’, ‘rjust’,...остальные имена опущены...]
Того же эффекта можно добиться, передав функции dir имя типа вместо лите-
Удалитьрала:
>>> dir(str) == dir(‘’) # Результат тот же, что и в предыдущем примере
True
>>> dir(list) == dir([])
True
Функция dir служит своего рода «кратким напоминанием» – она предостав-
Удалитьляет список имен атрибутов, но ничего не сообщает о том, что эти имена озна-
чают. За этой информацией необходимо обращаться к следующему источнику
документации.
__dict__ или dir(M)
УдалитьДоступ к пространствам имен модулей можно получить через атрибут __dict__ или dir(M). Пространства имен модулей, создаваемые операцией
импортирования, представляют собой словари – доступ к ним можно получить через встроенный атрибут __dict__, ассоциированный с модулем, и с
помощью функции dir.
Функция dir – это примерный эквивалент отсортированного списка ключей атрибута __dict__,
но она включает унаследованные имена классов (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!),
может возвращать не полный список и
часто изменяется от версии к версии.
Унаследованные атрибуты класса присоединяются только к объекту класса, и не повторяются в экземплярах.
УдалитьЕсли вам потребуется добавить вывод унаследованных атрибутов, вы можете с помощью ссылки
__class__
получить доступ к классу экземпляра и извлечь из его словаря
__dict__ атрибуты класса, а затем выполнить итерации через содержимое атрибута
__bases__
класса, чтобы подняться до уровня суперклассов (настолько высоко, насколько это потребуется).
Если вы предпочитаете не усложнять программный код, вместо атрибута __dict__ можно вызвать встроенную функцию
dir,
передав ей экземпляр, и получить тот же результат, потому что функция dir включает в результат унаследованные имена и возвращает его в виде отсортированного списка
# В Python 2.6:
Удалить>>> bob.__dict__.keys() # Только атрибуты экземпляра
[‘pay’, ‘job’, ‘name’]
>>> dir(bob) # + унаследованные атрибуты классов
[‘__doc__’, ‘__init__’, ‘__module__’, ‘__str__’, ‘giveRaise’, ‘job’, ‘lastName’, ‘name’, ‘pay’]
# В Python 3.0:
>>> list(bob.__dict__.keys()) # В 3.0 метод keys возвращает представление,
[‘pay’, ‘job’, ‘name’] # а не список
>>> dir(bob) # В 3.0 включаются методы типа класса
[‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__doc__’, ‘__eq__’, ‘__format__’,
‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__le__’,
...часть строк опущена...
‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’,
‘giveRaise’, ‘job’, ‘lastName’, ‘name’, ‘pay’]
6. __doc__
ОтветитьУдалить""" строки в тройных кавычках во всех модулях, классах, методах"""
Интерпретатор автоматически помещает строки документирования в атрибут
__doc__ соответствующего объекта.
Самое важное в протоколе документирования заключается в том, что ваши
Удалитькомментарии становятся доступны для просмотра в виде атрибутов __doc__
после того, как файл будет импортирован. Поэтому, чтобы отобразить строки
документирования, связанные с модулем и его объектами, достаточно просто
импортировать файл и вывести значения их атрибутов __doc__, где интерпре-
татор сохраняет текст:
>>> import docstrings
16
function documentation
can we have your liver then?
>>> print(docstrings.__doc__)
Module documentation
Words Go Here
>>> print(docstrings.square.__doc__)
function documentation
Не надо забывать про генератор документации
ОтветитьУдалитьPyDoc: отчеты в формате HTML
>>> import builtins
ОтветитьУдалить>>> dir(builtins)
[‘ArithmeticError’, ‘AssertionError’, ‘AttributeError’, ‘BaseException’,
‘BufferError’, ‘BytesWarning’, ‘DeprecationWarning’, ‘EOFError’, ‘Ellipsis’,
...множество других имен опущено...
‘print’, ‘property’, ‘quit’, ‘range’, ‘repr’, ‘reversed’, ‘round’, ‘set’,
‘setattr’, ‘slice’, ‘sorted’, ‘staticmethod’, ‘str’, ‘sum’, ‘super’, ‘tuple’,
‘type’, ‘vars’, ‘zip’]
Имена в этом списке составляют встроенную область видимости языка Python.
Примерно первая половина списка – это встроенные исключения, а вторая –
встроенные функции. Согласно правилу LEGB интерпретатор выполняет по-
иск имен в этом модуле в последнюю очередь. Все имена из этого списка вы
получаете в свое распоряжение по умолчанию, то есть чтобы их использовать,
не требуется импортировать какие-либо модули.
Примечание, касающееся различий между версиями: Умолчать об этом нельзя. Модуль builtins, упоминающийся здесь, в версии
УдалитьPython 2.6 называется __builtin__.
Замечу, что в большинстве глобальных областей видимости (включая и интерактивный сеанс) присутствует имя __builtins__ (с символом «s» на конце),
ссылающееся на модуль builtins (он же __builtin__ в 2.6).
Если в версии 3.0 импортировать модуль builtins, выражение __builtins__ is builtins вернет True,
а в версии 2.6 значение True вернет выражение __builtins__ is __builtin__.
Отсюда следует, что мы можем исследовать встроенную область видимости с помощью вызова функции
dir(__builtins__)
в обеих версиях, 3.0 и 2.6, не импортируя модуль.
Однако в действующих программах для версии 3.0 рекомендуется все-таки использовать модульbuiltins.
Кто сказал, что описать эту особенность было легко?
Когда мы создаем экземпляр подкласса, он начинает свое существование с пустым словарем пространства имен, но имеет ссылку на класс, стоящий выше
ОтветитьУдалитьв дереве наследования. Фактически дерево наследования доступно в виде специальных атрибутов, которые вы можете проверить.
Экземпляры обладают атрибутом
__class__,
который ссылается на класс, а классы имеют атрибут
__bases__,
который является кортежем, содержащим ссылки на суперклассы выше в дереве наследования
(я выполнял этот пример в Python 3.0 – в вер-
сии 2.6 формат вывода и имена некоторых внутренних атрибутов немного отличаются):
>>> X = sub()
>>> X.__dict__ # Словарь пространства имен экземпляра
{}
>>> X.__class__ # Класс экземпляра
>>> sub.__bases__ # Суперклассы данного класса
(,)
>>> super.__bases__ # В Python 2.6 возвращает пустой кортеж ()
(,)
В предыдущем разделе были представлены специальные атрибуты экземпляра и класса
Удалить__class__ и __bases__,
но не объяснялось, зачем они могут понадобиться. В двух словах, эти атрибуты позволяют осматривать иерархии наследования в вашем программном коде.
Так как атрибуты фактически являются ключами словаря, существует два способа получать и изменять их значения – по квалифицированным именамили индексированием по ключу:
ОтветитьУдалить>>> X.data1, X.__dict__[‘data1’]
(‘spam’, ‘spam’)
>>> X.data3 = ‘toast’
>>> X.__dict__
{‘data1’: ‘spam’, ‘data3’: ‘toast’, ‘data2’: ‘eggs’}
>>> X.__dict__[‘data3’] = ‘ham’
>>> X.data3
‘ham’
Однако такая эквивалентность применяется только к атрибутам, фактически присоединенным к экземпляру.
УдалитьТак как обращение по квалифицированному имени также вызывает запуск процедуры поиска в дереве наследования, такой способ может обеспечить доступ к атрибутам, которые нельзя получить индексированием словаря.
Например, унаследованный атрибут
X.hello
недоступен через выражение
X.__dict__[‘hello’]
(Лутц стр.787)
Кроме того, вы должны знать о возможности возникновения в программах непреднамеренной рекурсии. Как будет показано ниже в этой книге, некоторые
ОтветитьУдалитьметоды перегрузки операторов в классах, такие как
__setattr__ и __getattribute__,
при неправильном использовании могут приводить к рекурсии.
Рекурсия – это мощный инструмент, но ее лучше использовать только тогда, когда без нее невозможно обойтись!
Благодаря этому все следующие выражения представляют один и тот же атрибут и объект:
ОтветитьУдалитьM.name # Полное имя объекта
M.__dict__[‘name’] # Доступ с использованием словаря пространства имен
sys.modules[‘M’].name # Доступ через таблицу загруженных модулей
getattr(M, ‘name’) # Доступ с помощью встроенной функции