python - 使函数在 help() 函数中的参数有省略号

标签 python docstring

如果您键入 help(vars),将生成以下内容:

vars(...)
    vars([object]) -> dictionary

    Without arguments, equivalent to locals().
    With an argument, equivalent to object.__dict__.

当我执行以下操作时:

def func(x, y): pass

help(func)

它显示这个:

func(x, y)

我怎样才能改变它,让它像内置函数 vars() 一样在括号之间显示 ...? (即 func(...))

编辑:有人建议使用文档字符串,但这不会满足我的要求。这是一个例子:

def func(x, y):
    """func(...) -> None"""

help(func)

结果:

func(x, y)
    func(...) -> None

你看,x, y 仍然显示,而不是 ...

最佳答案

你有(至少)两种选择来实现你想要的。

最好的选择是覆盖 __str__ inspect.Signature 的方法类(class)。但是,由于它是用 C 语言编写的,因此它是只读的。

为此,您需要按如下方式扩展该类:

class MySignature(inspect.Signature):
  def __str__(self):
    return '(...)'

然后在定义函数后执行:

func_signature = inspect.signature(func)
func.__signature__ = MySignature(func_signature.parameters.values(), 
                                 return_annotation=func_signature.return_annotation)

然后将为 help(func) 返回以下内容:

Help on function func in module __main__:

func(...)
(END)

使用这种方法 inspect.signature 仍然有效:

In [1]: inspect.signature(func)
Out[1]: <MySignature (...)>

或者,如果您真的不关心能否正确地反省您的函数(可能还有其他一些用例),那么您可以定义函数的 __signature__ 的值。到不是 Signature 的对象实例:

def func(x, y):
    pass

func.__signature__ = object()

help(func)

生成结果:

Help on function func in module __main__:

func(...)
(END)

但是现在inspect.signature(func)会提高TypeError: unexpected object <object object at 0x10182e200> in __signature__ attribute .

注意:最后一个版本很老套,我不推荐它。

有关这两种技术以及签名如何工作的更多信息,请参阅 PEP 0362 .

更新: 对于 python 2.7,您可以执行以下操作(使用模拟框架可能更好):

In [1]: import inspect

In [2]: def myformatargspec(*args, **kwargs):
   ...:     return '(...)'
   ...:

In [3]: def func(x, y):
   ...:     pass
   ...: 

In [6]: inspect.formatargspec = myformatargspec

In [7]: help(func)

Help on function func in module __main__:

func(...)
(END)

关于python - 使函数在 help() 函数中的参数有省略号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35665130/

相关文章:

python - 无法从 ctypes 获取 Fortran 函数输出

python - 如何在 jupyter 中自动生成函数文档字符串

racket - Racket 中的"Docstrings"?

类工厂/选择器的 python rtype 文档字符串/重组文本

python - 在 emacs Python 模式下,如何为文档字符串和代码设置不同的自动填充宽度?

python - 如何记录变量的类型,该变量可以是实现 Python 接口(interface)的任何类型的对象?

python - pwd.getpwnam(username).pw_dir 在 Windows 中的等价物是什么?

python - 跟踪 scala 中方法的执行情况

python 用数字绘制半三角形

Python:解压目录树中选定的文件