2010-10-18 5 views
8

tengo clases de Python con atributos de los objetos que sólo se declara como parte de la ejecución del constructor, así:¿Cómo puedo hacer que los atributos del objeto de documento de Python/Sphinx solo se declaren en __init__?

class Foo(object): 
    def __init__(self, base): 
     self.basepath = base 

     temp = [] 
     for run in os.listdir(self.basepath): 
      if self.foo(run): 
       temp.append(run) 
     self.availableruns = tuple(sorted(temp)) 

Si ahora el uso de cualquiera help(Foo) o intento de documentar Foo en Sphinx, los self.basepath y self.availableruns atributos son no mostrada. Ese es un problema para los usuarios de nuestra API.

He intentado buscar una forma estándar de asegurar que estos atributos "dinámicamente declarados" puedan ser encontrados (y preferiblemente docstring'd) por el analizador, pero hasta ahora no hay suerte. ¿Alguna sugerencia? Gracias.

Respuesta

2

se puede definir una variable de clase con el mismo nombre que la variable de instancia. Esa variable de clase será sombreada por la variable de instancia cuando la establezca. Por ejemplo:

class Foo(object): 
    #: Doc comment for availableruns 
    availableruns =() 

    def __init__(self, base): 
     ... 
     self.availableruns = tuple(sorted(temp)) 

De hecho, si la variable de instancia tiene un inmutable valor útil por defecto (por ejemplo Ninguno o la tupla vacío), entonces usted puede ahorrar un poco de memoria por no establecer la variable si debe tener su defecto valor. Por supuesto, este enfoque no funcionará si está hablando de una variable de instancia que podría querer eliminar (por ejemplo, del foo.availableruns), pero creo que no es un caso muy común.

Si está utilizando sphinx y tiene configurado "autoattribute", esto debería documentarse adecuadamente. O bien, dependiendo del contexto de lo que esté haciendo, puede usar directamente la directiva Sphinx .. py:attribute::.

8

He intentado buscar una forma estándar para asegurar que estos atributos "dinámicamente declarados" puedan ser encontrados (y preferiblemente docstring'd) por el analizador, pero hasta ahora no hay suerte. ¿Alguna sugerencia?

No pueden ser "detectados" por ningún analizador.

Python tiene setattr. El conjunto completo de atributos nunca es "detectable", en ningún sentido de la palabra.

Usted absolutamente debe describirlos en el docstring.

[A menos que desee hacer un montón de meta-programación para generar documentos de las cosas que ha recopilado de inspect o algo así. Incluso entonces, su "solución" no estaría completo tan pronto como empezar a usar setattr.]

class Foo(object): 
    """ 
    :ivar basepath: 
    :ivar availableruns: 
    """ 
    def __init__(self, base): 
+0

Gracias. Sí, aprecio que los atributos no sean computables en general, simplemente no estaba seguro de si había una heurística para obtener algunos de los declarados de forma simple/estándar, por ejemplo, exploración de fuente en lugar de inspección de objeto de clase. O modificando el código para declarar estos atributos como propiedades para que Sphinx/help los "encuentre". Pero, de todos modos, ese puntero a la sintaxis de Sphinx para declarar su existencia para fines de doc va a estar bien: ¡salud! – andybuckley

+0

"¿O modificando el código para declarar estos atributos como propiedades"? "declarar" no es un concepto de Python. El uso de las funciones del método de propiedades para sus atributos funcionará si va a hacer que los miembros se documenten automáticamente. Parece más ** trabajo ** que simplemente documentarlos en la carpeta de documentos. –

+0

Pero significaría que se documentan en igualdad de condiciones con otros métodos, lo que creo que mejora significativamente la calidad de la documentación.Estoy dispuesto a poner un poco más de trabajo para eso, si no tiene éxito en el rendimiento o hace que el código sea impenetrable. Ese fue el punto de la pregunta inicial: estoy seguro de que puedo encontrar una manera de hacerlo, pero me preguntaba si existe un enfoque estándar (de facto) que minimice los inconvenientes. – andybuckley

Cuestiones relacionadas