Преобразование Python 3 в простой Python, который может быть прочитан autodoc

Я написал программу на Python 3 и использую Sphinx для ее документирования. Autodoc Sphinx великолепен, однако он работает только с Python 2. Некоторые модули прекрасно работают в autodoc, а модули — нет. Некоторые примеры: Python 2 жалуется на метаклассы в стиле Python 3 и некоторые модули, которые больше не существуют в Python 2, такие как configparser. Это раздражает, так как он не может импортировать строки документации из этого файла.

Я не хочу переписывать всю программу на Python 2, но хочу использовать autodoc.

Одной из моих идей была небольшая программа, которая читала каждый файл Python и удаляла всю функциональность, но просто оставляла основные функции и классы с их строками документации (поскольку autodoc импортирует каждый модуль и считывает строку документации конкретной функции или класса).

import configparser
import os

class TestClass:
    """
    I am a class docstring.
    """
    def method(self, argument):
        """
        I am a method docstring.
        """
        #Some code here
        print(os.getcwd())

def TestFunction():
    """
    I am a function docstring.
    """
    #Some more useless code here
    return os.path.join("foo", "bar")

в...

class TestClass:
    """
    I am a class docstring.
    """
    def method(self, argument):
        """
        I am a method docstring.
        """
        pass

def TestFunction():
    """
    I am a function docstring.
    """
    pass

Таким образом, обработанный код может быть прочитан autodoc, но при этом будут сохранены строки документации, что мне действительно нужно. Это лучший способ сделать это, и есть ли у кого-нибудь какие-либо предложения относительно того, как написать небольшую программу, которая преобразует код.

Я могу очень легко решить проблему метакласса с помощью некоторых регулярных выражений, но я борюсь с остальными.

m = re.search("\(metaclass=.*\)", file_content)
if m:
    file_content = "".join(file_content[:m.start()], file_content[m.end():])

Будет ли полезен модуль ast?

Спасибо.


person Giacomo    schedule 09.04.2011    source источник


Ответы (3)


Вы можете просто установить разрабатываемую версию sphinx, которая поддерживает python 3.

pip-3.2 install hg+https://bitbucket.org/birkenfeld/sphinx

Я протестировал функцию автодокументации в вашем классе, и она сработала.

person Florin Cartarescu    schedule 11.04.2011

Что, как правило, является решением, так это разбрызгивание предложений try/except в вашем коде.

Python 2.6 имеет configparser, но он известен как ConfigParser (python 3 изменил имена в верблюжьем регистре на все строчные буквы)

так что-то вроде:

try:
  import configparser
except ImportError:
  #we are in 2.x
  import ConfigParser as configparser

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

person Mike Ramirez    schedule 09.04.2011
comment
Правда, это сработает... но я действительно не хочу просматривать весь свой код только для того, чтобы решить проблему с автодоком. Это эффективно портирует мою программу как на Python 2, так и на Python 3! Что мне действительно нужно, так это небольшой (надеюсь!) скрипт для преобразования кода в форму, которую Autodoc сможет без проблем импортировать. Спасибо, в любом случае. - person Giacomo; 09.04.2011
comment
Две вещи, ответ Пола, вероятно, то, что нужно, создание версии только для Python 3 ограничивает использование вашего приложения. Не все используют Python 3, так как некоторые библиотеки еще не портированы. Пока Python 3 не станет более массовым, написание совместимого кода между 2.x и 3.x будет наиболее оптимальным решением. - person Mike Ramirez; 10.04.2011

Существует библиотека 3to2, которая может преобразовывать код Python 3 в python 2. Вы можете попробовать это в сочетании с Сфинкс.

person Community    schedule 09.04.2011