gpt4 book ai didi

python - 动态函数文档字符串

转载 作者:太空狗 更新时间:2023-10-29 18:29:14 25 4
gpt4 key购买 nike

我想编写一个具有动态创建的文档字符串的 python 函数。本质上,对于函数 func(),我希望 func.__doc__ 成为一个描述符,调用自定义 __get__ 函数根据请求创建文档字符串。然后 help(func) 应该返回动态生成的文档字符串。

这里的上下文是在现有的分析包中编写一个python包,将大量的命令行工具包装起来。每个工具都变成一个类似命名的模块函数(通过函数工厂创建并插入到模块命名空间中),函数文档和接口(interface)参数通过分析包动态生成。

最佳答案

您无法按照自己的方式做您想做的事。

从你的描述看来你可以做这样的事情:

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)

即创建函数时预先动态创建文档字符串。从一次调用 __doc__ 到下一次调用,docstring 必须是动态的,这就是原因吗?

假设有,您必须将您的函数包装在一个类中,使用 __call__ 来触发操作。

但即便如此,您还是遇到了问题。当调用 help() 来查找文档字符串时,它是在类上调用的,而不是在实例上调用的,所以这种事情:

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)

不会工作,因为属性是实例,而不是类属性。您可以通过将其放在元类而不是类本身上来使 doc 属性起作用

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())

现在你可以做

help(my_tool_name)

并获取自定义文档字符串,或者

my_tool_name.__doc__

同样的事情。 __doc__ 属性位于 _ToolWrapper 类中,需要捕获后一种情况。

关于python - 动态函数文档字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2693883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com