Python 动态帮助和自动完成生成

2023-11-29

我想要的几乎都有了...

这个动态对象封装了一个带有动态文档字符串生成的通用函数调用:

def add_docs(tool):  
    def desc(func):  
        func.__doc__ = "Showing help for %s()" % tool
        return func
    return desc

class Dynamic(object):
    def __getattr__(self, value):
        @add_docs(value)
        def mutable_f(*args, **kwargs):
            print "Calling:", value
            print "With arguments:", args, kwargs

        return mutable_f

它按预期工作:

>>> Dynamic().test(1, input='file')
Calling: test
With arguments: (1,) {'input': 'file'}
>>> Dynamic().test.__doc__
'Showing help for test()'

唯一的两个问题是帮助显示mutable_f签名

>>> help(Dynamic().test)
Help on function mutable_f in module __main__:

mutable_f(*args, **kwargs)
    Showing help for test()
(END)

而且没有自动完成功能(我可以即时获取有效函数的列表,并将其缓存,因为该操作的成本很高)

我认为第一个是无法解决的,但第二个我不太确定。 有想法吗?


自动完成最常使用的输出dir()功能,可以挂钩。只需实施一个__dir__() method:

def __dir__(self):
    res = dir(type(self)) + list(self.__dict__.keys())
    res.extend(['dynamic1', 'dynamic2'])
    return res

至于在匹配函数签名的同时包装函数,您需要基于该签名构建一个外观。我有Zope 安全功能正是这样做的:

import inspect
import functools


class _Default(object):
    def __init__(self, repr):
        self._repr = repr
    def __repr__(self):
        return self._repr


def _buildFacade(name, spec, docstring):
    """Build a facade function, matching the decorated method in signature.

    Note that defaults are replaced by instances of _Default, and _curried
    will reconstruct these to preserve mutable defaults.

    """
    args = inspect.formatargspec(
        formatvalue=lambda v: '=_Default({0!r})'.format(repr(v)), *spec)
    callargs = inspect.formatargspec(formatvalue=lambda v: '', *spec)
    return 'def {0}{1}:\n    """{2}"""\n    return _curried{3}'.format(
        name, args, docstring, callargs)


def add_docs(tool):
    spec = inspect.getargspec(tool)
    args, defaults = spec[0], spec[3]

    arglen = len(args)
    if defaults is not None:
        defaults = zip(args[arglen - len(defaults):], defaults)
        arglen -= len(defaults)

    def _curried(*args, **kw):
        # Reconstruct keyword arguments
        if defaults is not None:
            args, kwparams = args[:arglen], args[arglen:]
            for positional, (key, default) in zip(kwparams, defaults):
                if isinstance(positional, _Default):
                    kw[key] = default
                else:
                    kw[key] = positional

        return tool(*args, **kw)

    name = tool.__name__
    doc = 'Showing help for {0}()'.format(name)
    facade_globs = dict(_curried=_curried, _Default=_Default)
    exec _buildFacade(name, spec, doc) in facade_globs

    wrapped = facade_globs[name]
    wrapped = functools.update_wrapper(wrapped, tool,
        assigned=filter(lambda w: w != '__doc__', functools.WRAPPER_ASSIGNMENTS))

    return facade_globs[name]

当涉及到方法签名时,这将做正确的事情,almost。您无法在这里绕过可变默认值,并且需要显式处理这些默认值以保留它们。

一个小演示:

>>> def foo(bar, spam='eggs', foobarred={}):
...     foobarred[bar] = spam
...     print foobarred
... 
>>> documented = add_docs(foo)
>>> help(documented)
Help on function foo:

foo(bar, spam='eggs', foobarred={})
    Showing help for foo()

>>> documented('monty', 'python')
{'monty': 'python'}
>>> documented('Eric', 'Idle')
{'Eric': 'Idle', 'monty': 'python'}

整体_Defaultdance 需要保留可变的默认值,虽然这通常是一个坏主意,但确实需要继续按最初的预期工作。建成的立面将look就像原来的一样,并且会像原来一样,但可变的继续存在于“正确”的位置。

请注意,外观会更新以尽可能接近原始外观;通过使用functools.update_wrapper各种元数据都从原始数据复制到外观,但我们小心地排除了__doc__字符串,因为我们的外观显式地使用它自己的文档字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 动态帮助和自动完成生成 的相关文章

随机推荐

  • 如何在QTableWidget中显示点击QPushButton的行

    我想删除行QPushButton被点击怎么可能我认为使用插槽是合理的 但如何做到这一点不知道 如果您有任何想法如何获取一行选定的按钮请分享 谢谢 这是我的桌子 这是我向 QTableWidget 添加行的代码 MainWindow Main
  • 使用本地图像在Windows Phone 8.1的webview中显示

    我在 Windows Phone 8 1 中创建了混合应用程序 我的一个页面使用了 webview 控件 它上面有一个 img 元素 我有一个小图像作为我的应用程序构建的一部分 复制到输出目录 设置为 始终复制 我已按照此页面的说明进行操作
  • 什么是软件框架? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 有人可以解释一下什么是软件框架吗 为什么我们需要一个框架 框架如何使编程变得更容易 我很
  • php 中 at-sign 的有效用例

    at 符号用于隐藏错误消息 据我所知 绝对没有使用它的用例或借口 您可以通过更改 php ini 设置来隐藏生产中的错误 同时仍将错误输出到日志文件 符号使其他程序员很难确定问题出在哪里 当您开发时 错误消息是您的朋友 快速发现错误并修复它
  • 需要列出 SQL Server 数据库中的所有触发器以及表名称和表架构

    我需要列出 SQL Server 数据库中的所有触发器以及表名称和表架构 我就快到了 SELECT trigger name name trigger owner USER NAME uid table schema table name
  • 有什么办法可以拯救脏画布吗?

    我正在使用 HTML5 画布制作视频屏幕截图 视频托管在其他地方 除了 toDataURL 之外一切正常 因为画布很脏 所以 我想知道 有什么办法可以将这个画布图像保存在计算机上吗 我认为答案是否定的 但希望有一些黑客来完成这件事 除了将视
  • Hangfire 激活器未处理

    我遇到了 Hangfire 无法在 NET 5 上的 WebApi 中处理它实例的对象的问题 这是我在 ConfigureServices 中的配置 非常标准 顺便说一句 services AddScoped
  • Slim 框架/公共文件夹重定向

    我正在使用 Slim Framework v3 我已经设置了 API 如果我访问它可以顺利工作http localhost 8080 slimapp public 我有默认的目录结构 我的示例 API 端点是http localhost 8
  • 为什么“Range(...).End(xlDown).Row”返回 1048576?

    我想在 VBA 的 for 循环中复制一些值 因此我通过以下方式计算限制 For iCounter 1 To Range End xlDown Row Range Row 1 Sadly Range End xlDown Row回报1048
  • ReadFile() 说失败,但错误代码是 ERROR_SUCCESS

    我在用着ReadFile 在 Windows 上从串行端口读取数据 这段代码在某个时间点工作得很好 但现在失败了 我正在尝试找出问题的根源 所以我怀疑这是串行配置或超时的问题 因为这些都没有改变 ReadFile 返回 false 表明发生
  • 无法删除 JSESSIONID cookie

    我正在使用带有 HttpServletRequest 和响应的 Spring 控制器来删除 cookie 当我需要删除 cookie 时 我有以下代码 Cookie allCookies request getCookies for int
  • Android 4.3 裁剪图库 resultCode 取消

    我的 Galaxy Nexus 现在在 Android 4 3 上运行 允许我使用这个新版本测试我的应用程序 除了裁剪之外 一切似乎都很好 我有一个应用程序 它使用相机拍照 然后通过图库应用程序裁剪图像 我还可以从图库中选择一张图片并进行裁
  • 这是合法的 C++ 代码吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 代码来自here 鉴于在 C 中你可以使用 C 库 你会说下面的代码是合法的 C 代码吗
  • 在给定标签处将 XML 文件拆分为多个

    我想将一个 XML 文件拆分为多个文件 我的工作站仅限于带有 Xalan 2 7 1 的 Eclipse Mars 我也可以使用Python 但以前从未使用过它
  • 在 asp.net mvc 中显示数据库中的图像

    我有一个包含用户 ID 和图像列的视图 这是我尝试检索图像的方法 但我不断收到一个带有红色 x 的框 而不是实际图像 View td img src alt gt td 控制器 public FileContentResult Displa
  • 在 Linux 下从 Python 编辑 Windows 注册表

    我正在寻找一个Python API 或者我愿意绑定的C API 来在Linux系统中编辑从XP到7的Windows注册表 Windows 目标将是 Linux 下安装的卷 如果不存在 我愿意编写一个库 因此 注册表上的任何文档或内部结构也会
  • 在 Netbeans 中添加新的 Web 服务

    我正在尝试使用 netbeans 在 java 中构建 myspace 应用程序 其中 app 尝试更新我的帐户 好友更新以及所有此类内容 twitter 的 nebeans 网站上有一个类似的教程 但是当我尝试添加 API 地址时Mysp
  • 如何调试通过 UpdateListItems SOAP API 在 SharePoint 中创建列表项时出现的错误?

    我在调试 SharePoint SOAP 调用以创建列表项时遇到了非常困难的情况 我发送的 SOAP 主体是
  • Objective-C 错误“'XYZPerson' 没有可见的 @interface 声明选择器 'saySomething'

    我对 Objective C 确实很陌生 当我练习书本上的练习时 我真的被困在这里了 请帮助我解决这个问题 我已经思考了三个多小时可能导致此错误的原因 我还是没明白 此致 拉杰 提前致谢 main m import
  • Python 动态帮助和自动完成生成

    我想要的几乎都有了 这个动态对象封装了一个带有动态文档字符串生成的通用函数调用 def add docs tool def desc func func doc Showing help for s tool return func ret