2012-01-31 5 views
2

Возможно ли разобрать докстроны уровня модуля с AST?Parsing Python Module Docstrings

Я работаю над документатором python here и, посещая модульные маркеры и захватывая документацию, не уступает docstring модуля. До сих пор мне приходилось прибегать к импорту модуля и захвату его __doc__ или с использованием inspect, чтобы получить документацию.

Я заглянул в источник информации о том, как другие документалисты разбирают докстры, и обнаружил, что pydoc заканчивается тем, что должен делать в основном то же самое, что и мой документатор, чтобы захватить строки уровня модуля.

Я что-то упустил? Единственный способ разобрать docstrings на уровне модуля, фактически импортируя модуль, или можно ли напрямую разбирать docstrings из AST?

ответ

4

Возможно, я пропустил понимание вопроса, но разве вы не можете это сделать (python 2.7.1)?

тестовый файл:

""" 
DOC STRING!! 
""" 

def hello(): 
    'doc string' 
    print 'hello' 

hello() 

Интерактивная сессия:.

>>> M = ast.parse(''.join(open('test.py'))) 
>>> ast.get_docstring(M) 
'DOC STRING!!' 

Вы также можете пройти через аст, ищет слот струна док будет в

>>> M._fields 
('body',) 
>>> M.body 
[<_ast.Expr object at 0x10e5ac710>, <_ast.FunctionDef object at 0x10e5ac790>, <_ast.Expr object at 0x10e5ac910>] 
>>> # doc would be in the first slot 
>>> M.body[0]._fields 
('value',) 
>>> M.body[0].value 
<_ast.Str object at 0x10e5ac750> 
>>> # it contains a string object, so maybe it's the doc string 
>>> M.body[0].value._fields 
('s',) 
>>> M.body[0].value.s 
'\nDOC STRING!!\n' 
+0

О круто! Если я правильно понимаю, это должно быть инструментом для примеров 'eval' в' __doc__' против того, что сам модуль производит? – Droogans

+0

Вот и все! Я использовал класс 'NodeVisitor' и' ast.get_docstring (node) '. Запуск его на модуле не работал. Я думал, что другие документаторы, такие как 'pydoc', могут делать что-то другое, но в конечном итоге используют' inspect'. Большое спасибо! – mvanveen

+0

@Droogans: Я думаю, что модуль, который вы ищете, является 'doctest' (' python -m doctest -v mymodule.py'). Это больше о том, как получить строку документа без импорта модуля (импортирование модуля запускает его, и это может иметь побочные эффекты) или разбор текста самостоятельно (есть сборка в парсере python, используйте его). – mdaoust

Смежные вопросы