No puede hacer lo que está buscando hacer, en la forma en que desea hacerlo.
Desde su descripción parece que se podría hacer algo como esto:
for tool in find_tools():
def __tool(*arg):
validate_args(tool, args)
return execute_tool(tool, args)
__tool.__name__ = tool.name
__tool.__doc__ = compile_docstring(tool)
setattr(module, tool.name, __tool)
es decir, crear la cadena de documentación de forma dinámica por adelantado cuando se crea la función. ¿Es la razón por la cual la docstring tiene que ser dinámica desde una llamada a __doc__
a la siguiente?
Suponiendo que existe, tendrás que ajustar tu función en una clase, usando __call__
para desencadenar la acción.
Pero incluso entonces tienes un problema. Cuando la ayuda() es llamado para encontrar la cadena de documentación, se llama a la clase, no es el caso, por lo que este tipo de cosas:
class ToolWrapper(object):
def __init__(self, tool):
self.tool = tool
self.__name__ = tool.name
def _get_doc(self):
return compile_docstring(self.tool)
__doc__ = property(_get_doc)
def __call__(self, *args):
validate_args(args)
return execute_tool(tool, args)
no funcionará, ya que las propiedades son ejemplo, los atributos no clase. Puede hacer que el trabajo de la propiedad doc teniéndolo en una metaclase, en lugar de la propia clase
for tool in find_tools():
# Build a custom meta-class to provide __doc__.
class _ToolMetaclass(type):
def _get_doc(self):
return create_docstring(tool)
__doc__ = property(_get_doc)
# Build a callable class to wrap the tool.
class _ToolWrapper(object):
__metaclass__ = _ToolMetaclass
def _get_doc(self):
return create_docstring(tool)
__doc__ = property(_get_doc)
def __call__(self, *args):
validate_args(tool, args)
execute_tool(tool, args)
# Add the tool to the module.
setattr(module, tool.name, _ToolWrapper())
Ahora usted puede hacer
help(my_tool_name)
y obtener la cadena de documentación personalizada o
my_tool_name.__doc__
por lo mismo. La propiedad __doc__
se encuentra en la clase _ToolWrapper
que se necesita para atrapar el último caso.
Dudo que esto sea posible ya que ni siquiera se puede subclasificar el tipo de función, sin mencionar de alguna manera hacer que 'def' produzca objetos de su propio tipo. – doublep
Quiero hacer esto sobre la marcha porque dentro del paquete de análisis se pueden establecer valores de parámetros para diferentes herramientas y estos parámetros se recuerdan. Quiero que la función docstring presente las configuraciones de parámetros actuales para esa herramienta. Por lo tanto, cuando solicite 'help (wrapped_tool)', debe consultar el paquete de análisis sobre la marcha y crear la documentación en ese momento. –