Python establece la cadena de documentación y obtiene el nombre del método del método de clase generado dinámicamente

Intento obtener / establecer el nombre y la cadena de documentación de los métodos de clase creados dinámicamente de la siguiente manera, pero tengo problemas para averiguar exactamente cómo hacerlo:

import sys import inspect class test(object): pass @classmethod def genericFunc(cls, **kwargs): print "function:", (inspect.stack()[0][3]) print "kwargs:", kwargs function_list = ['myF1', 'myF2'] for func in function_list: setattr(test, func, genericFunc) #set docstring for func here? if __name__ == '__main__': x = test() print "docstring:", x.myF1.__doc__ x.myF1(arg1="foo") y = test() print "docstring:", y.myF2.__doc__ y.myF2(arg1="foo", arg2="bar") sys.exit() 

Actualmente la salida es:

 docstring: None function: genericFunc kwargs: {'arg1': 'foo'} docstring: None function: genericFunc kwargs: {'arg1': 'foo', 'arg2': 'bar'} 

Lo que me gustaría tener es:

 docstring: description of myF1 function: myF1 kwargs: {'arg1': 'foo'} docstring: description of myF2 function: myF2 kwargs: {'arg1': 'foo', 'arg2': 'bar'} 

En el bucle for intenté hacer setattr(test.func, "__doc__", "description of %s" % func) , lo que resultó en una excepción AttributeError (el objeto tipo ‘test’ no tiene atributo ‘func’), y si código duro ‘test.myF1’ en lugar de ‘test.func’ Recibo un AttributeError para el atributo '__doc__' de ‘instancemethod’ que no se puede escribir.

Finalmente, inspect.stack () devuelve “genericFunc” en lugar de un nombre de función dynamic (‘myF1’ o ‘myF2’), es posible obtener / configurar este último para que pueda verificar el valor del __name__ del método dentro de genericFunc ¿Para realizar ciertas acciones en función de su valor?

Su función genérica en sí no tiene una cadena de documentación. Esto funciona bien para mí cuando agrego un docstring:

  import inspect class test(object): pass @classmethod def genericFunc(cls, **kwargs): """ I'm a docstring""" print "function:", (inspect.stack()[0][3]) print "kwargs:", kwargs function_list = ['myF1', 'myF2'] for func in function_list: setattr(test, func, genericFunc) #set docstring for func here? if __name__ == '__main__': x = test() print "docstring:", x.myF1.__doc__ x.myF1(arg1="foo") y = test() print "docstring:", y.myF2.__doc__ y.myF2(arg1="foo", arg2="bar") 

Además, ¿por qué sys.exit () al final? Como resultado, obtengo:

 docstring: I'm a docstring function: genericFunc kwargs: {'arg1': 'foo'} docstring: I'm a docstring function: genericFunc kwargs: {'arg1': 'foo', 'arg2': 'bar'}