2012-02-03 7 views
5

Tengo que personalizar __getattr__ para llamar a otra función para leer.doc for __getattr__ atributos definidos

Esto funciona bien, excepto que la ayuda (object.attr) no funciona. Este código se usa en un entorno interactivo, por lo que la ayuda() se vuelve importante para nosotros.

¿Hay un mejor diseño para lograr las mismas características pero con la ayuda() funcionando bien?

Respuesta

1

El texto que se usa para "ayuda" es de hecho el atributo "__doc__" de un objeto. La cuestión es que, dependiendo del objeto que tenga, simplemente no puede establecer el atributo __doc__ en él.

Si lo que necesita es "help(object.attr)" para trabajar (y no es que help(object) que muestra todos los atributos posibles) que es un poco más fácil - sólo se debe conseguir que todo lo Shure __getattr__ retornos no hae una cadena de documentación establecido correctamente.

ya que "no está funcionando" supongo que va a devolver los resultados internos de alguna llamada de función, como en este fragmento:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an integer 
     return foo() 
    ... 

Si sólo tendría que devolver la función "foo" en sí, sin llamarlo, itś docstring se mostraría normalmente.

Lo que se puede hacer es envolver el valor de retorno en __getattr__ como un objeto de un wich clase creada dinámicamente contiene una cadena de documentación adecuada -, intente utilizar más somethong así:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an (whatever object) 
     result = foo() 
     res_type = type(result) 
     wrapper_dict = res_type.__dict__.copy() 
     wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>") 
     new_type = type(res_type.__name__, (res_type,), wrapper_dict) 
     # I will leave it as an "exercise for the reader" if the 
     # constructor of the returned object can't take an object 
     # of the same instance (python native data types, like int, float, list, can) 
     new_result = new_type(result) 
    elif ...: 
     ... 
    return new_result 

Esto debería funcionar - a menos Me equivoqué con el motivo por el que hel no funciona en primer lugar. Si ese es el caso, por favor, den un ejemplo de lo que está devolviendo al __getattr__.

+0

Thannks, funciona en mi caso. All attr in __getattr__ devuelve tipos de datos nativos de python. –

1

Puede convertir el atributo en una propiedad. La propiedad usará automáticamente la cadena de documentos del método getter como propia. Alternativamente, puede proporcionar el argumento doc al property().

+0

Dentro de __getattr__ hay una llamada de función que utiliza attr como parámetro. ¿Es posible con property()? Este atributo es dinámico, desconocido en la creación del objeto. –

Cuestiones relacionadas