Двоеточия в строковом литерале restructuredText

Как сделать строковый литерал с двоеточием в restructuredText?

Я пытаюсь задокументировать функцию Python, которая возвращает словарь, например, что-то вроде:

def function(...):
    """
    ...
    Returns:
        A dictionary mapping ``{id: {role: value}}``
    """

Но когда я компилирую с помощью Sphinx, он жалуется:

WARNING: Inline literal start-string without end-string.

Литеральная конечная строка определенно присутствует, и она, похоже, не нарушает другие правила форматирования, но я не могу заставить его правильно отображать литерал с двоеточиями (фигурные скобки не являются проблемой; one: two также проблематично внутри встроенного литерала). Побег не помогает:

""" ``one\: two`` """   --> WARNING
""" ``one\\: two`` """  --> WARNING
r""" ``one\: two`` """  --> WARNING

Единственное, что кажется работающим, - это роль :code::

""" :code:`{one: {two: three}}` """  --> OK

Это ограничение Сфинкса? Или ошибка с документами? Или есть способ получить двоеточия внутри встроенных литералов?


person goodmami    schedule 13.06.2018    source источник
comment
Ваш пример работает для меня в Sphinx 1.7.5. Проверьте свою версию.   -  person Steve Piercy    schedule 14.06.2018
comment
У меня Sphinx 1.7.5 и документация 0.14. Если я запускаю один и тот же файл дважды подряд, предупреждения не печатаются во второй раз, но вывод все равно будет некорректным. Вы проверили, отображается ли вся буквальная строка, а не только до первого двоеточия?   -  person goodmami    schedule 14.06.2018
comment
@StevePiercy Я замечаю, что получаю ошибку только для строк документации, загружаемых autodoc, а не если я помещаю встроенный литерал непосредственно в файл .rst. Может тогда мешает автодок?   -  person goodmami    schedule 14.06.2018
comment
Я пробовал это как в файле .rst, так и в строке документации модуля, использующего autodoc, оба раза успешно. Возможно, вы не редактируете файл, который вам кажется?   -  person Steve Piercy    schedule 14.06.2018
comment
Думаю, я нашел проблему. Похоже, это связано с использованием расширения наполеона. См. github.com/sphinx-doc/sphinx/issues/4016 и github.com/sphinx-doc/sphinx/issues/4021. Все еще расследует.   -  person goodmami    schedule 14.06.2018


Ответы (1)


Такое поведение не связано с внутренними ограничениями Sphinx, restructuredText или autodoc, а на самом деле является ошибкой в ​​(текущей версии) расширения Napoleon для обработки строк документации в стиле Google. Наполеон использует регулярное выражение для разделения содержимого на двоеточие и жадно потребляет символы, пока не достигнет двоеточия. Причина, по которой он работает с ролью :code:, заключается в том, что Napoleon обнаруживает их до разделения, но не обнаруживает встроенное форматирование (обратите внимание, что проблема также возникает с другими шаблонами встроенного форматирования, такими как *emphasis* или **strong**). Один из способов обойти ошибку, пока она не будет исправлена, - поставить двоеточие перед встроенным литералом:

def function(a, b):
    """Put *a* and *b* in a dictionary.

    Returns:
        dict: ``{a: b}``
    """
    return {a: b}
person goodmami    schedule 14.06.2018