LINUX.ORG.RU
ФорумJob

Попатчить Sphinx-dос за 5 000 рублей

 , ,


0

2

Братцы-питонщики! В вам обращаюсь я, друзья мои.

Надо попатчить Sphinx-doс. Чтобы тот в сигнатурах методов и функций не раскрывал значения аргументов по умолчанию, а писал их так же, как есть.

Например, есть у меня вот такая сигнатура. Вполне понятная, ко вставке в документацию пригодная.

def mega_method(freq=1e10, prop_speed=scipy.constants.c)

Sphinx её раскроет во что-то такое:

def mega_method(freq=10000000000., prop_speed=299792458.)

Так жить нельзя: если аргументов не два, а 5-7, то сигнатура становится совсем нечитаемой.

Надо сделать так, чтобы в conf.py можно было вставить ещё одну настройку: раскрывать сигнатуры — или таки оставить их как есть.


P.S. Если считаете, что мало — пишите, торг уместен.

Yak
() автор топика

Что-то как-то напряжно: там сигнатура функции через inspect.getargspec дергается и то что вы хотите это наверно inspect.getsource и парсить самому, нетривиальненько. На github у sphinx-doc есть issue с такой хотелкой и низким приоритетом.

import scipy.constants
import inspect

def mega_method(freq=1e10, prop_speed=scipy.constants.c):
    pass

inspect.getsource(mega_method)
Out[11]: u'def mega_method(freq=1e10, prop_speed=scipy.constants.c):\n    pass\n'

inspect.getargspec(mega_method)
Out[12]: ArgSpec(args=['freq', 'prop_speed'], varargs=None, keywords=None, defaults=(10000000000.0, 299792458.0))
hizel ★★★★★
()
Ответ на: комментарий от hizel

Так это наша хотелка и есть.

А где там вызывается inspect.getargspec? Просто мы так и не нашли того места, где Sphinx генерит путь к питоньему файлу и пытается его попарсить.

Yak
() автор топика
Ответ на: комментарий от Yak

Вы точно пистонисты? Он не генерит какой-то там путь. Он импортирует как обычная пистон-программа ваши модули. https://github.com/sphinx-doc/sphinx/blob/master/sphinx/ext/autodoc.py#L1049

Еще добавление к sphinx-build параметра -vvv добавляет понимания.

hizel ★★★★★
()

По идее, там на 84-ю строку в util/inspect.py надо воткнуть что-то, что сделает func_defaults равным массиву необработанных дефолтных значений:

https://github.com/sphinx-doc/sphinx/blob/master/sphinx/util/inspect.py#L84

Аргументы можно попробовать получить из исходника, который берётся из inspect.getsource(func.func_code), но нужно парсить, а это не совсем тривиально в случае сложных аргументов (лямбды там, функции и т.д.).

risenshnobel ★★★
()
Последнее исправление: risenshnobel (всего исправлений: 1)

В вашем случае нужно либо закрыть задачу https://github.com/sphinx-doc/sphinx/issues/759, скорее всего добавив опцию в конфиг и разбор аргументов через getsource (как уже советовалось). Либо наследовать директивы, переопределять методы, переписывать sphinx'совский getargspec и пользоваться своим принципиально новым

.. myautofunction::

uralbash
()
Ответ на: комментарий от hizel

парсить самому, нетривиальненько.

>>> node = ast.parse("def mega_method(freq=1e10, prop_speed=scipy.constants.c):\
n    pass\n")
>>> print node
<_ast.Module object at 0x0000000002546908>
>>> ast.dump(node)
"Module(body=[FunctionDef(name='mega_method', args=arguments(args=[Name(id='freq
', ctx=Param()), Name(id='prop_speed', ctx=Param())], vararg=None, kwarg=None, d
efaults=[Num(n=10000000000.0), Attribute(value=Attribute(value=Name(id='scipy',
ctx=Load()), attr='constants', ctx=Load()), attr='c', ctx=Load())]), body=[Pass(
)], decorator_list=[])])"
Deleted
()
Ответ на: комментарий от Yak

Почему это? Вторая не тронута. Вывод первой - вопрос форматирования чисел.

Deleted
()
Ответ на: комментарий от hizel

Как временное решение это прокатит. Но копировать код лишний раз очень, очень неохота. Да и сигнатуры временами меняются, и не каждый раз наши разработчики будут успевать поправить докстринги.

Yak
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.