Конвертировать Python 3 в «простой» python, который может быть прочитан autodoc - PullRequest
2 голосов
/ 09 апреля 2011

Я написал программу на 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 ?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

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

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

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

1 голос
/ 09 апреля 2011

Решение, как правило, заключается в добавлении в ваш код выражений try / кроме.

В Python 2.6 есть configparser, но он называется ConfigParser (python 3 изменил имена верблюдов на все строчные)

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

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

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

0 голосов
/ 09 апреля 2011

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

...