перекрестная ссылка на функцию/класс в другом подмодуле

В качестве простого примера, в следующем коде 2 подмодуля (a.py и b.py в одном каталоге). Ссылка на ту же функцию подмодуля :func:`hook` работает, но не работает ссылка на другой модуль, т.е. :func:`foo`. Я также пробовал синтаксис :func:`.a.foo` - все равно не работает. Как сделать перекрестную ссылку на a.foo()?

# script a.py
def foo():
    '''foo func'''

# script b.py
def hook():
    '''hook func'''

def spam():
    '''spam func.
    :func:`foo`
    :func:`hook`
'''

person RNA    schedule 07.10.2017    source источник
comment
Я думаю, вы близки. Попробуйте поиграться с пунктирным путем Python. Возможно :func:`a.foo` или :func:`parent.a.foo`?   -  person Steve Piercy    schedule 08.10.2017


Ответы (1)


Как описано в документах:

Обычно имена в этих ролях сначала ищутся без какой-либо дополнительной квалификации, затем с добавлением текущего имени модуля, затем с добавлением текущего модуля и имени класса (если есть). Если поставить перед именем точку, порядок будет обратным.

В этом случае :func:`.a.foo` означает объект с именем a внутри модуля b. Он будет искать функцию b.a.foo.

Вы должны попробовать :func:`..a.foo`, который будет указывать на b..a.foo, или просто a.foo (не могу сейчас проверить это локально, извините, но я помню, что использовал этот синтаксис раньше).

Но обратите внимание, что a.py и b.py должны быть модулями, то есть импортируемыми под своим именем. Если это просто скрипты, расположенные не в пакете (никаких __init__.py файлов до корня проекта), нет возможности перекрестно ссылаться на эти роли.

Вы можете попробовать использовать :any: роль — :any:`foo` — и надеемся, что он найдет объект в общем индексе описываемых объектов.

person Sergey Vasilyev    schedule 09.10.2017