当前位置: 首页 > 面试题库 >

动态函数文档字符串

邵绪
2023-03-14
问题内容

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

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


问题答案:

您无法以自己想做的方式去做自己想做的事情。

从您的描述看来,您可以执行以下操作:

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__吗?

假设有,您必须将函数包装在一个类中,然后使用它__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)

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

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类中是需要捕获后一种情况的。



 类似资料:
  • 我希望将动态字段存储到文档中,但每个文档可以有不同的字段。 例如: 如果我运行上述程序,mongodb文档如下所示。 但我想要的是字段名称应该是“field1”而不是这样的“df”。 这只是一个示例代码,所以我知道df值是什么,但实际上我不知道df值是什么。那么在存储时动态命名字段的方法是什么? 在Mongoengine中有一个类似的使用key作为值的问题,但是解决方案建议使用DictField(

  • 问题内容: 获取XML文档()的String表示的最简单方法是什么?那就是所有节点都将在一行上。 例如,从 (这只是一个树表示形式,在我的代码中它是一个对象,因此我不能将其视为字符串) 至 谢谢! 问题答案: 假设您的实例是:

  • 这些函数在字符数组类(numpy.char)中定义。 较旧的 Numarray 包包含chararray类。 numpy.char类中的上述函数在执行向量化字符串操作时非常有用。 函数执行按元素的字符串连接。 输出如下: 连接两个字符串: ['hello xyz'] 连接示例: ['hello abc' 'hi xyz'] numpy.char.multiply() 这个函数执行多重连接。 imp

  • 字符串函数简介 字符串函数主要用于字符串的转码、替换、格式化等方面,可以帮助我们快速简便的处理字符串。 3.1 escape 函数 函数用途: 将URL编码应用于在输入字符串中找到的特殊字符。 tips: 以下这些字符不会参与编码:, , / , ? , @ , & , + , ' , ~ , ! , $ 常见的编码字符: <space> , # , ^ , ( , ) , { , } , | ,

  • Vim有许多内置(built-in)函数来操作字符串。本章中我们将介绍一些最为重要的字符串函数。 长度 第一个介绍的函数是strlen。执行下面的命令: :::vim :echom strlen("foo") Vim显示3,也即"foo"的长度。现在尝试下面的命令: :::vim :echom len("foo") Vim再一次显示3。对于字符串,len和strlen有同样的效果。在本书稍后的

  • 问题内容: {用户名:’我’,公司:{“您的公司”:{…}} 我想在用户记录(用户集合)中插入公司,以便: {username:’me’,companies:{“ yourcompany”:{…},“ mycompany”:{…}} 但是这个名字是动态的。 为此。.{username:’me’,companies:{“ yourcompany”:{…},“ companyid”:{…}} 我该怎么