2010-03-19 10 views
6

He escrito un convertidor de etiquetas epytext a reST, y ahora quiero convertir todas las cadenas de documentos de toda la biblioteca de formato epytext a formato REST.Reemplazo de las cadenas de python

¿Existe alguna manera inteligente de leer todas las cadenas de documentos en un módulo y escribir de nuevo las sustituciones?

ps: ast módulo quizás?

Respuesta

0

Probablemente el más sencillo solo para hacerlo a la antigua. Aquí hay un código inicial para que empieces. Probablemente podría ser más bonita, sino que debe dar la idea básica:

def is_docstr_bound(line): 
    return "'''" in line or '"""' in line 

# XXX: output using the same name to some other folder 
output = open('output.py', 'w') 

docstr_found = False 
docstr = list() 
with open('input.py') as f: 
    for line in f.readlines(): 
     if docstr_found: 
      if is_docstr_bound(line): 
       # XXX: do conversion now 
       # ... 

       # and write to output 
       output.write(''.join(docstr)) 

       output.write(line) 

       docstr = list() 
       docstr_found = False 
      else: 
       docstr.append(line) 
     else: 
      if is_docstr_bound(line): 
       docstr_found = True 

      output.write(line) 

output.close() 

para que sea realmente funcional que necesita para conectarlo con un buscador de archivos y la salida de los archivos a otro directorio. Consulte el módulo os.path para referencia.

Sé que la verificación vinculada a docstring es potencialmente muy débil. Probablemente sea una buena idea reforzarlo un poco (línea de tira y verificar si comienza o termina con un límite de docstring).

Afortunadamente eso da una idea de cómo proceder. Tal vez haya una forma más elegante de manejar el problema. :)

+0

Caminar Trough mi estructura de directorios y de apertura/lectura/escritura de archivos es trivial. Mi pregunta es: ¿hay alguna manera inteligente de leer todas las cadenas de documentos en un módulo y escribir las sustituciones? Esto no se puede hacer ingenuamente con mecanismos como expresiones regulares (como re.finditer ('\ "\" \ "(. *) \" \ "\"', Fuente)), porque no quiero estropear el resto del código – tomaz

+2

Encontré una pregunta similar que podría interesarte. Consulte http://stackoverflow.com/questions/768634/python-parse-a-py-file-read-the-ast-modify-it-then-write-back-the-modified. –

+1

No se requiere que las cadenas de texto tengan cadenas de comillas triples, y no todo lo que se cita con una cadena de comillas triples es una cadena de documentos, por lo que esto solo funciona para un subconjunto de cadenas de documentos de Python. – jcdyer

0

Me pregunto acerca de una combinación de introspección y procesamiento de fuente. He aquí algunos pseudocódigo no probado:

import foo #where foo is your module 

with open('foo.py',r) as f: 
    src = f.readlines() 

for pything in dir(foo): #probably better ways to do this... 
    try: 
     docstring = pything.__doc__ 
    except AttributeError: 
     #no docstring here 
     pass 

    #modify the docstring 
    new_docstring = my_format_changer(docstring) 

    #now replace it in the source 
    src = src.replace(docstring, new_docstring) 

#When done, write it out 
with open('new_foo.py','w') as fout: 
    fout.write(src) 

Es evidente que tendría que poner un poco de inteligencia en el código que atraviesa el módulo en busca de objetos que tienen cadenas de documentación por lo que son recursivos, pero esto le da la idea general.

2

Podría ser una exageración para este uso simple, pero consideraría usar la maquinaria de 2to3 para hacer la edición. Solo necesita escribir un solucionador personalizado. No está bien documentado, pero Guía del desarrollador de Python 3.0: Python 2.6 y migración de 2 a 3: More about 2to3 y Implement Custom Fixers da detalles suficientes para empezar ...

Epydoc parece contener un método to_rst() lo que podría ayudar en realidad traduces los documentos. No sé si es bueno ...

4

Pyment es una herramienta que puede convertir cadenas de Python y crear esqueletos que faltan. Puede gestionar Google, Epydoc (estilo javadoc), Numpydoc, reStructuredText (descanso, por defecto) Sphinx formatos cadena de documentación.

Acepta un solo archivo o una carpeta (explorando también las subcarpetas). Para cada archivo, reconocerá cada formato de docstring y lo convertirá al formato deseado. Al final, se generará un parche para aplicar al archivo.

para convertir su proyecto:

  • instalación Pyment

Escriba el siguiente (se puede utilizar un virtualenv):

$ git clone https://github.com/dadadel/pyment.git 
$ cd pyment 
$ python setup.py install 
  • convertido del Epydoc a Sphinx

Puede convertir su proyecto en formato Sphinx (reposo), que es el formato de salida predeterminado, haciendo:

$ pyment /my/folder/project 
Cuestiones relacionadas