2011-05-09 13 views
8

Ayudo a mantener un paquete para python llamado nxt-python. Utiliza metaclases para definir los métodos de un objeto de control. Aquí está el método que define las funciones disponibles:Establecer explícitamente docstring de un método

class _Meta(type): 
    'Metaclass which adds one method for each telegram opcode' 

    def __init__(cls, name, bases, dict): 
     super(_Meta, cls).__init__(name, bases, dict) 
     for opcode in OPCODES: 
      poll_func, parse_func = OPCODES[opcode] 
      m = _make_poller(opcode, poll_func, parse_func) 
      setattr(cls, poll_func.__name__, m) 

Quiero ser capaz de añadir una cadena de documentación diferente a cada uno de estos métodos que se añade. m es un método devuelto por _make_poller(). ¿Algunas ideas? ¿Hay alguna forma de evitar la restricción de python al cambiar las cadenas de documentos?

+0

También puede pasarlo a su constructor de '_Meta' en el' dict' argumento como '_Meta (CLS, nombre, bases, dict = { '__ doc __': "" "cadena de documentación" ""})' o llame a 'dict.update ({'__ doc __':" "" docstring "" "})' antes de su llamada 'super'. Ahora tienes al menos 4 opciones. –

Respuesta

16

Para las funciones de civil:

def f(): # for demonstration 
    pass 

f.__doc__ = "Docstring!" 
help(f) 

Esto funciona tanto en python2 y python3, en funciones con y sin docstrings definidos. También puede hacer +=. Tenga en cuenta que es __doc__ y no __docs__.

Para los métodos, es necesario utilizar el atributo __func__ del método:

class MyClass(object): 

    def myMethod(self): 
     pass 

MyClass.myMethod.__func__.__doc__ = "A really cool method" 
+0

oh. Intenté esto y no funcionó. Intentaré de nuevo. –

+0

¡Intenté esto y funciona perfectamente! Muchas gracias! –

+4

Intenté esto con un método de clase y obtuve un error. Resulta que en un método de clase, que creo que es lo que quiere la pregunta original, querrá hacer: self.method .__ func __.__ doc__ – noisygecko

2

También se puede utilizar en la setattr/objeto de función de clase y establecer la cadena de documentación.

setattr(foo,'__doc__',"""My Doc string""") 
Cuestiones relacionadas