Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
241 views
in Technique[技术] by (71.8m points)

python - Sphinx cross referencing breaks for inherited objects imported and documented in a parent module

I'm trying to get my Sphinx documentation build correctly and have cross-references (including those from inherited relations) work right.

In my project, I have a situation which is depicted in the example below, which I replicated for convenience on this github repo:

$ tree .
.
├── a
│?? ├── b
│?? │?? └── __init__.py
│?? └── __init__.py
├── conf.py
├── index.rst
└── README.md

In a.b.__init__, I declare classes A and B. B inherits from A. In a.__init__, I import A and B like: from .b import A, B. The reason I do this in my real projects is to reduce the import paths on modules while keeping implementation of specific classes in separate files.

Then, in my rst files, I autodoc module a with .. automodule:: a. Because a.b is just an auxiliary module, I don't autodoc it since I don't want to get repeated references to the same classes and not to confuse the user on what they should be really doing. I also set show-inheritance expecting a.B will have a back link to a.A.

If I try to sphinx-build this in nit-picky mode, I'll get the following warning:

WARNING: py:class reference target not found: a.b.A

If I look at the generated documentation for class B, then I verify it is not properly linked against class A, which just confirms the warning above.

Question: how do I fix this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Sphinx uses the value of the __module__ attribute to figure out the name of the module in which a class/function/method was defined (see https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy). Sometimes this is not what you want in the documentation.

The attribute is writable. Your problem can be fixed by adding this line in a/__init__.py:

A.__module__ = "a"

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...